syncmlfw/syncservice/SRC/SyncService.cpp
changeset 0 b497e44ab2fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/syncservice/SRC/SyncService.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,328 @@
+/*
+* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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:  Client for DS and DM initiated syncs
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include <bldvariant.hrh>
+
+#include <centralrepository.h>
+#include <SyncMLNotifierDomainCRKeys.h>
+#include <SyncServiceSession.h>
+#include <SyncServiceParams.h>
+#include <SyncService.h>
+#include <SyncServiceConst.h>
+#include "SyncServiceDebug.h"
+
+#include <apgcli.h>
+#include <AknServerApp.h>
+#include <barsread2.h>
+
+// ----------------------------------------------------------------------------
+// RSyncService::StartSyncL
+// ----------------------------------------------------------------------------
+//
+void RSyncService::StartSyncL( TSyncServiceParam aParam )
+	{
+	FLOG( _L( "[RSyncService] StartSyncL" ) );
+	
+	TSyncParameters parameters;
+	parameters.iCommand = KSyncServCmdStartSync;
+    parameters.iJobId = aParam.iJobId;
+    parameters.iProfileId = aParam.iProfileId;
+    parameters.iSilent = aParam.iSilent;
+    TInt err = 
+		SendReceive( ESyncServiceCommand, TIpcArgs( parameters.iCommand,
+		                                            parameters.iJobId,
+		                                            parameters.iProfileId,
+		                                            parameters.iSilent ) );
+	User::LeaveIfError( err );
+	}
+
+// ----------------------------------------------------------------------------
+// RSyncService::EnableProgressNoteL
+// ----------------------------------------------------------------------------
+//
+void RSyncService::EnableProgressNoteL( TBool aEnabled )
+	{
+	FLOG( _L("[RSyncService] EnableProgressNoteL") );
+
+	TSyncParameters parameters;
+	parameters.iCommand = KSyncServCmdShowProgress;
+
+    if ( aEnabled )
+        {
+        parameters.iJobId = KSyncServEnabled;
+        }
+    else
+        {
+        parameters.iJobId = KSyncServDisabled;
+        }
+    
+    TInt err = 
+		SendReceive( ESyncServiceCommand, TIpcArgs( parameters.iCommand,
+		                                            parameters.iJobId,
+		                                            parameters.iProfileId,
+		                                            parameters.iSilent ) );
+	User::LeaveIfError( err );
+	}
+
+// ----------------------------------------------------------------------------
+// RSyncService::ServiceUid
+// ----------------------------------------------------------------------------
+//
+TUid RSyncService::ServiceUid() const
+	{
+	FLOG( _L( "[RSyncService] ServiceUid" ) );
+	
+	return TUid::Uid( KSyncServiceUid );
+	}
+
+// ----------------------------------------------------------------------------
+// CSyncService::CSyncService
+// ----------------------------------------------------------------------------
+//
+CSyncService::CSyncService( )
+	{
+	FLOG( _L( "[CSyncService] CSyncService" ) );
+	
+	}
+
+// ----------------------------------------------------------------------------
+// CSyncService::~CSyncService
+// ----------------------------------------------------------------------------
+//
+CSyncService::~CSyncService( )
+	{
+	FLOG( _L( "[CSyncService] ~CSyncService" ) );
+	
+	delete iMonitor;
+	iService.Close();
+	}
+
+// ----------------------------------------------------------------------------
+// CSyncService::NewL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C CSyncService* CSyncService::NewL( MAknServerAppExitObserver* aObserver,
+                                           TUint aServiceId )
+    {
+    FLOG( _L( "[CSyncService] NewL" ) );
+    
+	CSyncService* self = new(ELeave) CSyncService();
+	CleanupStack::PushL(self);
+    self->ConstructL( aObserver, aServiceId );
+	CleanupStack::Pop(self);
+	return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CSyncService::ConstructL
+// ----------------------------------------------------------------------------
+//
+void CSyncService::ConstructL( MAknServerAppExitObserver* /*aObserver*/,
+                               TUint aServiceId )
+    {
+	FLOG( _L( "[CSyncService] ConstructL" ) );
+    iServiceId = aServiceId;
+    }
+
+// ----------------------------------------------------------------------------
+// CSyncService::StartSyncL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TUid CSyncService::StartSyncL( TSyncServiceParam aParam )
+    {
+    FLOG( _L( "[CSyncService] StartSyncL" ) );
+
+    iServiceId = aParam.iServiceId;
+	iUid = DiscoverL( iServiceId );
+	
+    TInt error = KErrNotFound;
+        
+    if( iService.ServerName().Length() > 0 )
+        {
+        FLOG( _L( "[CSyncService] ConstructL connect to existing app" ) );
+  	    TRAP( error, iService.StartSyncL( aParam ) );
+  	    if ( error == KErrNone )
+  	        {
+  	        return iUid;
+  	        }
+        }
+   	if ( error )
+		{
+		TFullName aServerName;
+		if ( iServiceId == KDevManServiceStart )
+		    {
+    		CRepository* centrep = NULL;
+    		centrep = CRepository::NewL( KCRUidNSmlNotifierDomainKeys );
+    		centrep->Get( KNSmlDMAppName, aServerName );
+    		delete centrep;
+		    }
+		else
+		    {
+		    aServerName = KDataSyncServiceName;
+		    }
+        FLOG( _L( "[CSyncService] ConstructL connect to existing app with predefined name" ) );
+        iService.Close();
+		TRAP( error, iService.ConnectExistingByNameL( aServerName ) );
+		}
+   	if ( error )
+		{
+		FLOG( _L( "[CSyncService] ConstructL connect to new app" ) );
+    	TRAP( error, iService.ConnectNewAppL( iUid ) );
+    	if( error )
+    		{
+    		FLOG( _L( "[CSyncService] ConnectNewAppL: Error not supported" ) );
+    		User::Leave( KErrNotSupported );
+    		}
+ 		}
+    
+    iService.StartSyncL( aParam );
+    return iUid;
+    }
+
+// ----------------------------------------------------------------------------
+// CSyncService::EnableProgressNoteL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CSyncService::EnableProgressNoteL( TBool aEnabled )
+    {
+    FLOG( _L( "[CSyncService] EnableProgressNoteL" ) );
+    
+    TFullName DmAppName;
+    CRepository* centrep = NULL;
+    centrep = CRepository::NewL( KCRUidNSmlNotifierDomainKeys );
+    centrep->Get( KNSmlDMAppName, DmAppName );
+    delete centrep;
+    
+    if( iService.ServerName().Length() > 0 )
+        {
+		TRAPD(error, iService.EnableProgressNoteL( aEnabled ) );
+		if ( error != KErrNone )
+		    {
+    		TFullName aServerName;
+    		if ( iServiceId == KDevManServiceStart )
+    		    {
+                aServerName = DmAppName;
+    		    }
+    		else
+    		    {
+    		    aServerName = KDataSyncServiceName;
+    		    }
+            FLOG( _L( "[CSyncService] EnableProgressNoteL connect to existing app with predefined name" ) );
+            iService.Close();
+    		iService.ConnectExistingByNameL( aServerName );        
+            iService.EnableProgressNoteL( aEnabled );
+		    }
+        }
+    else
+        {
+        // Sync has been started from APP UI so connect to the service and enable progressnote
+		TFullName aServerName;
+		if ( iServiceId == KDevManServiceStart )
+		    {
+		    aServerName = DmAppName;
+		    }
+		else
+		    {
+		    aServerName = KDataSyncServiceName;
+		    }
+        FLOG( _L( "[CSyncService] EnableProgressNoteL connect to existing app with predefined name" ) );
+		iService.ConnectExistingByNameL( aServerName );        
+        iService.EnableProgressNoteL( aEnabled );
+        }
+    FLOG( _L( "[CSyncService] EnableProgressNoteL" ) );
+    }
+
+// ----------------------------------------------------------------------------
+// CSyncService::DiscoverL
+// ----------------------------------------------------------------------------
+//
+TUid CSyncService::DiscoverL( TUint aServiceId )
+	{
+	FLOG( _L( "[CSyncService] DiscoverL" ) );
+	
+	CApaAppServiceInfoArray* services = NULL;	
+	RApaLsSession ls;
+	TUid appUid = TUid::Uid( 0x0 ); // Set the uid as NULL
+	
+	if( ls.Connect() == KErrNone )
+		{
+	    CleanupClosePushL( ls );
+		TInt ret = ls.GetServerApps( TUid::Uid( KSyncServiceUid ) );
+
+		if( ret != KErrNone )
+			{
+		    CleanupStack::PopAndDestroy( );  // closes RApaLsSession		
+		    return appUid; // return NULL appUid
+			}
+
+		services = ls.GetServiceImplementationsLC( TUid::Uid( KSyncServiceUid ) );			
+		
+		if( services )
+			{
+			TArray<TApaAppServiceInfo> s = services->Array( );
+			
+			TInt count = s.Count( );
+		
+			if( count != 0)
+				{	// 
+				for( TInt i = 0; i < count; i++ )
+					{
+					if( TryMatchL( s[i], appUid, aServiceId ) )
+						{ // If one of the services match, return the uid set by TryMatchL
+						break;
+						}
+					}
+				}		
+			}
+	    CleanupStack::PopAndDestroy( 2 );  // destroys services + closes RApaLsSession
+		}
+	return appUid;
+	}
+
+// ----------------------------------------------------------------------------
+// CSyncService::TryMatchL
+// ----------------------------------------------------------------------------
+//
+TBool CSyncService::TryMatchL( const TApaAppServiceInfo aInfo,
+                               TUid& aAppUid,
+                               TUint aServiceId )
+	{
+	FLOG( _L( "[CSyncService] TryMatchL" ) );
+	
+	RResourceReader r;
+	r.OpenLC( aInfo.OpaqueData() );
+
+	TInt serviceType = r.ReadUint32L( ); // the service type (sync start)
+
+    CleanupStack::PopAndDestroy( );				
+	
+	if( serviceType == aServiceId )
+		{
+		aAppUid.iUid = aInfo.Uid( ).iUid;
+		FLOG( _L( "[CSyncService] TryMatchL return ETrue" ) );
+		return ETrue;
+		}
+    
+    FLOG( _L( "[CSyncService] TryMatchL return EFalse" ) );
+	return EFalse;	
+	}
+	
+// End of file