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
00026
00027
00028
00029
00030
00031 #include "threadserversession.h"
00032
00033
00034
00038 CThreadServerSession* CThreadServerSession::NewL(CThreadServer& aServer)
00039 {
00040 CThreadServerSession* s = new(ELeave) CThreadServerSession(aServer);
00041 CleanupStack::PushL(s);
00042 s->ConstructL();
00043 CleanupStack::Pop();
00044 return s;
00045 }
00049 CThreadServerSession::CThreadServerSession(CThreadServer& aServer)
00050 :iServer(aServer)
00051 {
00052 }
00053 void CThreadServerSession::ConstructL()
00054 {
00055 }
00059 CThreadServerSession::~CThreadServerSession()
00060 {
00061 delete iAsyncRequestHandler;
00062 iServer.CloseLogicalChannel();
00063 iServer.DecrementRefCount();
00064 }
00069 void CThreadServerSession::CreateL()
00070
00071
00072
00073 {
00074 iServer.IncrementRefCount();
00075
00076 User::LeaveIfError(iServer.LoadDevice());
00077 iAsyncRequestHandler = CAsyncHandler::NewL(iServer);
00078 }
00082 void CThreadServerSession::ServiceL(const RMessage2& aMessage)
00083 {
00084 TInt r = KErrNone;
00085 switch(aMessage.Function())
00086 {
00087 case EThreadServerLoadDeviceDriver:
00088 aMessage.Complete(iServer.LoadDevice());
00089 break;
00090
00091 case EThreadServerOpenDriver:
00092 aMessage.Complete(iServer.OpenLogicalChannel());
00093 break;
00094
00095 case EThreadServerSendData:
00096 r = iAsyncRequestHandler->ProcessRequest(aMessage);
00097 if (r!=KErrNone)
00098 aMessage.Complete(r);
00099 break;
00100
00101 case EThreadServerSendDataCancel:
00102 iAsyncRequestHandler->Cancel();
00103 aMessage.Complete(KErrNone);
00104 break;
00105
00106 case EThreadServerUnloadDeviceDriver:
00107 aMessage.Complete(iServer.UnloadDevice());
00108 break;
00109
00110 default:
00111 User::Leave(KErrNotSupported);
00112 break;
00113 }
00114
00115 }
00116
00120 CThreadServerSession::CAsyncHandler* CThreadServerSession::CAsyncHandler::NewL(CThreadServer& aServer)
00121 {
00122 CAsyncHandler* self = new(ELeave) CAsyncHandler(aServer);
00123 CleanupStack::PushL(self);
00124 self ->ConstructL();
00125 CleanupStack::Pop();
00126 return self;
00127 }
00131 CThreadServerSession::CAsyncHandler::~CAsyncHandler()
00132 {
00133 Cancel();
00134 iMessageArray.Close();
00135 }
00139 void CThreadServerSession::CAsyncHandler::RunL()
00140 {
00141
00142 Complete(iStatus.Int());
00143
00144
00145 ExecuteFirstRequestInArray();
00146 }
00150 void CThreadServerSession::CAsyncHandler::DoCancel()
00151 {
00152 iServer.CancelSendData();
00153
00154 Complete(iStatus.Int());
00155 }
00159 CThreadServerSession::CAsyncHandler::CAsyncHandler(CThreadServer& aServer)
00160 :CActive(EPriorityStandard), iServer(aServer)
00161 {
00162 CActiveScheduler::Add(this);
00163 }
00164
00165 void CThreadServerSession::CAsyncHandler::ConstructL()
00166 {
00167 }
00173 TInt CThreadServerSession::CAsyncHandler::ProcessRequest(const RMessage2& aMessage)
00174 {
00175 TInt ret;
00176
00177 TMessage newMessage;
00178 newMessage.Message() = aMessage;
00179 ret= iMessageArray.Append(newMessage);
00180 if (ret != KErrNone)
00181 return ret;
00182
00183
00184 if (iMessageArray.Count() == 1)
00185 ret = ExecuteFirstRequestInArray();
00186
00187 return ret;
00188 }
00193 TInt CThreadServerSession::CAsyncHandler::ExecuteFirstRequestInArray()
00194 {
00195 TInt r = KErrNone;
00196 if (iMessageArray.Count() != 0)
00197 {
00198 const RMessage2& message = iMessageArray[0].Message();
00199 switch (message.Function())
00200 {
00201 case EThreadServerSendData:
00202 {
00203 TBuf8<KThreadServerMaxMessageLen> sendObject;
00204 r= message.Read(0, sendObject);
00205 if (r == KErrNone)
00206 {
00207 r = iServer.SendDataToDevice(iStatus, sendObject);
00208 if (r==KErrNone)
00209 SetActive();
00210 }
00211 }
00212 break;
00213
00214 default:
00215 break;
00216 }
00217 }
00218 return r;
00219 }
00223 void CThreadServerSession::CAsyncHandler::Complete(TInt aResult)
00224 {
00225 iMessageArray[0].Message().Complete(aResult);
00226 iMessageArray.Remove(0);
00227 iServer.UpdateDriverState(CThreadServer::ELogicalChannelOpened);
00228 }
00229
00230
00234 const RMessage2& CThreadServerSession::CAsyncHandler::TMessage::Message() const
00235 {
00236 return iMessage;
00237 }
00238 RMessage2& CThreadServerSession::CAsyncHandler::TMessage::Message()
00239 {
00240 return iMessage;
00241 }
00242
00243