diff -r 712b4ffd76bb -r 43351a4f2da3 eapol/eapol_framework/eapol_symbian/eap_server/src/EapServerProcessHandler.cpp --- a/eapol/eapol_framework/eapol_symbian/eap_server/src/EapServerProcessHandler.cpp Fri Sep 03 09:22:44 2010 +0300 +++ b/eapol/eapol_framework/eapol_symbian/eap_server/src/EapServerProcessHandler.cpp Thu Sep 16 13:07:04 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 41 % +* %version: 50 % */ #include "EapServerProcessHandler.h" @@ -36,14 +36,15 @@ , iEapCore(0) , iEapPlugin(0) , iEapSettings(0) -#if defined (USE_WAPI_CORE) , iWapiCore(0) , iWapiSettings(0) -#endif #if defined(USE_FAST_EAP_TYPE) , iPacStore(0) #endif //#if defined(USE_FAST_EAP_TYPE) -, iEapMessageQueue(0) +, iEapSendMessageQueue(0) +, iEapProcessMessageQueue(0) +, iProcessMessage(0) +, iHandlerState(EapServerProcessHandlerState_None) { EAP_TRACE_DEBUG( iTools, @@ -64,11 +65,18 @@ this)); EAP_TRACE_RETURN_STRING(iTools, "returns: CEapServerProcessHandler::~CEapServerProcessHandler()"); - if(IsActive()) - { - Cancel(); - } - + if (iClient) + { + TInt error = iClient->CancelReadyHandler(this); + if (error != KErrNone) + { + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("ERROR: CEapServerProcessHandler::~CEapServerProcessHandler(): iClient->CancelReadyHandler() failed, error=%d\n"), + error)); + } + } delete iEapCore; iEapCore = 0; @@ -78,21 +86,27 @@ delete iEapSettings; iEapSettings = 0; -#if defined (USE_WAPI_CORE) delete iWapiCore; iWapiCore = 0; delete iWapiSettings; iWapiSettings = 0; -#endif #if defined(USE_FAST_EAP_TYPE) delete iPacStore; iPacStore = 0; #endif //#if defined(USE_FAST_EAP_TYPE) - delete iEapMessageQueue; - iEapMessageQueue = 0; + delete iEapSendMessageQueue; + iEapSendMessageQueue = 0; + + delete iEapProcessMessageQueue; + iEapProcessMessageQueue = 0; + + if(IsActive()) + { + Cancel(); + } } //---------------------------------------------------------------------------- @@ -114,24 +128,36 @@ EAP_TRACE_RETURN_STRING(tools, "returns: CEapServerProcessHandler::ConstructL()"); iClient = client; + iTools = tools; - iEapMessageQueue = new(ELeave) EapMessageQueue(iTools); + iEapSendMessageQueue = new(ELeave) EapMessageQueue(iTools); + + iEapProcessMessageQueue = new(ELeave) EapMessageQueue(iTools); } //---------------------------------------------------------------------------- eap_status_e CEapServerProcessHandler::SendData(const void * const data, const u32_t length, TEapRequests message) { + EAP_TRACE_DEBUG( iTools, TRACE_FLAGS_DEFAULT, - (EAPL("CEapServerProcessHandler::SendData(): this=0x%08x\n"), - this)); + (EAPL("CEapServerProcessHandler::SendData(): this=0x%08x, iProcessMessage=0x%08x, send message=%d=%s\n"), + this, + iProcessMessage, + message, + EapServerStrings::GetEapRequestsString(message))); + EAP_TRACE_RETURN_STRING(iTools, "returns: CEapServerProcessHandler::SendData()"); eap_status_e status(eap_status_ok); + // First message handled, remove the message. + iEapProcessMessageQueue->DeleteFirstMessage(iProcessMessage); + iProcessMessage = 0; + SaveMessage(message, data, length); return status; @@ -157,25 +183,48 @@ data, length)); - EAP_TRACE_DEBUG( - iTools, - TRACE_FLAGS_DEFAULT, - (EAPL("CEapServerProcessHandler::SaveMessage(): calls iEapMessageQueue->AddMessage()\n"))); + if (message == EEapCoreSendData || message == EEapPluginSendData || message == EEapSettingsSendData || message == EEapPacStoreSendData || message == EWapiCoreSendData) + { + TInt error = iEapSendMessageQueue->AddMessage(message, data, length); - TInt error = iEapMessageQueue->AddMessage(message, data, length); + if (error != KErrNone) + { + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("ERROR: CEapServerProcessHandler::SaveMessage(): failed = %d\n"), + error)); + return; + } - if (error != KErrNone) + Activate(EapServerProcessHandlerState_Send); + } + else { - EAP_TRACE_DEBUG( - iTools, - TRACE_FLAGS_DEFAULT, - (EAPL("ERROR: CEapServerProcessHandler::SaveMessage(): failed = %d\n"), - error)); - return; + TInt error = iEapProcessMessageQueue->AddMessage(message, data, length); + + if (error != KErrNone) + { + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("ERROR: CEapServerProcessHandler::SaveMessage(): failed = %d\n"), + error)); + return; + } + + error = iClient->AddReadyHandler(this); + if (error != KErrNone) + { + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("ERROR: CEapServerProcessHandler::SaveMessage(): iClient->AddReadyHandler(this) failed = %d\n"), + error)); + return; + } } - Activate(); - EAP_TRACE_DEBUG( iTools, TRACE_FLAGS_DEFAULT, @@ -187,13 +236,15 @@ //---------------------------------------------------------------------------- -void CEapServerProcessHandler::Activate() +void CEapServerProcessHandler::Activate(const CEapServerProcessHandlerState aState) { EAP_TRACE_DEBUG( iTools, TRACE_FLAGS_DEFAULT, - (EAPL("CEapServerProcessHandler::Activate(): this=0x%08x\n"), - this)); + (EAPL("CEapServerProcessHandler::Activate(): this=0x%08x, iHandlerState=%d, aState=%d\n"), + this, + iHandlerState, + aState)); EAP_TRACE_RETURN_STRING(iTools, "returns: CEapServerProcessHandler::Activate()"); if(!IsActive()) @@ -203,6 +254,8 @@ TRACE_FLAGS_DEFAULT, (EAPL("CEapServerProcessHandler::Activate(): calls User::RequestComplete()\n"))); + iHandlerState = aState; + TRequestStatus* status = &iStatus; User::RequestComplete(status, KErrNone); @@ -236,10 +289,50 @@ EAP_TRACE_DEBUG( iTools, TRACE_FLAGS_DEFAULT, - (EAPL("CEapServerProcessHandler::RunL(): this=0x%08x\n"), - this)); + (EAPL("CEapServerProcessHandler::RunL(): this=0x%08x, iProcessMessage=0x%08x, iHandlerState=%d\n"), + this, + iProcessMessage, + iHandlerState)); + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + const EapMessageBuffer * aSendMessage = 0; + + // The send-message queue have priority over the process-message queue. + EapMessageBuffer * message = iEapSendMessageQueue->GetFirstMessage(); + + if (message != 0) + { + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapServerProcessHandler::RunL(): Send-message=0x%08x\n"), + this, + message)); - EapMessageBuffer * const message = iEapMessageQueue->GetFirstMessage(); + aSendMessage = message; + } + + // When send-operation is only allowed the process-message queue is NOT read. + if (message == 0 + && iHandlerState != EapServerProcessHandlerState_Send + ) + { + message = iEapProcessMessageQueue->GetFirstMessage(); + + EAP_ASSERT_TOOLS(iTools, iProcessMessage == 0); + + iProcessMessage = message; + + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapServerProcessHandler::RunL(): Process-message=0x%08x\n"), + this, + message)); + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (message != 0) { @@ -254,6 +347,8 @@ eap_status_e status(eap_status_ok); + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + switch (message->GetRequestType()) { @@ -487,41 +582,47 @@ break; -#if defined (USE_WAPI_CORE) - case EWapiCoreIfNew: - + case EWapiCoreIfNew: + { EAP_TRACE_DEBUG( iTools, TRACE_FLAGS_DEFAULT, (EAPL("CEapServerProcessHandler::RunL() EWapiCoreIfNew\n"))); - iWapiCore = CWapiCoreIf::NewL(iTools, this); + TRAPD( err, iWapiCore = CWapiCoreIf::NewL(iTools, this)); + + EAP_UNREFERENCED_PARAMETER(err); // Only trace uses this. EAP_TRACE_DEBUG( iTools, TRACE_FLAGS_DEFAULT, - (EAPL("CEapServerProcessHandler::RunL() EWapiCoreIfNew - iWapiCore = 0x%08x.\n"), - iWapiCore)); - + (EAPL("CEapServerProcessHandler::RunL() EWapiCoreIfNew - iWapiCore = 0x%08x, err=%i.\n"), + iWapiCore, + err)); break; + } - case EWapiSettingsNew: + case EWapiSettingsNew: + { EAP_TRACE_DEBUG( iTools, TRACE_FLAGS_DEFAULT, (EAPL("CEapServerProcessHandler::RunL() EWapiSettingsNew\n"))); - iWapiSettings = CWapiSettingsIf::NewL(iTools, this); + TRAPD( err, iWapiSettings = CWapiSettingsIf::NewL(iTools, this)); + + EAP_UNREFERENCED_PARAMETER(err); // Only trace uses this. EAP_TRACE_DEBUG( iTools, TRACE_FLAGS_DEFAULT, - (EAPL("CEapServerProcessHandler::RunL() EWapiSettingsNew - iWapiSettings = 0x%08x.\n"), - iWapiSettings)); + (EAPL("CEapServerProcessHandler::RunL() EWapiSettingsNew - iWapiSettings = 0x%08x, err=%i.\n"), + iWapiSettings, + err)); break; -#endif + } case EEapPacStoreNew: @@ -617,7 +718,7 @@ { void* aData = reinterpret_cast(const_cast(message->GetData()->Ptr())); TInt aLength = message->GetData()->Size(); - iEapCore->process_data(aData, aLength); + status = iEapCore->process_data(aData, aLength); } else { @@ -641,7 +742,7 @@ { void* aData = reinterpret_cast(const_cast(message->GetData()->Ptr())); TInt aLength = message->GetData()->Size(); - iPacStore->process_data(aData, aLength); + status = iPacStore->process_data(aData, aLength); } else { @@ -664,7 +765,7 @@ { void* aData = reinterpret_cast(const_cast(message->GetData()->Ptr())); TInt aLength = message->GetData()->Size(); - iEapPlugin->process_data(aData, aLength); + status = iEapPlugin->process_data(aData, aLength); } else { @@ -687,7 +788,7 @@ { void* aData = reinterpret_cast(const_cast(message->GetData()->Ptr())); TInt aLength = message->GetData()->Size(); - iEapSettings->process_data(aData, aLength); + status = iEapSettings->process_data(aData, aLength); } else { @@ -699,7 +800,6 @@ break; -#if defined (USE_WAPI_CORE) case EWapiCoreProcessData: EAP_TRACE_DEBUG( @@ -711,7 +811,7 @@ { void* aData = reinterpret_cast(const_cast(message->GetData()->Ptr())); TInt aLength = message->GetData()->Size(); - iWapiCore->process_data(aData, aLength); + status = iWapiCore->process_data(aData, aLength); } else { @@ -733,7 +833,7 @@ { void* aData = reinterpret_cast(const_cast(message->GetData()->Ptr())); TInt aLength = message->GetData()->Size(); - iWapiSettings->process_data(aData, aLength); + status = iWapiSettings->process_data(aData, aLength); } else { @@ -744,16 +844,13 @@ } break; -#endif case EEapCoreSendData: case EEapPluginSendData: case EEapSettingsSendData: case EEapPacStoreSendData: -#if defined (USE_WAPI_CORE) case EWapiCoreSendData: case EWapiSettingsSendData: -#endif if (message->GetRequestType() == EEapCoreSendData) { EAP_TRACE_DEBUG( @@ -782,7 +879,6 @@ TRACE_FLAGS_DEFAULT, (EAPL("CEapServerProcessHandler::RunL() EEapPacStoreSendData\n"))); } -#if defined (USE_WAPI_CORE) else if (message->GetRequestType() == EWapiCoreSendData) { EAP_TRACE_DEBUG( @@ -797,7 +893,7 @@ TRACE_FLAGS_DEFAULT, (EAPL("CEapServerProcessHandler::RunL() EWapiSettingsSendData\n"))); } -#endif + EAP_TRACE_DEBUG( iTools, TRACE_FLAGS_DEFAULT, @@ -842,27 +938,63 @@ } // switch() - if (status == eap_status_ok) + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapServerProcessHandler::RunL(): iProcessMessage=0x%08x, aSendMessage=0x%08x, status=%d=%s.\n"), + iProcessMessage, + aSendMessage, + status, + eap_status_string_c::get_status_string(status))); + + // First send-message handled, remove the message. + // iClient->SendData() call may fail, then we do not remove the message. + if (aSendMessage != 0 + && status == eap_status_ok) { - // First one handled, remove message. - // iClient->SendData() call may fail, then we do not remove the message. - iEapMessageQueue->DeleteFirstMessage(); + iEapSendMessageQueue->DeleteFirstMessage(aSendMessage); } + else if (aSendMessage == 0 + && (status == eap_status_ok + || status != eap_status_pending_request)) + { + // First process-message handled, remove the message. + // Note the pending message will be removed after the operation has been completed in the SendData() function. + iEapProcessMessageQueue->DeleteFirstMessage(iProcessMessage); + iProcessMessage = 0; + } + + // Send-message must be null after this step. The message is is still in the iEapSendMessageQueue if send-operation failed. + aSendMessage = 0; } // if () - if (iEapMessageQueue->GetFirstMessage() != 0) + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapServerProcessHandler::RunL(): iProcessMessage=0x%08x, aSendMessage=0x%08x\n"), + iProcessMessage, + aSendMessage)); + + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapServerProcessHandler::RunL(): iEapSendMessageQueue->GetFirstMessage()=0x%08x, iEapProcessMessageQueue->GetFirstMessage()=0x%08x\n"), + iEapSendMessageQueue->GetFirstMessage(), + iEapProcessMessageQueue->GetFirstMessage())); + + if (iEapSendMessageQueue->GetFirstMessage() != 0) { - EAP_TRACE_DEBUG( - iTools, - TRACE_FLAGS_DEFAULT, - (EAPL("CEapServerProcessHandler::RunL(): Still messages waiting.\n"))); - if (iClient != NULL) { if (iClient->GetReceiveActive()) { - Activate(); + // Still send-messages waiting, activate handler. + Activate(EapServerProcessHandlerState_Send); } else { @@ -873,12 +1005,37 @@ } } } - else + else if (iProcessMessage == 0 + && iEapProcessMessageQueue->GetFirstMessage() != 0) { EAP_TRACE_DEBUG( iTools, TRACE_FLAGS_DEFAULT, - (EAPL("CEapServerProcessHandler::RunL(): No more messages to process.\n"))); + (EAPL("CEapServerProcessHandler::RunL(): Still messages waiting.\n"))); + + if (iClient != NULL) + { + // Still process-messages waiting, activate handler. + Activate(EapServerProcessHandlerState_All); + } + } + else if (iProcessMessage == 0) + { + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("CEapServerProcessHandler::RunL(): No new messages to process. Current message iProcessMessage=0x%08x\n"), + iProcessMessage)); + + TInt error = iClient->CompleteReadyHandler(this); + if (error != KErrNone) + { + EAP_TRACE_DEBUG( + iTools, + TRACE_FLAGS_DEFAULT, + (EAPL("ERROR: CEapServerProcessHandler::RunL(): iClient->CompleteReadyHandler() failed, error=%d\n"), + error)); + } } EAP_TRACE_DEBUG(