textinput/peninputarc/src/peninputclient/penclientimpl.cpp
changeset 13 3b79bedfdc20
parent 0 eb1f2e154e89
--- 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<TThreadId> msg(srvThreadId);
+        arg.Set(KMsgSlot0,&msg);    
+        SendReceive(EPeninputRequestServerThreadId,arg);
         }
-    return error;
-    }
-
-void RPeninputServerImpl::AddObserver()
-    {
-    TThreadId srvThreadId;
-	TIpcArgs arg;        
-
-	TPckg<TThreadId> 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<TInt> 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