diff -r 000000000000 -r b497e44ab2fc syncmlfw/syncservice/SRC/SyncService.cpp --- /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 + +#include +#include +#include +#include +#include +#include +#include "SyncServiceDebug.h" + +#include +#include +#include + +// ---------------------------------------------------------------------------- +// 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 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