eapol/eapol_framework/eapol_symbian/eap_server/src/EapServerProcessHandler.cpp
changeset 49 43351a4f2da3
parent 36 c98682f98478
--- 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<void *>(const_cast<TUint8 *>(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<void *>(const_cast<TUint8 *>(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<void *>(const_cast<TUint8 *>(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<void *>(const_cast<TUint8 *>(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<void *>(const_cast<TUint8 *>(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<void *>(const_cast<TUint8 *>(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(