textinput/peninputarc/src/peninputclient/penclientimpl.cpp
changeset 13 3b79bedfdc20
parent 0 eb1f2e154e89
equal deleted inserted replaced
0:eb1f2e154e89 13:3b79bedfdc20
   112 
   112 
   113 // ---------------------------------------------------------------------------
   113 // ---------------------------------------------------------------------------
   114 // RPeninputServerImpl::NewL
   114 // RPeninputServerImpl::NewL
   115 // ---------------------------------------------------------------------------
   115 // ---------------------------------------------------------------------------
   116 //
   116 //
   117 RPeninputServerImpl* RPeninputServerImpl::NewL(TRequestStatus* aStatus)                                  
   117 RPeninputServerImpl* RPeninputServerImpl::NewL()                                  
   118     {
   118     {
   119     //check for singleton existence    
   119     //check for singleton existence    
   120     CCoeStatic * obj = CCoeEnv::Static()->FindStatic(KSingletonClientId);
   120     CCoeStatic * obj = CCoeEnv::Static()->FindStatic(KSingletonClientId);
   121     CPenInputSingletonClient* client = 
   121     CPenInputSingletonClient* client = 
   122                                 static_cast<CPenInputSingletonClient*>(obj);
   122                                 static_cast<CPenInputSingletonClient*>(obj);
   123     if(client && client->IsValid())
   123     if(client && client->IsValid())
   124         {
   124         {
   125         RPeninputServerImpl* server = client->GetSingletonServer();
   125         RPeninputServerImpl* server = client->GetSingletonServer();
   126         TInt err = server->ServerReady() ? KErrNone : KErrLaunchingServer;  
       
   127         User::RequestComplete(aStatus,err);
       
   128         return server;
   126         return server;
       
   127 /*        if(iSingletonServer == 0 ) // second or later connecting from same client
       
   128             {
       
   129             error = KErrLaunchingServer;
       
   130             }*/
   129         }
   131         }
   130         
   132         
   131     RPeninputServerImpl* self = new(ELeave) RPeninputServerImpl();
   133     RPeninputServerImpl* self = new(ELeave) RPeninputServerImpl();
   132     CleanupStack::PushL(self);
   134     CleanupStack::PushL(self);
   133     self->ConstructL(KSingletonClientId,aStatus);
   135     self->ConstructL(KSingletonClientId);
   134     CleanupStack::Pop(self);
   136     CleanupStack::Pop(self);
   135     return self;
   137     return self;
   136     }
   138     }
   137 
   139 
   138 // ---------------------------------------------------------------------------
   140 // ---------------------------------------------------------------------------
   143     {
   145     {
   144     iObserver = 0;
   146     iObserver = 0;
   145     iIsForegroundSession = EFalse;
   147     iIsForegroundSession = EFalse;
   146     iServerExit = EFalse;
   148     iServerExit = EFalse;
   147     iLaunchServer = EFalse;
   149     iLaunchServer = EFalse;
       
   150     iWaitScheduler = 0;
   148     iCurPenUiType = -1; 
   151     iCurPenUiType = -1; 
   149     iWaitScheduler = NULL; 
   152     iWaitScheduler = 0; 
   150     iAppPrefferedUiMode = EPluginInputModeNone;
   153     iAppPrefferedUiMode = EPluginInputModeNone;
   151     iAutoOpenFlag = ETrue;
   154     iAutoOpenFlag = ETrue;
   152     iBackgroundCtrl = 0;
   155     iBackgroundCtrl = 0;
   153     iResourceChange = EFalse;  
   156     iResourceChange = EFalse;  
   154     iWaiterAo = NULL;
   157     }
   155     iPendingRequest = NULL;
   158 
   156     iServerReady = EFalse;
   159 void RPeninputServerImpl::ConstructL(const TUid& aUid)
   157     }
       
   158 
       
   159 void RPeninputServerImpl::ConstructL(const TUid& aUid, TRequestStatus* aStatus)
       
   160     {
   160     {
   161     CCoeStatic * obj = CCoeEnv::Static()->FindStatic(aUid);
   161     CCoeStatic * obj = CCoeEnv::Static()->FindStatic(aUid);
   162     CPenInputSingletonClient* client;
   162     CPenInputSingletonClient* client;
   163     //__ASSERT_ALWAYS(obj == NULL, User::Leave(KErrAlreadyExists));
   163     //__ASSERT_ALWAYS(obj == NULL, User::Leave(KErrAlreadyExists));
   164     if(obj)
   164     if(obj)
   168         }
   168         }
   169     else
   169     else
   170         client = new (ELeave)CPenInputSingletonClient(aUid,this);       
   170         client = new (ELeave)CPenInputSingletonClient(aUid,this);       
   171     //Note: The client is destroyed by the control environment automatically    
   171     //Note: The client is destroyed by the control environment automatically    
   172     //User::LeaveIfError(DoConnectL());
   172     //User::LeaveIfError(DoConnectL());
   173     TRAPD(err, DoConnectL(aStatus));
   173     TRAPD(err, DoConnectL());
   174     if(KErrNone != err)
   174     if(KErrNone != err)
   175         {
   175         {
   176         client->SetInvalid();
   176         client->SetInvalid();
   177         User::LeaveIfError(err);
   177         User::LeaveIfError(err);
   178         }
   178         }
   215     
   215     
   216 // ---------------------------------------------------------------------------
   216 // ---------------------------------------------------------------------------
   217 // RPeninputServerImpl::DoConnectL
   217 // RPeninputServerImpl::DoConnectL
   218 // ---------------------------------------------------------------------------
   218 // ---------------------------------------------------------------------------
   219 //
   219 //
   220 TInt RPeninputServerImpl::DoConnectL(TRequestStatus* aStatus)
   220 TInt RPeninputServerImpl::DoConnectL()
   221     { 
   221     { 
   222     iPendingRequest = aStatus;
       
   223     TInt error = KErrNone;
   222     TInt error = KErrNone;
   224     /*************** Note ************************************************/
   223     /*************** Note ************************************************/
   225     // Multi-thread case is not considered here!
   224     // Multi-thread case is not considered here!
   226     /*************** Note ************************************************/        
   225     /*************** Note ************************************************/        
   227     
   226     
   232 
   231 
   233     if( error == KErrNotFound || error == KErrServerTerminated )
   232     if( error == KErrNotFound || error == KErrServerTerminated )
   234         {
   233         {
   235         // server does not yet exist or it has terminated
   234         // server does not yet exist or it has terminated
   236         // try to create the server
   235         // try to create the server
   237         
   236         error = StartThreadL();
   238         if(!aStatus) //sync call
   237 
       
   238         if ( error == KErrNone || error == KErrAlreadyExists )
   239             {
   239             {
   240             error = StartThreadL();
   240             // creation of server successfull, or some other client thread 
   241             if(KErrNone == error)
   241             // created it first -> try to connect again
   242                 {
   242             error = CreateSession( KPeninputServerName,
   243                 error = CreateSession( KPeninputServerName,
   243                            Version(),
   244                                            Version(),
   244                            KDefaultMessageSlots );
   245                                            KDefaultMessageSlots,EIpcSession_Sharable);
       
   246                 AddObserver();
       
   247                 }
       
   248 
       
   249             }
   245             }
   250         else
   246         else
   251             {
   247             {
   252             StartThreadAsyncL();  
   248             return error;
   253             return KErrNone;
       
   254             }
   249             }
   255         }
   250         }
   256     else //server alreay there
   251 
   257         {
   252     TThreadId srvThreadId;
   258         if(aStatus)
   253     if(KErrNone == error)
   259             OnServerStarted(KErrNone);
   254         {
   260         else
   255         TIpcArgs arg;        
   261             AddObserver();
   256     
   262         }
   257         TPckg<TThreadId> msg(srvThreadId);
       
   258         arg.Set(KMsgSlot0,&msg);    
       
   259         SendReceive(EPeninputRequestServerThreadId,arg);
       
   260         }
       
   261     
       
   262     iServerExit = EFalse;
       
   263 	//create default observer
       
   264     /*CPeninputServerObserver* observer = CPeninputServerObserver::NewL(this,
       
   265                                                        srvThreadId,iObserver);*/
       
   266     if(iObserver)
       
   267         {
       
   268         iObserver->ReConstructL(srvThreadId);
       
   269         }
       
   270     else
       
   271         {
       
   272         iObserver = CPeninputServerObserver::NewL(this,srvThreadId);
       
   273         }
       
   274 
       
   275     
       
   276     TFindThread findPeninputServer( _L("*peninputserver*") );
       
   277     TFullName name;
       
   278     if (findPeninputServer.Next( name ) == KErrNone)
       
   279         {
       
   280         // if server is already running return immediately
       
   281         //return KErrAlreadyExists;
       
   282         RThread p;
       
   283         TInt r = p.Open(name);
       
   284         p.Close();
       
   285         } 
       
   286     
   263     return error;
   287     return error;
   264     }
   288     }
   265 
   289 
   266 void RPeninputServerImpl::AddObserver()
       
   267     {
       
   268     TThreadId srvThreadId;
       
   269 	TIpcArgs arg;        
       
   270 
       
   271 	TPckg<TThreadId> msg(srvThreadId);
       
   272 	arg.Set(KMsgSlot0,&msg);    
       
   273 	SendReceive(EPeninputRequestServerThreadId,arg);
       
   274 
       
   275     iServerExit = EFalse;
       
   276     if(iObserver)
       
   277         {
       
   278         iObserver->ReConstructL(srvThreadId);
       
   279         }
       
   280     else
       
   281         {
       
   282         iObserver = CPeninputServerObserver::NewL(this,srvThreadId);
       
   283         }
       
   284     }
       
   285 
       
   286 TBool RPeninputServerImpl::ServerReady() 
       
   287 	{ 
       
   288 	return iServerReady;
       
   289 	}
       
   290 
   290 
   291 // ---------------------------------------------------------------------------
   291 // ---------------------------------------------------------------------------
   292 // RPeninputServerImpl::Version
   292 // RPeninputServerImpl::Version
   293 // ---------------------------------------------------------------------------
   293 // ---------------------------------------------------------------------------
   294 //
   294 //
   643     SendReceive(EPeninputRequestSupportInputMode,arg);
   643     SendReceive(EPeninputRequestSupportInputMode,arg);
   644 
   644 
   645     return supportMode;
   645     return supportMode;
   646     }    
   646     }    
   647     
   647     
   648 TInt RPeninputServerImpl::SetInputLanguage( TInt aLanguage )
       
   649 	{
       
   650 	TIpcArgs arg; 
       
   651 	TPckgC<TInt> msg(aLanguage);
       
   652 	arg.Set(KMsgSlot0,&msg); 
       
   653 	return SendReceive(EPeninputRequestSetInputLanguage, arg);
       
   654 	}
       
   655 
       
   656 void RPeninputServerImpl::BackgroudDefaultOri( TInt aOri )   
   648 void RPeninputServerImpl::BackgroudDefaultOri( TInt aOri )   
   657     {
   649     {
   658     TIpcArgs arg;    
   650     TIpcArgs arg;    
   659     TPckgC<TInt> msg(aOri);
   651     TPckgC<TInt> msg(aOri);
   660     arg.Set(KMsgSlot0,&msg);
   652     arg.Set(KMsgSlot0,&msg);
   678     commandLine->SetProcessEnvironmentL(aServer);
   670     commandLine->SetProcessEnvironmentL(aServer);
   679     CleanupStack::PopAndDestroy(commandLine);
   671     CleanupStack::PopAndDestroy(commandLine);
   680     
   672     
   681     }
   673     }
   682   */  
   674   */  
   683 
       
   684 TInt RPeninputServerImpl::StartThreadAsyncL()
       
   685 	{
       
   686 	//ASSERT_DUBUG(!iWaiterAo)
       
   687 	iWaiterAo = new CWaitingServerAo(this);
       
   688 	
       
   689 	
       
   690 	TInt ret = KErrNone;
       
   691 	
       
   692 	RProcess server;
       
   693 	User::LeaveIfError(server.Create(KPeninputServerExe,KNullDesC()));
       
   694 	
       
   695 	
       
   696 	server.Rendezvous(iWaiterAo->RequestStatus());
       
   697 	server.Resume();
       
   698 	server.Close();
       
   699 										   
       
   700 	return ret;
       
   701 	}
       
   702 
       
   703 
       
   704 // ---------------------------------------------------------------------------
   675 // ---------------------------------------------------------------------------
   705 // RPeninputServerImpl::StartThread
   676 // RPeninputServerImpl::StartThread
   706 // Creates the server thread on WINS and server process on MARM.
   677 // Creates the server thread on WINS and server process on MARM.
   707 // Access to the thread/process creation is controlled with 
   678 // Access to the thread/process creation is controlled with 
   708 // a global mutex which allows only one client thread to do
   679 // a global mutex which allows only one client thread to do
   711 // already created it.
   682 // already created it.
   712 // ---------------------------------------------------------------------------
   683 // ---------------------------------------------------------------------------
   713 //
   684 //
   714 TInt RPeninputServerImpl::StartThreadL()
   685 TInt RPeninputServerImpl::StartThreadL()
   715     {
   686     {
       
   687     if(iWaitScheduler)
       
   688         return KErrLaunchingServer;
   716     TInt ret = KErrNone;
   689     TInt ret = KErrNone;
       
   690 
       
   691     // check if server already exists
       
   692     TFindServer findPeninputServer( KPeninputServerName );
       
   693     TFullName name;
       
   694     if (findPeninputServer.Next( name ) == KErrNone)
       
   695         {
       
   696         // if server is already running return immediately
       
   697         return KErrAlreadyExists;
       
   698         } 
       
   699     // request status which gets signaled when server has been initialized
   717 
   700 
   718     RProcess server;
   701     RProcess server;
   719     User::LeaveIfError(server.Create(KPeninputServerExe,KNullDesC()));
   702     User::LeaveIfError(server.Create(KPeninputServerExe,KNullDesC()));
   720     
   703     TRequestStatus status;            
   721     TRequestStatus status;
   704     //User::WaitForRequest(status);
   722     server.Rendezvous(status);
   705     
       
   706     
       
   707     iObserver = CPeninputServerObserver::NewL(this,
       
   708                                                0);
       
   709     server.Rendezvous(iObserver->RequestStatus());
   723     server.Resume();
   710     server.Resume();
   724     server.Close();
   711     server.Close();
   725     
   712                                                
   726     User::WaitForRequest(status);
   713     iWaitScheduler = CPeninputServerWaiter::NewL(); 
   727     if(ESignalServerReady != status.Int())
   714     iWaitScheduler->Start();
   728         ret = KErrGeneral;
   715     ret = iWaitScheduler->Error();
   729     else
   716     
   730         iServerReady = ETrue;     
       
   731     return ret;
   717     return ret;
   732     }
   718     }
   733 
       
   734 
   719 
   735 // ---------------------------------------------------------------------------
   720 // ---------------------------------------------------------------------------
   736 // RPeninputServerImpl::AddPeninputServerObserverL
   721 // RPeninputServerImpl::AddPeninputServerObserverL
   737 // Add observer
   722 // Add observer
   738 // ---------------------------------------------------------------------------
   723 // ---------------------------------------------------------------------------
  1079     delete iWaitScheduler;
  1064     delete iWaitScheduler;
  1080     iWaitScheduler = 0;
  1065     iWaitScheduler = 0;
  1081     iPenUiNotificationHandler.Close();
  1066     iPenUiNotificationHandler.Close();
  1082     delete iObserver;
  1067     delete iObserver;
  1083     iObserver = NULL;
  1068     iObserver = NULL;
  1084     
       
  1085     if ( iWaiterAo )
       
  1086     	{
       
  1087 		iWaiterAo->Cancel();
       
  1088 		delete iWaiterAo;
       
  1089 		iWaiterAo = NULL;
       
  1090     	}
       
  1091     
  1069     
  1092     RSessionBase::Close();    
  1070     RSessionBase::Close();    
  1093     }
  1071     }
  1094     
  1072     
  1095     
  1073     
  1519 void CPenUiBackgroundWnd::Hide()
  1497 void CPenUiBackgroundWnd::Hide()
  1520     {
  1498     {
  1521     MakeVisible( EFalse );
  1499     MakeVisible( EFalse );
  1522     }
  1500     }
  1523 
  1501 
  1524 
       
  1525 void RPeninputServerImpl::OnServerStarted(TInt aErr)
       
  1526     {
       
  1527     if(KErrNone == aErr)
       
  1528         {
       
  1529         iServerReady = ETrue;
       
  1530         }
       
  1531     
       
  1532     //create session
       
  1533      
       
  1534      TInt error = CreateSession( KPeninputServerName,
       
  1535                            Version(),
       
  1536                            KDefaultMessageSlots,EIpcSession_Sharable);
       
  1537 
       
  1538     if(KErrNone == error)
       
  1539         AddObserver();
       
  1540    
       
  1541     User::RequestComplete(iPendingRequest, aErr);
       
  1542     }
       
  1543 
       
  1544 CWaitingServerAo::CWaitingServerAo(RPeninputServerImpl* aClient) 
       
  1545                 : CActive(CActive::EPriorityStandard),
       
  1546                   iClient(aClient)
       
  1547     {
       
  1548     CActiveScheduler::Add(this);
       
  1549     SetActive();
       
  1550     iStatus = KRequestPending;
       
  1551     }
       
  1552 
       
  1553 
       
  1554 void CWaitingServerAo::RunL()
       
  1555     {
       
  1556     TInt err = ESignalServerReady == iStatus.Int() ? KErrNone : KErrGeneral;
       
  1557 
       
  1558     iClient->OnServerStarted(err);
       
  1559     }
       
  1560 
       
  1561 void CWaitingServerAo::DoCancel()
       
  1562     {
       
  1563     }
       
  1564 TInt CWaitingServerAo::RunError(TInt /*aError*/)
       
  1565     {
       
  1566     return KErrNone;
       
  1567     }
       
  1568 
       
  1569 TRequestStatus& CWaitingServerAo::RequestStatus()
       
  1570     {
       
  1571     return iStatus;
       
  1572     }
       
  1573 // End of File
  1502 // End of File
  1574 
  1503