--- /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