diff -r eb1f2e154e89 -r 3b79bedfdc20 textinput/peninputarc/src/peninputclient/penclientimpl.cpp --- a/textinput/peninputarc/src/peninputclient/penclientimpl.cpp Tue Feb 02 01:02:04 2010 +0200 +++ b/textinput/peninputarc/src/peninputclient/penclientimpl.cpp Fri Apr 16 15:17:40 2010 +0300 @@ -114,7 +114,7 @@ // RPeninputServerImpl::NewL // --------------------------------------------------------------------------- // -RPeninputServerImpl* RPeninputServerImpl::NewL(TRequestStatus* aStatus) +RPeninputServerImpl* RPeninputServerImpl::NewL() { //check for singleton existence CCoeStatic * obj = CCoeEnv::Static()->FindStatic(KSingletonClientId); @@ -123,14 +123,16 @@ if(client && client->IsValid()) { RPeninputServerImpl* server = client->GetSingletonServer(); - TInt err = server->ServerReady() ? KErrNone : KErrLaunchingServer; - User::RequestComplete(aStatus,err); return server; +/* if(iSingletonServer == 0 ) // second or later connecting from same client + { + error = KErrLaunchingServer; + }*/ } RPeninputServerImpl* self = new(ELeave) RPeninputServerImpl(); CleanupStack::PushL(self); - self->ConstructL(KSingletonClientId,aStatus); + self->ConstructL(KSingletonClientId); CleanupStack::Pop(self); return self; } @@ -145,18 +147,16 @@ iIsForegroundSession = EFalse; iServerExit = EFalse; iLaunchServer = EFalse; + iWaitScheduler = 0; iCurPenUiType = -1; - iWaitScheduler = NULL; + iWaitScheduler = 0; iAppPrefferedUiMode = EPluginInputModeNone; iAutoOpenFlag = ETrue; iBackgroundCtrl = 0; iResourceChange = EFalse; - iWaiterAo = NULL; - iPendingRequest = NULL; - iServerReady = EFalse; } -void RPeninputServerImpl::ConstructL(const TUid& aUid, TRequestStatus* aStatus) +void RPeninputServerImpl::ConstructL(const TUid& aUid) { CCoeStatic * obj = CCoeEnv::Static()->FindStatic(aUid); CPenInputSingletonClient* client; @@ -170,7 +170,7 @@ client = new (ELeave)CPenInputSingletonClient(aUid,this); //Note: The client is destroyed by the control environment automatically //User::LeaveIfError(DoConnectL()); - TRAPD(err, DoConnectL(aStatus)); + TRAPD(err, DoConnectL()); if(KErrNone != err) { client->SetInvalid(); @@ -217,9 +217,8 @@ // RPeninputServerImpl::DoConnectL // --------------------------------------------------------------------------- // -TInt RPeninputServerImpl::DoConnectL(TRequestStatus* aStatus) +TInt RPeninputServerImpl::DoConnectL() { - iPendingRequest = aStatus; TInt error = KErrNone; /*************** Note ************************************************/ // Multi-thread case is not considered here! @@ -234,45 +233,36 @@ { // server does not yet exist or it has terminated // try to create the server - - if(!aStatus) //sync call + error = StartThreadL(); + + if ( error == KErrNone || error == KErrAlreadyExists ) { - error = StartThreadL(); - if(KErrNone == error) - { - error = CreateSession( KPeninputServerName, - Version(), - KDefaultMessageSlots,EIpcSession_Sharable); - AddObserver(); - } - + // creation of server successfull, or some other client thread + // created it first -> try to connect again + error = CreateSession( KPeninputServerName, + Version(), + KDefaultMessageSlots ); } else { - StartThreadAsyncL(); - return KErrNone; + return error; } } - else //server alreay there + + TThreadId srvThreadId; + if(KErrNone == error) { - if(aStatus) - OnServerStarted(KErrNone); - else - AddObserver(); + TIpcArgs arg; + + TPckg msg(srvThreadId); + arg.Set(KMsgSlot0,&msg); + SendReceive(EPeninputRequestServerThreadId,arg); } - return error; - } - -void RPeninputServerImpl::AddObserver() - { - TThreadId srvThreadId; - TIpcArgs arg; - - TPckg msg(srvThreadId); - arg.Set(KMsgSlot0,&msg); - SendReceive(EPeninputRequestServerThreadId,arg); - + iServerExit = EFalse; + //create default observer + /*CPeninputServerObserver* observer = CPeninputServerObserver::NewL(this, + srvThreadId,iObserver);*/ if(iObserver) { iObserver->ReConstructL(srvThreadId); @@ -281,12 +271,22 @@ { iObserver = CPeninputServerObserver::NewL(this,srvThreadId); } + + + TFindThread findPeninputServer( _L("*peninputserver*") ); + TFullName name; + if (findPeninputServer.Next( name ) == KErrNone) + { + // if server is already running return immediately + //return KErrAlreadyExists; + RThread p; + TInt r = p.Open(name); + p.Close(); + } + + return error; } -TBool RPeninputServerImpl::ServerReady() - { - return iServerReady; - } // --------------------------------------------------------------------------- // RPeninputServerImpl::Version @@ -645,14 +645,6 @@ return supportMode; } -TInt RPeninputServerImpl::SetInputLanguage( TInt aLanguage ) - { - TIpcArgs arg; - TPckgC msg(aLanguage); - arg.Set(KMsgSlot0,&msg); - return SendReceive(EPeninputRequestSetInputLanguage, arg); - } - void RPeninputServerImpl::BackgroudDefaultOri( TInt aOri ) { TIpcArgs arg; @@ -680,27 +672,6 @@ } */ - -TInt RPeninputServerImpl::StartThreadAsyncL() - { - //ASSERT_DUBUG(!iWaiterAo) - iWaiterAo = new CWaitingServerAo(this); - - - TInt ret = KErrNone; - - RProcess server; - User::LeaveIfError(server.Create(KPeninputServerExe,KNullDesC())); - - - server.Rendezvous(iWaiterAo->RequestStatus()); - server.Resume(); - server.Close(); - - return ret; - } - - // --------------------------------------------------------------------------- // RPeninputServerImpl::StartThread // Creates the server thread on WINS and server process on MARM. @@ -713,25 +684,39 @@ // TInt RPeninputServerImpl::StartThreadL() { + if(iWaitScheduler) + return KErrLaunchingServer; TInt ret = KErrNone; + // check if server already exists + TFindServer findPeninputServer( KPeninputServerName ); + TFullName name; + if (findPeninputServer.Next( name ) == KErrNone) + { + // if server is already running return immediately + return KErrAlreadyExists; + } + // request status which gets signaled when server has been initialized + RProcess server; User::LeaveIfError(server.Create(KPeninputServerExe,KNullDesC())); + TRequestStatus status; + //User::WaitForRequest(status); - TRequestStatus status; - server.Rendezvous(status); + + iObserver = CPeninputServerObserver::NewL(this, + 0); + server.Rendezvous(iObserver->RequestStatus()); server.Resume(); server.Close(); + + iWaitScheduler = CPeninputServerWaiter::NewL(); + iWaitScheduler->Start(); + ret = iWaitScheduler->Error(); - User::WaitForRequest(status); - if(ESignalServerReady != status.Int()) - ret = KErrGeneral; - else - iServerReady = ETrue; return ret; } - // --------------------------------------------------------------------------- // RPeninputServerImpl::AddPeninputServerObserverL // Add observer @@ -1082,13 +1067,6 @@ delete iObserver; iObserver = NULL; - if ( iWaiterAo ) - { - iWaiterAo->Cancel(); - delete iWaiterAo; - iWaiterAo = NULL; - } - RSessionBase::Close(); } @@ -1521,54 +1499,5 @@ MakeVisible( EFalse ); } - -void RPeninputServerImpl::OnServerStarted(TInt aErr) - { - if(KErrNone == aErr) - { - iServerReady = ETrue; - } - - //create session - - TInt error = CreateSession( KPeninputServerName, - Version(), - KDefaultMessageSlots,EIpcSession_Sharable); - - if(KErrNone == error) - AddObserver(); - - User::RequestComplete(iPendingRequest, aErr); - } - -CWaitingServerAo::CWaitingServerAo(RPeninputServerImpl* aClient) - : CActive(CActive::EPriorityStandard), - iClient(aClient) - { - CActiveScheduler::Add(this); - SetActive(); - iStatus = KRequestPending; - } - - -void CWaitingServerAo::RunL() - { - TInt err = ESignalServerReady == iStatus.Int() ? KErrNone : KErrGeneral; - - iClient->OnServerStarted(err); - } - -void CWaitingServerAo::DoCancel() - { - } -TInt CWaitingServerAo::RunError(TInt /*aError*/) - { - return KErrNone; - } - -TRequestStatus& CWaitingServerAo::RequestStatus() - { - return iStatus; - } // End of File