00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "ClientServer.h"
00021 #include "SimpleServer.h"
00022 #include <e32svr.h>
00023 #include <e32uid.h>
00024
00025
00026
00027
00028
00029
00040 CCountServServer::CCountServServer(CActive::TPriority aActiveObjectPriority)
00041 : CServer2(aActiveObjectPriority)
00042 {
00043 }
00044
00045
00049 CSession2* CCountServServer::NewSessionL(const TVersion& aVersion,const RMessage2& ) const
00050 {
00051
00052 TVersion v(KCountServMajorVersionNumber,KCountServMinorVersionNumber,KCountServBuildVersionNumber);
00053 if (!User::QueryVersionSupported(v,aVersion))
00054 User::Leave(KErrNotSupported);
00055
00056
00057
00058
00059
00060
00061
00062
00063 return new (ELeave) CCountServSession;
00064 }
00065
00066
00070 void CCountServServer::PanicServer(TCountServPanic aPanic)
00071 {
00072 _LIT(KTxtServerPanic,"Count server panic");
00073 User::Panic(KTxtServerPanic,aPanic);
00074 }
00075
00076
00077
00078
00079
00080
00081
00085 CCountServSession::CCountServSession()
00086 {
00087 }
00088
00092 void CCountServSession::ServiceL(const RMessage2& aMessage)
00093 {
00094 TRAPD(err,DispatchMessageL(aMessage));
00095 aMessage.Complete(err);
00096 }
00097
00104 void CCountServSession::DispatchMessageL(const RMessage2& aMessage)
00105 {
00106 switch (aMessage.Function())
00107 {
00108 case ECountServSetFromString:
00109 SetFromStringL(aMessage);
00110 return;
00111 case ECountServIncrease:
00112 Increase();
00113 return;
00114 case ECountServIncreaseBy:
00115 IncreaseBy(aMessage);
00116 return;
00117 case ECountServDecrease:
00118 Decrease();
00119 return;
00120 case ECountServDecreaseBy:
00121 DecreaseBy(aMessage);
00122 return;
00123 case ECountServReset:
00124 Reset();
00125 return;
00126 case ECountServValue:
00127 CounterValueL(aMessage);
00128 return;
00129
00130
00131
00132 case ECountServUnsupportedRequest:
00133 User::Leave(KErrNotSupported);
00134
00135
00136
00137
00138 default:
00139 PanicClient(aMessage,EBadRequest);
00140 return;
00141 }
00142 }
00143
00149 void CCountServSession::SetFromStringL(const RMessage2& aMessage)
00150 {
00151
00152
00153 TInt deslen = aMessage.GetDesLength(0);
00154
00155
00156 RBuf buffer;
00157
00158
00159 buffer.CreateL(deslen);
00160
00161
00162 buffer.CleanupClosePushL();
00163
00164
00165 aMessage.ReadL(0,buffer,0);
00166
00167
00168 if (buffer.Length() == 0)
00169 {
00170 User::Leave(ENonNumericString);
00171 }
00172
00173 TLex16 lexer;
00174
00175 lexer.Assign(buffer);
00176 while (!lexer.Eos())
00177 {
00178 TChar thechar;
00179
00180 thechar = lexer.Peek();
00181 if (!thechar.IsDigit())
00182 {
00183 User::Leave(ENonNumericString);
00184 }
00185 lexer.Inc();
00186 }
00187
00188
00189 lexer.Assign(buffer);
00190 if (lexer.Val(iCount))
00191 {
00192 User::Leave(ENonNumericString);
00193 }
00194
00195
00196 CleanupStack::PopAndDestroy();
00197 }
00198
00199
00203 void CCountServSession::Increase()
00204 {
00205 iCount++;
00206 }
00207
00208
00212 void CCountServSession::IncreaseBy(const RMessage2& aMessage)
00213 {
00214 iCount = iCount + aMessage.Int0();
00215 }
00216
00220 void CCountServSession::Decrease()
00221 {
00222 iCount--;
00223 }
00224
00225
00229 void CCountServSession::DecreaseBy(const RMessage2& aMessage)
00230 {
00231 iCount = iCount - aMessage.Int0();
00232 }
00233
00234
00238 void CCountServSession::Reset()
00239 {
00240 iCount=0;
00241 }
00242
00243
00248 void CCountServSession::CounterValueL(const RMessage2& aMessage)
00249 {
00250 TPckgBuf<TInt> p(iCount);
00251 aMessage.WriteL(0,p);
00252 }
00253
00254
00258 void CCountServSession::PanicClient(const RMessage2& aMessage,TInt aPanic) const
00259 {
00260 _LIT(KTxtServer,"CountServ server");
00261 aMessage.Panic(KTxtServer,aPanic);
00262 }
00263
00264
00265
00266
00267
00268
00269
00270
00271 GLDEF_C TInt CCountServServer::ThreadFunction(TAny* )
00272 {
00273
00274 CTrapCleanup* cleanup=CTrapCleanup::New();
00275 if (cleanup == NULL)
00276 {
00277 CCountServServer::PanicServer(ECreateTrapCleanup);
00278 }
00279
00280
00281 CActiveScheduler *pA=new CActiveScheduler;
00282 __ASSERT_ALWAYS(pA!=NULL,CCountServServer::PanicServer(EMainSchedulerError));
00283 CCountServServer *pS=new CCountServServer(EPriorityStandard);
00284 __ASSERT_ALWAYS(pS!=NULL,CCountServServer::PanicServer(ESvrCreateServer));
00285
00286
00287 CActiveScheduler::Install(pA);
00288
00289
00290 TInt err = pS->Start(KCountServerName);
00291 if (err != KErrNone)
00292 {
00293 CCountServServer::PanicServer(ESvrStartServer);
00294 }
00295
00296
00297
00298 RThread::Rendezvous(KErrNone);
00299
00300
00301 CActiveScheduler::Start();
00302
00303
00304 delete pS;
00305 delete pA;
00306 delete cleanup;
00307
00308
00309 return(KErrNone);
00310 }
00311
00312
00320 EXPORT_C TInt StartThread(RThread& aServerThread)
00321 {
00322 TInt res=KErrNone;
00323
00324
00325 TFindServer findCountServer(KCountServerName);
00326 TFullName name;
00327
00328
00329 if (findCountServer.Next(name)!=KErrNone)
00330 {
00331
00332 res=aServerThread.Create(KCountServerName,
00333 CCountServServer::ThreadFunction,
00334 KDefaultStackSize,
00335 KDefaultHeapSize,
00336 KDefaultHeapSize,
00337 NULL
00338 );
00339
00340
00341
00342 if (res==KErrNone)
00343 {
00344 TRequestStatus rendezvousStatus;
00345
00346 aServerThread.SetPriority(EPriorityNormal);
00347 aServerThread.Rendezvous(rendezvousStatus);
00348 aServerThread.Resume();
00349 User::WaitForRequest(rendezvousStatus);
00350 }
00351
00352
00353 else
00354 {
00355 aServerThread.Close();
00356 }
00357 }
00358 return res;
00359 }