--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/eapol/eapol_framework/eapol_symbian/eap_if/src/REapSession.cpp Mon May 24 20:32:47 2010 +0300
@@ -0,0 +1,732 @@
+/*
+* Copyright (c) 2001-2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: EAP and WLAN authentication protocols.
+*
+*/
+
+/*
+* %version: 33 %
+*/
+
+#include "REapSession.h"
+#include <e32base.h>
+#include "EapTraceSymbian.h"
+#include "EapCoreInterfaceImplementation.h"
+#include "EapServerStrings.h"
+#include "eap_automatic_variable.h"
+
+//----------------------------------------------------------------
+
+void Panic(TInt aPanic)
+ {
+ _LIT(KPanicCategory,"Eapol Client");
+ User::Panic(KPanicCategory, aPanic);
+ }
+
+//----------------------------------------------------------------
+
+TVersion REapSession::Version() const
+ {
+ return( TVersion(
+ KEapMajorVersionNumber,
+ KEapMinorVersionNumber,
+ KEapBuildVersionNumber ) );
+ }
+
+//----------------------------------------------------------------
+
+EAP_FUNC_EXPORT REapSession::~REapSession()
+{
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::~REapSession()\n")));
+
+ EAP_TRACE_RETURN_STRING(iTools, "returns: REapSession::~REapSession()");
+
+ delete iEapMessageQueue;
+ iEapMessageQueue = 0;
+}
+
+//----------------------------------------------------------------
+
+EAP_FUNC_EXPORT void REapSession::ConnectL(
+ abs_eap_am_tools_c * const tools,
+ MSendPacketHandler * Client,
+ TBuf<KMaxServerExe> ServerName,
+ TBuf<KMaxServerExe> ServerExe,
+ const void * const aConfigurationData,
+ const TInt aConfigurationDataLength,
+ const TEapRequests aIfRequest)
+{
+ EAP_TRACE_DEBUG(
+ tools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::ConnectL()\n")));
+
+ EAP_TRACE_RETURN_STRING(tools, "returns: REapSession::ConnectL()");
+
+ iClient = Client;
+ iTools = tools;
+ iEapMessageQueue = new(ELeave) EapMessageQueue(iTools);
+
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::ConnectL(): iEapMessageQueue=0x%08x\n"),
+ iEapMessageQueue));
+
+
+ // connect to iServer
+ TInt error=KErrNone;
+
+
+ TFindServer findServer(ServerName);
+ TFullName name;
+
+ error = findServer.Next( name );
+
+ if ( error == KErrNone )
+ {
+ // Server already running
+ }
+ else
+ {
+ error = iServer.Create(ServerExe,KNullDesC);
+
+ if (error != KErrNone)
+ {
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::ConnectL(): create iServer error=%d\n"),
+ error));
+ User::Leave(error);
+ }
+
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::ConnectL(): iServer successfully created\n")));
+
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::ConnectL(): iServer.SetPriority(EPriorityHigh)\n")));
+
+ iServer.SetPriority(EPriorityHigh);
+
+ TRequestStatus stat;
+
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::ConnectL(): iServer.Rendezvous\n")));
+
+ iServer.Rendezvous( stat );
+
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::ConnectL(): iServer.Rendezvous stat = %d\n"),
+ stat.Int()));
+
+ if ( stat!=KRequestPending )
+ {
+ iServer.Kill(0); // abort startup
+
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("ERROR: REapSession::ConnectL(): iServer killed\n")));
+ }
+ else
+ {
+ iServer.Resume(); // logon OK - start the iServer
+
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::ConnectL(): iServer started OK\n")));
+ }
+
+
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::ConnectL(): WaitForRequest\n")));
+
+ User::WaitForRequest(stat);
+
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::ConnectL(): WaitForRequest got, stat.Int()=%d\n"),
+ stat.Int()));
+
+ error = ( iServer.ExitType()==EExitPanic ) ? KErrGeneral : stat.Int();
+ iServer.Close();
+
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::ConnectL(): Server closed, error=%d\n"),
+ error));
+ }
+
+
+ // create active object receive handler and add it to scheduler
+ CleanupClosePushL(*this); // Close if next operations leave
+
+ User::LeaveIfError(error);
+
+ iSendHandler = new (ELeave) CSendHandler(iTools, *this); //*aHandler,
+ CActiveScheduler::Add(iSendHandler);
+
+ iProcessHandler = new (ELeave) CEapClientProcessHandler(iTools, *this); //*aHandler,
+ CleanupStack::Pop(this);
+ CActiveScheduler::Add(iProcessHandler);
+
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::ConnectL(): calls CreateSession()\n")));
+
+ error = CreateSession(ServerName,Version(), KMaxEapMessageSlots);
+
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::ConnectL(): CreateSession(), error=%d\n"),
+ error));
+
+ if (error != KErrNone)
+ {
+ User::Leave(error);
+ }
+
+ EAP_TRACE_DEBUG_SYMBIAN((_L("REapSession::ConnectL(): calls process_data(%d)"),
+ aIfRequest));
+
+ eap_status_e status = process_data(aIfRequest, aConfigurationData, aConfigurationDataLength);
+
+ EAP_TRACE_DEBUG_SYMBIAN((_L("REapSession::ConnectL(): process_data(%d) returns status=%d, iStatus.Int()=%d"),
+ aIfRequest,
+ status,
+ iStatus.Int()));
+
+ EAP_TRACE_DEBUG_SYMBIAN((_L("REapSession::ConnectL(): calls iSendHandler->Receive()")));
+
+ iSendHandler->Receive();
+}
+
+//----------------------------------------------------------------
+
+EAP_FUNC_EXPORT void REapSession::Close()
+ {
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::Close()\n")));
+
+ EAP_TRACE_RETURN_STRING(iTools, "returns: REapSession::Close()");
+
+ // destroy receiver-handler
+ delete iSendHandler;
+ iSendHandler = 0;
+
+ delete iProcessHandler;
+ iProcessHandler = 0;
+
+ // destroy iServer session
+ iServer.Close();
+ RSessionBase::Close();
+ }
+
+//----------------------------------------------------------------
+
+/**
+ * From eap_am_message_if_c
+ * Initialize interface to EAPOL or WAPI.
+ * @since S60 v9.2
+ */
+
+EAP_FUNC_EXPORT bool REapSession::get_is_valid()
+ {
+ EAP_TRACE_DEBUG_SYMBIAN((_L("REapSession::get_is_valid")));
+ EAP_TRACE_RETURN_STRING(iTools, "returns: REapSession::get_is_valid()");
+
+ return ETrue;
+ }
+
+//----------------------------------------------------------------
+
+/// Function receives the data message from lower layer.
+/// Data is formatted to Attribute-Value Pairs.
+/// Look at eap_tlv_header_c and eap_tlv_message_data_c.
+EAP_FUNC_EXPORT eap_status_e REapSession::process_data(const TEapRequests aMessageType, const void * const data, const u32_t length)
+ {
+ EAP_TRACE_DATA_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::process_data()"),
+ data,
+ length));
+
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::process_data(): calls iEapMessageQueue->AddMessage(): iEapMessageQueue=0x%08x\n"),
+ iEapMessageQueue));
+
+ EAP_TRACE_RETURN_STRING(iTools, "returns: REapSession::process_data()");
+
+ TInt error = iEapMessageQueue->AddMessage(aMessageType, data, length);
+
+ if (error != KErrNone)
+ {
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("ERROR: REapSession::process_data(): failed = %d\n"),
+ error));
+ return EAP_STATUS_RETURN(iTools, iTools->convert_am_error_to_eapol_error(error));
+ }
+
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::process_data(): calls iProcessHandler->Activate(): iProcessHandler=0x%08x\n"),
+ iProcessHandler));
+
+ iProcessHandler->Activate();
+
+ return EAP_STATUS_RETURN(iTools, iTools->convert_am_error_to_eapol_error(error));
+ }
+
+//----------------------------------------------------------------
+
+void REapSession::Receive(TDes8& aBuffer, TRequestStatus& aStatus)
+ {
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::Receive()\n")));
+
+ EAP_TRACE_RETURN_STRING(iTools, "returns: REapSession::Receive()");
+
+ TIpcArgs args( &aBuffer );
+
+ SendReceive( EEapIfReqReceive, args, aStatus );
+ }
+
+//----------------------------------------------------------------
+
+void REapSession::CancelReceive()
+ {
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::CancelReceive()\n")));
+
+ EAP_TRACE_RETURN_STRING(iTools, "returns: REapSession::CancelReceive()");
+
+ SendReceive(EEapIfCancelReceive, iStatus);
+ }
+
+//----------------------------------------------------------------
+
+const EapMessageBuffer * REapSession::GetFirstMessage()
+{
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::GetFirstMessage()\n")));
+
+ EAP_TRACE_RETURN_STRING(iTools, "returns: REapSession::GetFirstMessage()");
+
+ return iEapMessageQueue->GetFirstMessage();
+}
+
+//----------------------------------------------------------------
+
+TInt REapSession::DeleteFirstMessage()
+{
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::DeleteFirstMessage()\n")));
+
+ EAP_TRACE_RETURN_STRING(iTools, "returns: REapSession::DeleteFirstMessage()");
+
+ return iEapMessageQueue->DeleteFirstMessage();
+}
+
+//----------------------------------------------------------------
+
+void REapSession::Process(const EapMessageBuffer * const buffer, TRequestStatus &aStatus) const
+{
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::Process(): calls SendReceive(), aRequestType=%d=%s\n"),
+ buffer->GetRequestType(),
+ EapServerStrings::GetEapRequestsString(buffer->GetRequestType())));
+
+ EAP_TRACE_RETURN_STRING(iTools, "returns: REapSession::Process()");
+
+ TIpcArgs args( buffer->GetData() );
+
+ SendReceive(buffer->GetRequestType(), args, aStatus);
+
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("REapSession::Process(): end iStatus=%d\n"),
+ iStatus.Int()));
+}
+
+//----------------------------------------------------------------
+//----------------------------------------------------------------
+//----------------------------------------------------------------
+
+/*
+ CSendHandler
+*/
+
+// construct/destruct
+
+CSendHandler::CSendHandler(
+ abs_eap_am_tools_c * const tools,
+ REapSession& aSession)
+ : CActive(0)
+ , iTools(tools)
+ , iSession(aSession)
+ {
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CSendHandler::CSendHandler()\n")));
+ EAP_TRACE_RETURN_STRING(iTools, "returns: CSendHandler::CSendHandler()");
+
+ }
+
+//----------------------------------------------------------------
+
+CSendHandler::~CSendHandler()
+ {
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CSendHandler::~CSendHandler()\n")));
+ EAP_TRACE_RETURN_STRING(iTools, "returns: CSendHandler::~CSendHandler()");
+
+ Cancel();
+ }
+
+//----------------------------------------------------------------
+
+// operation
+
+void CSendHandler::Receive()
+ {
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CSendHandler::Receive()\n")));
+ EAP_TRACE_RETURN_STRING(iTools, "returns: CSendHandler::Receive()");
+
+ iSession.Receive(iBuffer, iStatus);
+
+ if(!IsActive())
+ {
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CSendHandler::Receive(): calls SetActive()\n")));
+
+ SetActive();
+ }
+ }
+
+//----------------------------------------------------------------
+
+// from CActive
+
+void CSendHandler::RunL()
+{
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CSendHandler::RunL(): iStatus=%d\n"),
+ iStatus.Int()));
+ EAP_TRACE_RETURN_STRING(iTools, "returns: CSendHandler::RunL()");
+
+ if (iStatus.Int() == KErrNone)
+ {
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CSendHandler::RunL(): iStatus = KErrNone, calls send_data()\n")));
+
+ iSession.iClient->send_data(iBuffer);
+
+ // initiate next receive
+ Receive();
+ }
+ else if (iStatus.Int() == KErrCancel)
+ {
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CSendHandler::RunL(): iStatus = KErrCancel, calls Close()\n")));
+
+ iSession.Close();
+ }
+ else
+ {
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CSendHandler::RunL(): does nothing\n")));
+
+ }
+}
+
+//----------------------------------------------------------------
+
+void CSendHandler::DoCancel()
+ {
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CSendHandler::DoCancel()\n")));
+ EAP_TRACE_RETURN_STRING(iTools, "returns: CSendHandler::DoCancel()");
+
+ iSession.CancelReceive();
+ }
+
+//----------------------------------------------------------------------------
+
+TInt CSendHandler::RunError(TInt aError)
+{
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CSendHandler::RunError(): aError=%d, this=0x%08x\n"),
+ aError,
+ this));
+ EAP_TRACE_RETURN_STRING(iTools, "returns: CSendHandler::RunError()");
+
+ Cancel();
+
+ return aError;
+}
+
+//----------------------------------------------------------------
+//----------------------------------------------------------------
+//----------------------------------------------------------------
+
+void CEapolPacketHandler::EapolHandleL(const TDesC8& data)
+ {
+ EAP_TRACE_DEBUG_SYMBIAN((_L("ERROR: CEapolPacketHandler::EapolHandleL(): (do nothing now)")));
+ }
+
+//----------------------------------------------------------------
+//----------------------------------------------------------------
+//----------------------------------------------------------------
+
+CEapClientProcessHandler::CEapClientProcessHandler(
+ abs_eap_am_tools_c * const tools,
+ REapSession& aSession)
+ : CActive(0)
+ , iTools(tools)
+ , iSession(aSession)
+ , iProcessPending(false)
+{
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CEapClientProcessHandler::CEapClientProcessHandler()\n")));
+
+ EAP_TRACE_RETURN_STRING(iTools, "returns: CEapClientProcessHandler::CEapClientProcessHandler()");
+
+}
+
+//----------------------------------------------------------------
+
+CEapClientProcessHandler::~CEapClientProcessHandler()
+{
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CEapClientProcessHandler::~CEapClientProcessHandler()\n")));
+
+ EAP_TRACE_RETURN_STRING(iTools, "returns: CEapClientProcessHandler::~CEapClientProcessHandler()");
+
+ Cancel();
+}
+
+//----------------------------------------------------------------
+
+// from CActive
+void CEapClientProcessHandler::RunL()
+{
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("=start=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=\n")));
+
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CEapClientProcessHandler::RunL()\n")));
+
+ EAP_TRACE_RETURN_STRING(iTools, "returns: CEapClientProcessHandler::RunL()");
+
+ TInt error(KErrNone);
+
+ if (iProcessPending == true)
+ {
+ error = iSession.DeleteFirstMessage();
+ if (error != KErrNone)
+ {
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("ERROR: CEapClientProcessHandler::RunL(): iSession.DeleteFirstMessage() failed = %d\n"),
+ error));
+
+ User::Leave(error);
+ }
+ }
+
+ const EapMessageBuffer * buffer = iSession.GetFirstMessage();
+
+ if (buffer != 0)
+ {
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CEapClientProcessHandler::RunL(): calls SendReceive(), buffer->GetRequestType()=%d=%s\n"),
+ buffer->GetRequestType(),
+ EapServerStrings::GetEapRequestsString(buffer->GetRequestType())));
+
+ TIpcArgs args( buffer->GetData() );
+
+ iSession.Process( buffer, iStatus );
+
+ SetActive();
+
+ iProcessPending = true;
+ }
+ else
+ {
+ iProcessPending = false;
+ }
+
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CEapClientProcessHandler::RunL(): end error=%d, iStatus=%d\n"),
+ error,
+ iStatus.Int()));
+
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("=end=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=\n")));
+}
+
+//----------------------------------------------------------------
+
+void CEapClientProcessHandler::Activate()
+{
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CEapClientProcessHandler::Activate()\n")));
+ EAP_TRACE_RETURN_STRING(iTools, "returns: CEapClientProcessHandler::Activate()");
+
+ if(!IsActive())
+ {
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CEapClientProcessHandler::Activate(): calls User::RequestComplete()\n")));
+
+ TRequestStatus* status = &iStatus;
+ User::RequestComplete(status, KErrNone);
+
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CEapClientProcessHandler::Activate(): calls SetActive()\n")));
+
+ SetActive();
+ }
+ else
+ {
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CEapClientProcessHandler::Activate(): Already active.\n")));
+ }
+}
+
+//----------------------------------------------------------------
+
+void CEapClientProcessHandler::DoCancel()
+{
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CEapClientProcessHandler::DoCancel()\n")));
+ EAP_TRACE_RETURN_STRING(iTools, "returns: CEapClientProcessHandler::DoCancel()");
+}
+
+//----------------------------------------------------------------------------
+
+TInt CEapClientProcessHandler::RunError(TInt aError)
+{
+ EAP_TRACE_DEBUG(
+ iTools,
+ TRACE_FLAGS_DEFAULT,
+ (EAPL("CEapClientProcessHandler::RunError(): aError=%d, this=0x%08x\n"),
+ aError,
+ this));
+ EAP_TRACE_RETURN_STRING(iTools, "returns: CEapClientProcessHandler::RunError()");
+
+ Cancel();
+
+ return aError;
+}
+
+//----------------------------------------------------------------
+//----------------------------------------------------------------
+//----------------------------------------------------------------
+
+/*
+ DLL harness
+*/
+#ifndef EKA2
+EAP_FUNC_EXPORT TInt E32Dll(TDllReason)
+ {
+ return KErrNone;
+ }
+#endif
+
+//----------------------------------------------------------------
+// end
+