diff -r 000000000000 -r 09774dfdd46b presetserver/clientsrc/Psserv.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presetserver/clientsrc/Psserv.cpp Mon Apr 19 14:01:53 2010 +0300 @@ -0,0 +1,191 @@ +/* +* Copyright (c) 2006-2006 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: Preset server client implementation +* +*/ + + +#include +#include + +// ======== LOCAL FUNCTIONS ======== + +namespace + { + + // --------------------------------------------------------------------------- + // Panics the application with the supplied reason. + // --------------------------------------------------------------------------- + // + void Panic( TInt aReason ) + { + _LIT( panic, "PSServ" ); + User::Panic( panic, aReason ); + } + + // --------------------------------------------------------------------------- + // Checks whether or not the server is running. + // --------------------------------------------------------------------------- + // + TBool IsServerStarted() + { + TFindServer server( KPSServerName ); + TFullName serverName; + return ( server.Next( serverName ) == KErrNone ); + } + + // --------------------------------------------------------------------------- + // Starts the server. + // --------------------------------------------------------------------------- + // + TInt StartServer() + { + TInt result = KErrNone; + + if ( !IsServerStarted() ) + { + RProcess process; + result = process.Create( KPSServerExe, KNullDesC ); + + if ( result == KErrNone || result == KErrAlreadyExists ) + { + TRequestStatus logonStatus; + TRequestStatus rendezvousStatus; + + process.Logon( logonStatus ); + process.Rendezvous( rendezvousStatus ); + + // start process + if ( result == KErrNone ) + { + process.Resume(); + } + + // wait for either of statuses to be signaled + User::WaitForRequest( logonStatus, rendezvousStatus ); + + // if logonStatus was not signaled (it is still KRequestPending) + // cancel it + if ( logonStatus == KRequestPending ) // Server succesfully started. + { + process.LogonCancel( logonStatus ); + User::WaitForRequest( logonStatus ); + } + else + { + process.RendezvousCancel( rendezvousStatus ); + User::WaitForRequest( rendezvousStatus ); + } + } + + __ASSERT_ALWAYS( IsServerStarted(), Panic( KErrNotFound ) ); + } + + return result; + } + + // --------------------------------------------------------------------------- + // Returns the current version number. + // --------------------------------------------------------------------------- + // + TVersion Version() + { + return TVersion( KPSVersionMajor, KPSVersionMinor, KPSVersionBuild ); + } + + } + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Constructor. +// --------------------------------------------------------------------------- +// +EXPORT_C RPSServ::RPSServ() + : RSessionBase(), iReserved() + { + } + +// --------------------------------------------------------------------------- +// Connects the session to the server. +// --------------------------------------------------------------------------- +// +EXPORT_C TInt RPSServ::Connect() + { + StartServer(); + + return CreateSession( KPSServerName, Version() ); + } + +// --------------------------------------------------------------------------- +// Closes the session. +// --------------------------------------------------------------------------- +// +EXPORT_C void RPSServ::Close() + { + RHandleBase::Close(); + } + +// --------------------------------------------------------------------------- +// Creates a preset. +// --------------------------------------------------------------------------- +// +EXPORT_C CPSPresetInterface* RPSServ::CreatePresetL( TInt aIndex, TUid aDataHandler ) + { + TPckgBuf id; + User::LeaveIfError( SendReceive( EPSOpCreatePreset, TIpcArgs( aIndex, aDataHandler.iUid, &id ) ) ); + + return CPSPresetInterface::CreateL( *this, id(), aDataHandler ); + } + +// --------------------------------------------------------------------------- +// Opens a preset. +// --------------------------------------------------------------------------- +// +EXPORT_C CPSPresetInterface* RPSServ::OpenPresetL( TInt aId ) + { + TPckgBuf dataHandler; + User::LeaveIfError( SendReceive( EPSOpGetPresetDataHandler, TIpcArgs( aId, &dataHandler ) ) ); + + return CPSPresetInterface::CreateL( *this, aId, TUid::Uid( dataHandler() ) ); + } + +// --------------------------------------------------------------------------- +// Deletes a preset. +// --------------------------------------------------------------------------- +// +EXPORT_C void RPSServ::DeletePresetL( TInt aId ) + { + User::LeaveIfError( SendReceive( EPSOpDeletePreset, TIpcArgs( aId ) ) ); + } + +// --------------------------------------------------------------------------- +// Moves a preset. +// --------------------------------------------------------------------------- +// +EXPORT_C void RPSServ::MovePresetL( TInt aId, TInt aDestinationIndex ) + { + User::LeaveIfError( SendReceive( EPSOpMovePreset, TIpcArgs( aId, aDestinationIndex) ) ); + } + +// --------------------------------------------------------------------------- +// Gets all presets. +// --------------------------------------------------------------------------- +// +EXPORT_C void RPSServ::GetPresetsL( RPointerArray& aPresets ) + { + GetPresetsL( aPresets, KNullUid ); + } + +// ======== GLOBAL FUNCTIONS ========