eapol/eapol_framework/eapol_symbian/eap_server/src/EapScheduler.cpp
author hgs
Mon, 24 May 2010 20:32:47 +0300
changeset 26 9abfd4f00d37
child 30 4d3faa401db5
permissions -rw-r--r--
201021
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
26
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2001-2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of the License "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  scheduler of EAP-server.
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
/*
hgs
parents:
diff changeset
    19
* %version: 15 %
hgs
parents:
diff changeset
    20
*/
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include "EapScheduler.h"
hgs
parents:
diff changeset
    23
#include "EapTraceSymbian.h"
hgs
parents:
diff changeset
    24
#include "EapServer.h"
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
void CEapScheduler::TServerStart::SignalL()
hgs
parents:
diff changeset
    27
//
hgs
parents:
diff changeset
    28
// Signal the owning thread that the server has started successfully
hgs
parents:
diff changeset
    29
// This may itself fail
hgs
parents:
diff changeset
    30
//
hgs
parents:
diff changeset
    31
    {
hgs
parents:
diff changeset
    32
    EAP_TRACE_DEBUG_SYMBIAN((_L("TServerStart::SignalL()")));
hgs
parents:
diff changeset
    33
    TBuf<KMaxServerExe> ServerName;
hgs
parents:
diff changeset
    34
    TBuf<KMaxServerExe> ServerExe;
hgs
parents:
diff changeset
    35
    
hgs
parents:
diff changeset
    36
    //EapClientIf * aClientIf = new (ELeave)EapClientIf();
hgs
parents:
diff changeset
    37
    
hgs
parents:
diff changeset
    38
    GetServerNameAndExe(&ServerName, &ServerExe);
hgs
parents:
diff changeset
    39
    TFindThread aProcess(ServerName);
hgs
parents:
diff changeset
    40
    TFullName result;
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
   while(aProcess.Next(result) == KErrNone) 
hgs
parents:
diff changeset
    43
      {
hgs
parents:
diff changeset
    44
      RThread starter;
hgs
parents:
diff changeset
    45
      User::LeaveIfError(starter.Open(aProcess));
hgs
parents:
diff changeset
    46
      starter.RequestComplete(iStatus,KErrNone);
hgs
parents:
diff changeset
    47
      starter.Close();
hgs
parents:
diff changeset
    48
      }
hgs
parents:
diff changeset
    49
    EAP_TRACE_DEBUG_SYMBIAN((_L("TServerStart::SignalL(): end")));           
hgs
parents:
diff changeset
    50
    }
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
/*
hgs
parents:
diff changeset
    53
    class CEapScheduler
hgs
parents:
diff changeset
    54
*/
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
EAP_FUNC_EXPORT CEapScheduler* CEapScheduler::NewL()
hgs
parents:
diff changeset
    57
    {
hgs
parents:
diff changeset
    58
    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::NewL()")));
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
    CEapScheduler* self = new(ELeave)CEapScheduler();
hgs
parents:
diff changeset
    61
    CleanupStack::PushL(self);
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
    TRequestStatus started;
hgs
parents:
diff changeset
    64
    TServerStart start(started);
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
    self->ConstructL(start);
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
    CleanupStack::Pop(self);
hgs
parents:
diff changeset
    69
    return self;
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
    }
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
EAP_FUNC_EXPORT TInt CEapScheduler::LaunchFromClient(const TBuf<KMaxServerExe> Server)
hgs
parents:
diff changeset
    74
    {
hgs
parents:
diff changeset
    75
    TRequestStatus started;
hgs
parents:
diff changeset
    76
    TServerStart start(started);
hgs
parents:
diff changeset
    77
    
hgs
parents:
diff changeset
    78
    EAP_TRACE_DEBUG_SYMBIAN((_L("TServerStart::LaunchFromClient()")));           
hgs
parents:
diff changeset
    79
hgs
parents:
diff changeset
    80
    //
hgs
parents:
diff changeset
    81
    // EPOC is easy, we just create a new server process. Simultaneous
hgs
parents:
diff changeset
    82
    // launching of two such processes should be detected when the
hgs
parents:
diff changeset
    83
    // second one attempts to create the server object, failing with
hgs
parents:
diff changeset
    84
    // KErrAlreadyExists.
hgs
parents:
diff changeset
    85
    //
hgs
parents:
diff changeset
    86
    RProcess server;
hgs
parents:
diff changeset
    87
    TInt r=server.Create(Server,KNullDesC);
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
    if (r!=KErrNone)
hgs
parents:
diff changeset
    90
        {
hgs
parents:
diff changeset
    91
        EAP_TRACE_DEBUG_SYMBIAN((_L("ERROR: TServerStart::LaunchFromClient(): server create error")));
hgs
parents:
diff changeset
    92
        return r;
hgs
parents:
diff changeset
    93
        }
hgs
parents:
diff changeset
    94
    EAP_TRACE_DEBUG_SYMBIAN((_L("TServerStart::LaunchFromClient(): server created")));
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
    EAP_TRACE_DEBUG_SYMBIAN((_L("TServerStart::LaunchFromClient(): server.SetPriority(EPriorityHigh)")));
hgs
parents:
diff changeset
    97
	server.SetPriority(EPriorityHigh);
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
    TRequestStatus stat;
hgs
parents:
diff changeset
   100
    server.Rendezvous( stat );
hgs
parents:
diff changeset
   101
    EAP_TRACE_DEBUG_SYMBIAN((_L("TServerStart::LaunchFromClient(): server.Rendezvous(), stat.Int()=%d"),
hgs
parents:
diff changeset
   102
		stat.Int()));
hgs
parents:
diff changeset
   103
    if ( stat!=KRequestPending )
hgs
parents:
diff changeset
   104
        {
hgs
parents:
diff changeset
   105
	    EAP_TRACE_DEBUG_SYMBIAN((_L("ERROR: TServerStart::LaunchFromClient(): server.Kill()")));
hgs
parents:
diff changeset
   106
        server.Kill(0);     // abort startup
hgs
parents:
diff changeset
   107
        }
hgs
parents:
diff changeset
   108
    else
hgs
parents:
diff changeset
   109
        {
hgs
parents:
diff changeset
   110
	    EAP_TRACE_DEBUG_SYMBIAN((_L("TServerStart::LaunchFromClient(): server.Resume(), OK")));
hgs
parents:
diff changeset
   111
        server.Resume();    // logon OK - start the server
hgs
parents:
diff changeset
   112
        }
hgs
parents:
diff changeset
   113
        
hgs
parents:
diff changeset
   114
    
hgs
parents:
diff changeset
   115
    User::WaitForRequest(stat);
hgs
parents:
diff changeset
   116
    EAP_TRACE_DEBUG_SYMBIAN((_L("TServerStart::LaunchFromClient(): User::WaitForRequest(stat), stat.Int()=%d"),
hgs
parents:
diff changeset
   117
		stat.Int()));
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
    r = ( server.ExitType()==EExitPanic ) ? KErrGeneral : stat.Int();
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
    server.Close();
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
    return r;
hgs
parents:
diff changeset
   124
    }
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
EAP_FUNC_EXPORT TInt CEapScheduler::ThreadStart(TServerStart& aStart)
hgs
parents:
diff changeset
   127
    {
hgs
parents:
diff changeset
   128
    // get cleanup stack
hgs
parents:
diff changeset
   129
    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::ThreadStart()")));           
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
    __UHEAP_MARK;
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
    CTrapCleanup* cleanup=CTrapCleanup::New();
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
    // initialize all up to and including starting scheduler
hgs
parents:
diff changeset
   136
    TInt err = KErrNoMemory;
hgs
parents:
diff changeset
   137
    if (cleanup)
hgs
parents:
diff changeset
   138
		{
hgs
parents:
diff changeset
   139
		TRAP(err, ConstructL(aStart));
hgs
parents:
diff changeset
   140
		delete cleanup;
hgs
parents:
diff changeset
   141
		}
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::ThreadStart end err=%d"), err));           
hgs
parents:
diff changeset
   146
    return err;
hgs
parents:
diff changeset
   147
    }
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
void CEapScheduler::ConstructL(TServerStart& aStart)
hgs
parents:
diff changeset
   150
    {
hgs
parents:
diff changeset
   151
    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::ConstructL()")));           
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
    // construct active scheduler
hgs
parents:
diff changeset
   154
    CEapScheduler* self=new(ELeave) CEapScheduler;
hgs
parents:
diff changeset
   155
    CleanupStack::PushL(self);
hgs
parents:
diff changeset
   156
    CActiveScheduler::Install(self);
hgs
parents:
diff changeset
   157
hgs
parents:
diff changeset
   158
    // construct server
hgs
parents:
diff changeset
   159
    self->iServer=new(ELeave) CEapServer;
hgs
parents:
diff changeset
   160
    self->iServer->ConstructL();
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
    // Let the client know we've started OK
hgs
parents:
diff changeset
   163
    aStart.SignalL();
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::ThreadStart Rendezvous")));           
hgs
parents:
diff changeset
   166
    RProcess::Rendezvous(KErrNone);
hgs
parents:
diff changeset
   167
    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::ThreadStart Rendezvous end")));           
hgs
parents:
diff changeset
   168
hgs
parents:
diff changeset
   169
    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::ConstructL(): CActiveScheduler::Start() starts")));
hgs
parents:
diff changeset
   170
    CActiveScheduler::Start();
hgs
parents:
diff changeset
   171
    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::ConstructL(): CActiveScheduler::Start() ends")));
hgs
parents:
diff changeset
   172
hgs
parents:
diff changeset
   173
    // Destroy the scheduler
hgs
parents:
diff changeset
   174
    CleanupStack::PopAndDestroy(self);
hgs
parents:
diff changeset
   175
    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::ConstructL(): end")));
hgs
parents:
diff changeset
   176
    }
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
CEapScheduler::~CEapScheduler()
hgs
parents:
diff changeset
   179
    {
hgs
parents:
diff changeset
   180
    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::~CEapScheduler()")));
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
    delete iServer;
hgs
parents:
diff changeset
   183
    }
hgs
parents:
diff changeset
   184
hgs
parents:
diff changeset
   185
void CEapScheduler::Error(TInt aError) const
hgs
parents:
diff changeset
   186
    {
hgs
parents:
diff changeset
   187
    EAP_TRACE_DEBUG_SYMBIAN((_L("CEapScheduler::Error(): aError=%d"),
hgs
parents:
diff changeset
   188
		aError));
hgs
parents:
diff changeset
   189
hgs
parents:
diff changeset
   190
    __DEBUGGER();
hgs
parents:
diff changeset
   191
//    PanicServer(EErrorFromNonClientObject);
hgs
parents:
diff changeset
   192
    }