eapol/eapol_framework/eapol_symbian/eap_server/src/EapScheduler.cpp
branchRCL_3
changeset 18 bad0cc58d154
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eapol/eapol_framework/eapol_symbian/eap_server/src/EapScheduler.cpp	Tue Aug 31 15:16:37 2010 +0300
@@ -0,0 +1,197 @@
+/*
+* 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:  scheduler of EAP-server.
+*
+*/
+
+/*
+* %version: 18 %
+*/
+
+#include "EapScheduler.h"
+#include "EapTraceSymbian.h"
+#include "EapServer.h"
+
+void CEapScheduler::TServerStart::SignalL()
+//
+// Signal the owning thread that the server has started successfully
+// This may itself fail
+//
+    {
+    EAP_TRACE_DEBUG_SYMBIAN((_L("TServerStart::SignalL()")));
+    TBuf<KMaxServerExe> ServerName;
+    TBuf<KMaxServerExe> ServerExe;
+    
+    //EapClientIf * aClientIf = new (ELeave)EapClientIf();
+    
+    GetServerNameAndExe(&ServerName, &ServerExe);
+    TFindThread aProcess(ServerName);
+    TFullName result;
+
+   while(aProcess.Next(result) == KErrNone) 
+      {
+      RThread starter;
+      User::LeaveIfError(starter.Open(aProcess));
+      starter.RequestComplete(iStatus,KErrNone);
+      starter.Close();
+      }
+    EAP_TRACE_DEBUG_SYMBIAN((_L("TServerStart::SignalL(): end")));           
+    }
+
+/*
+    class CEapScheduler
+*/
+
+EAP_FUNC_EXPORT CEapScheduler* CEapScheduler::NewL()
+    {
+    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::NewL()")));
+
+    CEapScheduler* self = new(ELeave)CEapScheduler();
+    CleanupStack::PushL(self);
+
+    TRequestStatus started;
+    TServerStart start(started);
+
+    self->ConstructL(start);
+
+    CleanupStack::Pop(self);
+    return self;
+
+    }
+
+EAP_FUNC_EXPORT TInt CEapScheduler::LaunchFromClient(const TBuf<KMaxServerExe> Server)
+    {
+    TRequestStatus started;
+    TServerStart start(started);
+    
+    EAP_TRACE_DEBUG_SYMBIAN((_L("TServerStart::LaunchFromClient()")));           
+
+    //
+    // EPOC is easy, we just create a new server process. Simultaneous
+    // launching of two such processes should be detected when the
+    // second one attempts to create the server object, failing with
+    // KErrAlreadyExists.
+    //
+    RProcess server;
+    TInt r=server.Create(Server,KNullDesC);
+
+    if (r!=KErrNone)
+        {
+        EAP_TRACE_DEBUG_SYMBIAN((_L("ERROR: TServerStart::LaunchFromClient(): server create error")));
+        return r;
+        }
+    EAP_TRACE_DEBUG_SYMBIAN((_L("TServerStart::LaunchFromClient(): server created")));
+
+    EAP_TRACE_DEBUG_SYMBIAN((_L("TServerStart::LaunchFromClient(): server.SetPriority(EPriorityHigh)")));
+	server.SetPriority(EPriorityHigh);
+
+    TRequestStatus stat;
+    server.Rendezvous( stat );
+    EAP_TRACE_DEBUG_SYMBIAN((_L("TServerStart::LaunchFromClient(): server.Rendezvous(), stat.Int()=%d"),
+		stat.Int()));
+    if ( stat!=KRequestPending )
+        {
+	    EAP_TRACE_DEBUG_SYMBIAN((_L("ERROR: TServerStart::LaunchFromClient(): server.Kill()")));
+        server.Kill(0);     // abort startup
+        }
+    else
+        {
+	    EAP_TRACE_DEBUG_SYMBIAN((_L("TServerStart::LaunchFromClient(): server.Resume(), OK")));
+        server.Resume();    // logon OK - start the server
+        }
+        
+    
+    User::WaitForRequest(stat);
+    EAP_TRACE_DEBUG_SYMBIAN((_L("TServerStart::LaunchFromClient(): User::WaitForRequest(stat), stat.Int()=%d"),
+		stat.Int()));
+
+    r = ( server.ExitType()==EExitPanic ) ? KErrGeneral : stat.Int();
+
+    server.Close();
+
+    return r;
+    }
+
+EAP_FUNC_EXPORT TInt CEapScheduler::ThreadStart(TServerStart& aStart)
+    {
+    // get cleanup stack
+    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::ThreadStart()")));           
+
+#if defined(USE_EAP_HEAP_CHECK)
+    __UHEAP_MARK;
+#endif //#if defined(USE_EAP_HEAP_CHECK)
+
+    CTrapCleanup* cleanup=CTrapCleanup::New();
+
+    // initialize all up to and including starting scheduler
+    TInt err = KErrNoMemory;
+    if (cleanup)
+		{
+		TRAP(err, ConstructL(aStart));
+		delete cleanup;
+		}
+
+#if defined(USE_EAP_HEAP_CHECK)
+    __UHEAP_MARKEND;
+#endif //#if defined(USE_EAP_HEAP_CHECK)
+
+    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::ThreadStart end err=%d"), err));           
+    return err;
+    }
+
+void CEapScheduler::ConstructL(TServerStart& aStart)
+    {
+    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::ConstructL()")));           
+
+    // construct active scheduler
+    CEapScheduler* self=new(ELeave) CEapScheduler;
+    CleanupStack::PushL(self);
+    CActiveScheduler::Install(self);
+
+    // construct server
+    self->iServer=new(ELeave) CEapServer;
+    self->iServer->ConstructL();
+
+    // Let the client know we've started OK
+    aStart.SignalL();
+
+    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::ThreadStart Rendezvous")));           
+    RProcess::Rendezvous(KErrNone);
+    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::ThreadStart Rendezvous end")));           
+
+    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::ConstructL(): CActiveScheduler::Start() starts")));
+    CActiveScheduler::Start();
+    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::ConstructL(): CActiveScheduler::Start() ends")));
+
+    // Destroy the scheduler
+    CleanupStack::PopAndDestroy(self);
+    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::ConstructL(): end")));
+    }
+
+CEapScheduler::~CEapScheduler()
+    {
+    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::~CEapScheduler()")));
+
+    delete iServer;
+    }
+
+void CEapScheduler::Error(TInt aError) const
+    {
+    EAP_UNREFERENCED_PARAMETER(aError);
+    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::Error(): aError=%d"),
+		aError));
+
+    __DEBUGGER();
+//    PanicServer(EErrorFromNonClientObject);
+    }