00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "clientservercommon.h"
00026 #include "serversideasynch.h"
00027 #include "concreteconnection.h"
00028 #include "Log.h"
00029
00030
00031 RMessage KDummyMessage;
00032
00034
00036
00037 CAsynchBase::CAsynchBase(CConcreteConnection *aConnection)
00038 : CActive(CActive::EPriorityStandard),
00039 iConnection(aConnection),
00040 iMessage(KDummyMessage)
00041 {
00042 CActiveScheduler::Add(this);
00043 }
00044
00045 CAsynchBase::~CAsynchBase()
00046 {
00047 Log::Print(_L("~CAsynchBase()"));
00048
00049
00050 Cancel();
00051
00052
00053 Deque();
00054
00055 Log::Print(_L("~CAsynchBase() exiting.."));
00056 }
00057
00059
00061
00062 CAsynchSend::CAsynchSend(CConcreteConnection *aConnection)
00063 : CAsynchBase(aConnection)
00064 {
00065 }
00066
00067 void CAsynchSend::SendL(TDesC8 *aBuf)
00068 {
00069 Log::Print(_L("CAsynchSend::SendL()"));
00070
00071 iSendBuf = aBuf;
00072
00073 iConnection->GetSocket().Write(*aBuf, iStatus);
00074 SetActive();
00075 }
00076
00077 void CAsynchSend::RunL()
00078 {
00079 Log::Print(_L("CAsynchSend::RunL()"));
00080
00081
00082 delete iSendBuf;
00083 iSendBuf = NULL;
00084 }
00085
00086 TInt CAsynchSend::RunError(TInt aError)
00087 {
00088 Log::Print(_L("CAsynchSend::RunError(): %d"), aError);
00089
00090 iConnection->Close();
00091
00092
00093 delete iSendBuf;
00094 iSendBuf = NULL;
00095
00096 return KErrNone;
00097 }
00098
00099
00100 void CAsynchSend::DoCancel()
00101 {
00102 Log::Print(_L("CAsynchSend::DoCancel()"));
00103
00104 iConnection->GetSocket().CancelSend();
00105
00106
00107 delete iSendBuf;
00108 iSendBuf = NULL;
00109
00110 Log::Print(_L("CAsynchSend::DoCancel() exiting"));
00111 }
00112
00114
00116
00117 CAsynchReceive::CAsynchReceive(CConcreteConnection *aConnection)
00118 : CAsynchBase(aConnection)
00119 {
00120
00121 }
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 void CAsynchReceive::Receive(const RMessage &aMessage)
00138 {
00139 Log::Print(_L("CAsynchReceive::Receive()"));
00140
00141
00142 iMessage = aMessage;
00143
00144
00145
00146 iConnection->GetSocket().Read(iRecvBuf, iStatus);
00147
00148
00149 SetActive();
00150
00151 Log::Print(_L("CAsynchReceive::Receive() exiting.."));
00152 }
00153
00154
00155
00156 void CAsynchReceive::RunL()
00157 {
00158 Log::Print(_L("CAsynchReceive::RunL()"));
00159
00160 TInt status = iStatus.Int();
00161 if( status != KErrNone ) {
00162 Log::Print(_L("CAsynchReceive::RunL(): error (%d)"), status);
00163
00164
00165
00166
00167
00168 iMessage.Complete(status);
00169
00170 return;
00171 }
00172
00173 Log::Print(_L("received %d bytes"), iRecvBuf.Length());
00174
00175
00176 TRAPD(err, iMessage.WriteL(iMessage.Ptr1(), iRecvBuf));
00177 Log::Print(_L("WriteL() returned %d"), err);
00178
00179
00180
00181
00182 iMessage.Complete(err);
00183
00184
00185
00186
00187
00188 Log::Print(_L("CAsynchReceive::RunL() returning.."));
00189 }
00190
00191 TInt CAsynchReceive::RunError(TInt aError)
00192 {
00193 Log::Print(_L("CAsynchReceive::RunError(): %d"), aError);
00194
00195
00196
00197 iMessage.Complete(aError);
00198
00199
00200
00201
00202
00203 return KErrNone;
00204 }
00205
00206
00207 void CAsynchReceive::DoCancel()
00208 {
00209 Log::Print(_L("CAsynchReceive::DoCancel()"));
00210
00211 iConnection->GetSocket().CancelRecv();
00212
00213 Log::Print(_L("completing message.."));
00214
00215
00216 iMessage.Complete(KErrNone);
00217
00218 Log::Print(_L("CAsynchReceive::DoCancel() exiting"));
00219 }
00220
00222
00224
00225 CAsynchListen::CAsynchListen(CConcreteConnection *aConnection)
00226 : CAsynchBase(aConnection)
00227 {
00228 }
00229
00230 CAsynchListen::~CAsynchListen()
00231 {
00232 delete iIncomingSocket;
00233 }
00234
00235
00236 void CAsynchListen::ListenL(const RMessage &aMessage)
00237 {
00238 Log::Print(_L("CAsynchListen::ListenL()"));
00239
00240
00241 iMessage = aMessage;
00242
00243
00244 delete iIncomingSocket;
00245 iIncomingSocket = NULL;
00246
00247
00248 iIncomingSocket = new (ELeave) RSocket();
00249
00250 RSocketServ &sock_serv = iConnection->GetSocketServ();
00251 User::LeaveIfError(iIncomingSocket->Open(sock_serv));
00252
00253
00254 iConnection->GetSocket().Accept(*iIncomingSocket, iStatus);
00255
00256 SetActive();
00257
00258 Log::Print(_L("CAsynchListen::ListenL() returning"));
00259 }
00260
00261
00262
00263 void CAsynchListen::RunL()
00264 {
00265 CConcreteConnection *con = NULL;
00266
00267 TInt status = iStatus.Int();
00268 if( status != KErrNone ) {
00269 Log::Print(_L("CAsynchListen::RunL() error %d"), status);
00270
00271 iMessage.Complete(status);
00272 return;
00273 }
00274
00275 Log::Print(_L("CAsynchListen::RunL()"));
00276
00277
00278 con = CConcreteConnection::NewL(iIncomingSocket, iConnection->GetSession());
00279
00280
00281 iIncomingSocket = NULL;
00282
00283 Log::Print(_L("calling AllocateConnection()"));
00284
00285 TInt id = iConnection->GetSession().AllocateConnection(con);
00286
00287
00288 iMessage.Complete(id);
00289 }
00290
00291
00292 void CAsynchListen::DoCancel()
00293 {
00294 Log::Print(_L("CAsynchListen::DoCancel()"));
00295
00296 iConnection->GetSocket().CancelAccept();
00297
00298
00299
00300 iMessage.Complete(iStatus.Int());
00301
00302 Log::Print(_L("CAsynchListen::DoCancel() exiting"));
00303 }
00304
00305 TInt CAsynchListen::RunError(TInt aError)
00306 {
00307 Log::Print(_L("CAsynchListen::RunError(): %d"), aError);
00308
00309
00310
00311
00312
00313
00314 iMessage.Complete(iStatus.Int());
00315
00316 return KErrNone;
00317 }
00318
00319