00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "processserversession.h"
00017
00018
00019
00023 CProcessServerSession* CProcessServerSession::NewL(CProcessServer& aServer)
00024 {
00025 CProcessServerSession* s = new(ELeave) CProcessServerSession(aServer);
00026 CleanupStack::PushL(s);
00027 s->ConstructL();
00028 CleanupStack::Pop();
00029 return s;
00030 }
00034 CProcessServerSession::CProcessServerSession(CProcessServer& aServer)
00035 :iServer(aServer)
00036 {
00037
00038 }
00039
00040 void CProcessServerSession::ConstructL()
00041 {
00042 }
00046 CProcessServerSession::~CProcessServerSession()
00047 {
00048 delete iAsyncRequestHandler;
00049 iServer.CloseLogicalChannel();
00050 iServer.DecrementRefCount();
00051 }
00056 void CProcessServerSession::CreateL()
00057
00058
00059
00060 {
00061 iServer.IncrementRefCount();
00062
00063 User::LeaveIfError(iServer.LoadDevice());
00064 iAsyncRequestHandler = CAsyncHandler::NewL(iServer);
00065 }
00069 void CProcessServerSession::ServiceL(const RMessage2& aMessage)
00070 {
00071 TInt r = KErrNone;
00072 switch(aMessage.Function())
00073 {
00074 case ELoadDeviceDriver:
00075 aMessage.Complete(iServer.LoadDevice());
00076 break;
00077
00078 case EOpenDriver:
00079 aMessage.Complete(iServer.OpenLogicalChannel());
00080 break;
00081
00082 case EDummyLDDSendData:
00083 r = iAsyncRequestHandler->ProcessRequest(aMessage);
00084 if (r!=KErrNone)
00085 aMessage.Complete(r);
00086 break;
00087
00088 case EDummyLDDSendDataCancel:
00089 iAsyncRequestHandler->Cancel();
00090 aMessage.Complete(KErrNone);
00091 break;
00092
00093 case EUnloadDeviceDriver:
00094 aMessage.Complete(iServer.UnloadDevice());
00095 break;
00096
00097 default:
00098 User::Leave(KErrNotSupported);
00099 break;
00100 }
00101
00102 }
00103
00104
00105
00106
00110 CProcessServerSession::CAsyncHandler* CProcessServerSession::CAsyncHandler::NewL(CProcessServer& aServer)
00111 {
00112 CAsyncHandler* self = new(ELeave) CAsyncHandler(aServer);
00113 CleanupStack::PushL(self);
00114 self ->ConstructL();
00115 CleanupStack::Pop();
00116 return self;
00117 }
00121 CProcessServerSession::CAsyncHandler::~CAsyncHandler()
00122 {
00123 Cancel();
00124 iMessageArray.Close();
00125 }
00129 void CProcessServerSession::CAsyncHandler::RunL()
00130 {
00131
00132 Complete(iStatus.Int());
00133
00134
00135 ExecuteFirstRequestInArray();
00136 }
00140 void CProcessServerSession::CAsyncHandler::DoCancel()
00141 {
00142 iServer.CancelSendData();
00143
00144 Complete(iStatus.Int());
00145 }
00149 CProcessServerSession::CAsyncHandler::CAsyncHandler(CProcessServer& aServer)
00150 :CActive(EPriorityStandard), iServer(aServer)
00151 {
00152 CActiveScheduler::Add(this);
00153 }
00154
00155 void CProcessServerSession::CAsyncHandler::ConstructL()
00156 {
00157
00158 }
00164 TInt CProcessServerSession::CAsyncHandler::ProcessRequest(const RMessage2& aMessage)
00165 {
00166 TInt ret;
00167
00168 TMessage newMessage;
00169 newMessage.Message() = aMessage;
00170 ret= iMessageArray.Append(newMessage);
00171 if (ret != KErrNone)
00172 return ret;
00173
00174
00175 if (iMessageArray.Count() == 1)
00176 ret= ExecuteFirstRequestInArray();
00177
00178 return ret;
00179 }
00184 TInt CProcessServerSession::CAsyncHandler::ExecuteFirstRequestInArray()
00185 {
00186 TInt r = KErrNone;
00187 if (iMessageArray.Count() != 0)
00188 {
00189 const RMessage2& message = iMessageArray[0].Message();
00190 switch (message.Function())
00191 {
00192 case EDummyLDDSendData:
00193 {
00194 TBuf8<KMaxMessageLen> sendObject;
00195 r= message.Read(0, sendObject);
00196 if (r == KErrNone)
00197 {
00198 r = iServer.SendDataToDevice(iStatus, sendObject);
00199 if (r==KErrNone)
00200 SetActive();
00201 }
00202 }
00203 break;
00204
00205 default:
00206 break;
00207 }
00208
00209 }
00210 return r;
00211 }
00215 void CProcessServerSession::CAsyncHandler::Complete(TInt aResult)
00216 {
00217 iMessageArray[0].Message().Complete(aResult);
00218 iMessageArray.Remove(0);
00219 iServer.UpdateDriverState(CProcessServer::ELogicalChannelOpened);
00220 }
00221
00222
00226 const RMessage2& CProcessServerSession::CAsyncHandler::TMessage::Message() const
00227 {
00228 return iMessage;
00229 }
00230
00231 RMessage2& CProcessServerSession::CAsyncHandler::TMessage::Message()
00232 {
00233 return iMessage;
00234 }
00235
00236