diff -r 000000000000 -r c53acadfccc6 harvester/client/src/harvesterclient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/harvester/client/src/harvesterclient.cpp Mon Jan 18 20:34:07 2010 +0200 @@ -0,0 +1,546 @@ +/* +* Copyright (c) 2006-2009 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: Harvester Client implementation* +*/ + +#include + +#include "harvesterclient.h" +#include "harvestercommon.h" +#include "harvesterrequestqueue.h" +#include "harvestereventobserverao.h" +#include "harvesterlog.h" +#include "harvesterclientao.h" +#include "mdsutils.h" +#include "harvesterrequestactive.h" +#include "mdscommoninternal.h" + +/** @var Message slots */ +const TInt KDefaultMessageSlots = -1; // Global pool + +/* Server name */ +_LIT( KHarvesterServerName, "HarvesterServer" ); + +/* Harvester Server process location */ +_LIT( KHarvesterServerExe, "harvesterserver.exe" ); + +// FUNCTION PROTOTYPES +static TInt StartServer(); +static TInt CreateServerProcess(); + + +// ---------------------------------------------------------------------------------------- +// RHarvesterClient +// ---------------------------------------------------------------------------------------- +// +EXPORT_C RHarvesterClient::RHarvesterClient() : RSessionBase() + { + WRITELOG( "RHarvesterClient::RHarvesterClient() - Constructor" ); + iHarvesterClientAO = NULL; + iObserver = NULL; + iHEO = NULL; + iRequestQueue = NULL; + } + +// ---------------------------------------------------------------------------------------- +// Connect +// ---------------------------------------------------------------------------------------- +// +EXPORT_C TInt RHarvesterClient::Connect() + { + WRITELOG( "RHarvesterClient::Connect()" ); + + RProperty property; + const TInt error( property.Attach( KHarvesterPSShutdown, KShutdown, EOwnerThread ) ); + TInt value = 0; + property.Get( value ); + property.Close(); + + if ( error != KErrNone || value > KErrNone ) + { + return KErrLocked; + } + + if( iHarvesterClientAO ) + { + return KErrAlreadyExists; + } + + TRAPD( err, iHarvesterClientAO = CHarvesterClientAO::NewL(*this) ); + if ( err != KErrNone ) + { + WRITELOG( "RHarvesterClient::RHarvesterClient() - Couldn't create active object" ); + return err; + } + + // request processor + TRAP( err, iRequestQueue = CHarvesterRequestQueue::NewL() ) + { + if ( err != KErrNone ) + { + WRITELOG( "RHarvesterClient::RHarvesterClient() - Couldn't create harvester request queue" ); + delete iHarvesterClientAO; + iHarvesterClientAO = NULL; + return err; + } + } + + err = ::StartServer(); + + if ( err == KErrNone || err == KErrAlreadyExists ) + { + WRITELOG( "RHarvesterClient::Connect() - creating session" ); + err = CreateSession( KHarvesterServerName, Version(), KDefaultMessageSlots ); + } + else + { + delete iHarvesterClientAO; + iHarvesterClientAO = NULL; + delete iRequestQueue; + iRequestQueue = NULL; + } + +#ifdef _DEBUG + if ( err != KErrNone ) + { + WRITELOG( "RHarvesterClient::Connect() - Server is not running or could not be started" ); + } + else + { + WRITELOG1( "RHarvesterClient::Connect() - no errors: %d", err ); + } + WRITELOG( "RHarvesterClient::Connect() - end" ); +#endif + + iHEO = NULL; + + return err; + } + +// ---------------------------------------------------------------------------------------- +// Pause +// ---------------------------------------------------------------------------------------- +// +EXPORT_C TInt RHarvesterClient::Pause() + { + WRITELOG( "RHarvesterClient::Pause() - sending command EPauseHarvester" ); + if( iHandle ) + { + return SendReceive( EPauseHarvester ); + } + return KErrDisconnected; + } + +// ---------------------------------------------------------------------------------------- +// Resume +// ---------------------------------------------------------------------------------------- +// +EXPORT_C TInt RHarvesterClient::Resume() + { + WRITELOG( "RHarvesterClient::Resume() - sending command EResumeHarvester" ); + if( iHandle ) + { + return SendReceive( EResumeHarvester ); + } + return KErrDisconnected; + } + +// ---------------------------------------------------------------------------------------- +// Close +// ---------------------------------------------------------------------------------------- +// +EXPORT_C void RHarvesterClient::Close() + { + WRITELOG( "RHarvesterClient::Close()" ); + + // cancels Harvest Complete request if it exist at server + UnregisterHarvestComplete(); + + WRITELOG( "RHarvesterClient::Close() - UnregisterHarvest done" ); + + iRequestQueue->ForceRequests(); + + delete iRequestQueue; + iRequestQueue = NULL; + + delete iHarvesterClientAO; + iHarvesterClientAO = NULL; + + delete iHEO; + iHEO = NULL; + + WRITELOG( "RHarvesterClient::Close() - Closing session" ); + + RSessionBase::Close(); + } + +// ---------------------------------------------------------------------------------------- +// SetObserver +// ---------------------------------------------------------------------------------------- +// +EXPORT_C void RHarvesterClient::SetObserver( MHarvestObserver* aObserver ) + { + WRITELOG( "RHarvesterClient::SetObserver()" ); + + if ( iHarvesterClientAO ) + { + iHarvesterClientAO->SetObserver( aObserver ); + } + iObserver = aObserver; + } + +// ---------------------------------------------------------------------------------------- +// RemoveObserver +// ---------------------------------------------------------------------------------------- +// +EXPORT_C void RHarvesterClient::RemoveObserver( MHarvestObserver* aObserver ) + { + WRITELOG( "RHarvesterClient::RemoveObserver()" ); + + if ( iHarvesterClientAO ) + { + iHarvesterClientAO->RemoveObserver( aObserver ); + } + + if ( aObserver == iObserver ) + { + if ( iObserver ) + { + WRITELOG( "CHarvesterClientAO::RemoveObserver() - deleting observer" ); + iObserver = NULL; + } + } + } + +// ---------------------------------------------------------------------------------------- +// AddHarvesterEventObserver +// ---------------------------------------------------------------------------------------- +// +EXPORT_C TInt RHarvesterClient::AddHarvesterEventObserver( + MHarvesterEventObserver& aHarvesterEventObserver, + TInt aHEObserverType, + TInt aEventInterval ) + { + TInt err( 0 ); + if( !iHEO ) + { + TRAP( err, iHEO = CHarvesterEventObserverAO::NewL( *this ) ); + if ( err != KErrNone ) + { + WRITELOG( "RHarvesterClient::RHarvesterClient() - Couldn't create harvester event observer" ); + return err; + } + } + + TRAP(err, iHEO->AddHarvesterEventObserverL( + aHarvesterEventObserver, + aHEObserverType, + aEventInterval )); + + return err; + } + +// ---------------------------------------------------------------------------------------- +// RemoveObserver +// ---------------------------------------------------------------------------------------- +// +EXPORT_C TInt RHarvesterClient::RemoveHarvesterEventObserver( MHarvesterEventObserver& aHarvesterEventObserver ) + { + TRAPD( err, iHEO->RemoveHarvesterEventObserverL( aHarvesterEventObserver ) ); + + return err; + } + +// ---------------------------------------------------------------------------------------- +// HarvestFile +// ---------------------------------------------------------------------------------------- +// +EXPORT_C void RHarvesterClient::HarvestFile( const TDesC& aURI, RArray& aAlbumIds, TBool aAddLocation ) + { + WRITELOG1( "RHarvesterClient::HarvestFile() - file %S", &aURI ); + + HBufC8* paramBuf = NULL; + TRAPD( err, paramBuf = SerializeArrayL( aAlbumIds ) ); + if ( err ) + { + WRITELOG1( "RHarvesterClient::HarvestFile() - cannot create serialized array, error: %d", err ); + if( iObserver ) + { + iObserver->HarvestingComplete( const_cast(aURI), err ); + } + return; + } + + CHarvesterRequestActive* harvestFileActive( NULL ); + TRAP( err, harvestFileActive = CHarvesterRequestActive::NewL( *this, iObserver, (TInt)EHarvestFile, aURI, + paramBuf, aAddLocation, iRequestQueue ) ); + if( err ) + { + WRITELOG1( "RHarvesterClient::HarvestFile() - cannot create harvesting request, error: %d", err ); + if( iObserver ) + { + iObserver->HarvestingComplete( const_cast(aURI), err ); + } + return; + } + + // send actually harvest request to server + if( iHandle ) + { + TRAP( err, iRequestQueue->AddRequestL( harvestFileActive ) ); + if( err && iObserver) + { + WRITELOG1( "RHarvesterClient::HarvestFile() - cannot not send harvest request to server, error: %d", KErrServerBusy ); + iObserver->HarvestingComplete( const_cast(aURI), KErrServerBusy ); + delete harvestFileActive; + } + else if( err ) + { + WRITELOG1( "RHarvesterClient::HarvestFile() - cannot not send harvest request to server, error: %d", KErrServerBusy ); + delete harvestFileActive; + } + else + { + WRITELOG( "RHarvesterClient::HarvestFile() - harvesting request added to queue" ); + iRequestQueue->Process(); + } + } + else if( iObserver ) + { + WRITELOG1( "RHarvesterClient::HarvestFile() - cannot not send harvest request to server, error: %d", KErrDisconnected ); + iObserver->HarvestingComplete( const_cast(aURI), KErrDisconnected ); + delete harvestFileActive; + } + else + { + WRITELOG1( "RHarvesterClient::HarvestFile() - cannot not send harvest request to server, error: %d", KErrDisconnected ); + delete harvestFileActive; + } + WRITELOG( "RHarvesterClient::HarvestFile() - end" ); + } + +// ---------------------------------------------------------------------------------------- +// HarvestFileWithUID +// ---------------------------------------------------------------------------------------- +// +EXPORT_C void RHarvesterClient::HarvestFileWithUID( const TDesC& aURI, + RArray& aAlbumIds, + TBool aAddLocation, + TUid /*aUid*/ ) + { + WRITELOG1( "RHarvesterClient::HarvestFileWithUID() - file %S", &aURI ); + + HBufC8* paramBuf = NULL; + TRAPD( err, paramBuf = SerializeArrayL( aAlbumIds ) ); + if ( err ) + { + WRITELOG1( "RHarvesterClient::HarvestFileWithUID() - cannot create serialized array, error: %d", err ); + if( iObserver ) + { + iObserver->HarvestingComplete( const_cast(aURI), err ); + } + return; + } + + CHarvesterRequestActive* harvestFileActive( NULL ); + TRAP( err, harvestFileActive = CHarvesterRequestActive::NewL( *this, iObserver, (TInt)EHarvestFile, aURI, + paramBuf, aAddLocation, iRequestQueue ) ); + if( err ) + { + WRITELOG1( "RHarvesterClient::HarvestFile() - cannot create harvesting request, error: %d", err ); + if( iObserver ) + { + iObserver->HarvestingComplete( const_cast(aURI), err ); + } + return; + } + + // send actually harvest request to server + if( iHandle ) + { + TRAP( err, iRequestQueue->AddRequestL( harvestFileActive ) ); + if( err && iObserver) + { + WRITELOG1( "RHarvesterClient::HarvestFile() - cannot not send harvest request to server, error: %d", KErrServerBusy ); + iObserver->HarvestingComplete( const_cast(aURI), KErrServerBusy ); + delete harvestFileActive; + } + else if( err ) + { + WRITELOG1( "RHarvesterClient::HarvestFile() - cannot not send harvest request to server, error: %d", KErrServerBusy ); + delete harvestFileActive; + } + else + { + iRequestQueue->Process(); + } + } + else if( iObserver ) + { + WRITELOG1( "RHarvesterClient::HarvestFile() - cannot not send harvest request to server, error: %d", KErrDisconnected ); + iObserver->HarvestingComplete( const_cast(aURI), KErrDisconnected ); + delete harvestFileActive; + } + else + { + WRITELOG1( "RHarvesterClient::HarvestFile() - cannot not send harvest request to server, error: %d", KErrDisconnected ); + delete harvestFileActive; + } + } + +// ---------------------------------------------------------------------------------------- +// RegisterHarvestComplete +// ---------------------------------------------------------------------------------------- +// +void RHarvesterClient::RegisterHarvestComplete(TDes& aURI, TRequestStatus& aStatus) + { + TIpcArgs ipcArgs( &aURI ); + + if( !iHandle ) + { + return; + } + SendReceive( ERegisterHarvestComplete, ipcArgs, aStatus); + } + + +// ---------------------------------------------------------------------------------------- +// UnregisterHarvestComplete +// ---------------------------------------------------------------------------------------- +// +void RHarvesterClient::UnregisterHarvestComplete() + { + if( !iHandle ) + { + return; + } + + Send( EUnregisterHarvestComplete ); + } + +// ---------------------------------------------------------------------------------------- +// HarvestFile +// ---------------------------------------------------------------------------------------- +// +void RHarvesterClient::HarvestFile( TInt& aService, TIpcArgs& aArgs, TRequestStatus& aStatus ) + { + // send to server harvesting complete observer + iHarvesterClientAO->Active(); + SendReceive( aService, aArgs, aStatus ); + } + +// ---------------------------------------------------------------------------------------- +// ForceHarvestFile +// ---------------------------------------------------------------------------------------- +// +void RHarvesterClient::ForceHarvestFile( TInt& aService, TIpcArgs& aArgs ) + { + // send to server harvesting complete observer + iHarvesterClientAO->Active(); + SendReceive( aService, aArgs ); + } + +// ---------------------------------------------------------------------------------------- +// Version +// ---------------------------------------------------------------------------------------- +// +TVersion RHarvesterClient::Version() const + { + WRITELOG( "RHarvesterClient::Version()" ); + + return TVersion( KHarvesterServerMajorVersion, KHarvesterServerMinorVersion, + KHarvesterServerBuildVersion ); + } + +// ---------------------------------------------------------------------------------------- +// StartServer +// ---------------------------------------------------------------------------------------- +// +static TInt StartServer() + { + WRITELOG( "StartServer() - begin" ); + + TFindServer findHarvesterServer( KHarvesterServerName ); + TFullName name; + + TInt result = findHarvesterServer.Next( name ); + if ( result == KErrNone ) + { + WRITELOG( "StartServer() - Server allready running" ); + + // Server already running + return KErrNone; + } + else + { + WRITELOG1( "StartServer() error - error code: %d", result ); + } + + result = CreateServerProcess(); + if ( result != KErrNone ) + { + WRITELOG1( "StartServer() - creating process failed, error: %d", result ); + } + + WRITELOG( "StartServer() - end" ); + return result; + } + +// ---------------------------------------------------------------------------------------- +// CreateServerProcess +// ---------------------------------------------------------------------------------------- +// +static TInt CreateServerProcess() + { + WRITELOG( "CreateServerProcess() - begin" ); + RProcess server; + TInt result = server.Create( KHarvesterServerExe, KNullDesC ); + + if( result == KErrAlreadyExists ) + { + return KErrNone; + } + + if ( result != KErrNone ) + { + WRITELOG1( "CreateServerProcess() - failed to create server process, error: %d", result ); + return result; + } + + TRequestStatus stat( 0 ); + server.Rendezvous( stat ); + + if ( stat != KRequestPending ) + { + server.Kill( 0 ); // abort startup + } + else + { + server.Resume(); // logon OK - start the server + } + + User::WaitForRequest( stat ); // wait for start or death + // we can't use the 'exit reason' if the server panicked as this + // is the panic 'reason' and may be '0' wehich cannot be distinguished + // from KErrNone + result = ( server.ExitType() == EExitPanic ) ? KErrCommsBreak : stat.Int(); + server.Close(); + + WRITELOG( "CreateServerProcess() - end" ); + + return result; + } + +// End of file +