diff -r 0aa8cc770c8a -r 4a793f564d72 connectivitymodules/SeCon/catalogspcconnectivityplugin/src/catalogspcconnectivityclient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/catalogspcconnectivityplugin/src/catalogspcconnectivityclient.cpp Wed Sep 01 12:20:56 2010 +0100 @@ -0,0 +1,229 @@ +/* +* Copyright (c) 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: Client that communicate with CatalogsEnginePCClientFrontEnd +* +*/ + + +#include "catalogspcconnectivityclient.h" +#include "catalogspcconnectivitydefines.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +RCatalogsPCConnectivityClient::RCatalogsPCConnectivityClient() + { + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +RCatalogsPCConnectivityClient::~RCatalogsPCConnectivityClient() + { + } + +// --------------------------------------------------------------------------- +// Start server and create session with server +// --------------------------------------------------------------------------- +// +TInt RCatalogsPCConnectivityClient::Connect() + { + TInt err = StartServer(); + + if ( err == KErrNone ) + { + err = CreateSession( + KCatalogsPCConnectivityServerName, + Version(), + KCatalogsPCConnectivityDefaultMessageSlots ); + } + return err; + } + +// --------------------------------------------------------------------------- +// Close session (After session is closed will server be closed too) +// --------------------------------------------------------------------------- +// +void RCatalogsPCConnectivityClient::Close() + { + RHandleBase::Close(); + } + +// --------------------------------------------------------------------------- +// Give MIME types supported by this Module +// --------------------------------------------------------------------------- +// +RPointerArray RCatalogsPCConnectivityClient:: +SupportedMimeTypesL() + { + RPointerArray supportedMIMEs; + TBool isThereMore = ETrue; + TPckgBuf pckgIsThereMore; + TDataType* tempMIME = 0; + TPckgBuf pckgMIME; + + while( isThereMore ) + { + User::LeaveIfError( SendReceive( + ECatalogsPCConnectivitySupportedMimeTypes, + TIpcArgs( &pckgMIME, &pckgIsThereMore ) ) ); + isThereMore = pckgIsThereMore(); + tempMIME = new( ELeave ) TDataType( pckgMIME() ); + User::LeaveIfError( supportedMIMEs.Append( tempMIME ) ); + } + + return supportedMIMEs; + } + +// --------------------------------------------------------------------------- +// Data package from CatalogsPCConnectivityPlugin +// --------------------------------------------------------------------------- +// +void RCatalogsPCConnectivityClient::PutDataL( + const TDataType& aMimeType, const CBufFlat& aData ) + { + TInt size = aData.Size(); + + RBuf8 desData; + desData.CreateL( size ); + desData.CleanupClosePushL(); + aData.Read( 0, desData, size ); + TPckgBuf pckgMIME( aMimeType ); + + User::LeaveIfError( SendReceive( + ECatalogsPCConnectivityPutData, + TIpcArgs( &pckgMIME, &desData, size ) ) ); + + CleanupStack::Pop(); //desData + desData.Close(); + } + +// --------------------------------------------------------------------------- +// Data request from CatalogsPCConnectivityPlugin +// First ask the size from server, then give correct size CBufFlat +// --------------------------------------------------------------------------- +// +void RCatalogsPCConnectivityClient::GetDataL( + TDataType& aMimeType, CBufFlat& aData ) + { + TPckgBuf pckgSize; + TPckgBuf pckgMIME; + + User::LeaveIfError( SendReceive( + ECatalogsPCConnectivityGetSize, + TIpcArgs( &pckgMIME, &pckgSize ) ) ); + + TInt size = pckgSize(); + aMimeType = pckgMIME(); + + RBuf8 desData; + desData.CreateL( size ); + desData.CleanupClosePushL(); + + User::LeaveIfError( SendReceive( + ECatalogsPCConnectivityGetData, + TIpcArgs( &desData ) ) ); + + aData.Reset(); + aData.ExpandL( 0, size ); + aData.Write( 0, desData, size ); + + CleanupStack::Pop(); //desData + desData.Close(); + } + +// --------------------------------------------------------------------------- +// Return version number +// --------------------------------------------------------------------------- +// +TVersion RCatalogsPCConnectivityClient::Version() const + { + return( TVersion( KCatalogsPCConnectivityMajorVersionNumber, + KCatalogsPCConnectivityMinorVersionNumber, + KCatalogsPCConnectivityBuildVersionNumber ) ); + } + +// --------------------------------------------------------------------------- +// Start server if it isn't running already +// --------------------------------------------------------------------------- +// +TInt RCatalogsPCConnectivityClient::StartServer() + { + // Check if the server is already running + TFindServer findServer( KCatalogsPCConnectivityServerName ); + TFullName name; + + TInt result = findServer.Next( name ); + if ( result == KErrNone ) + { + // Server is running + return KErrNone; + } + + // Create a semaphore so we can wait while the server starts + RSemaphore semaphore; + result = semaphore.CreateGlobal( + KCatalogsPCConnectivityServerSemaphoreName, 0 ); + if ( result != KErrNone ) + { + return result; + } + + // Create new Engine service process + result = CreateServerProcess(); + if ( result != KErrNone ) + { + semaphore.Close(); + return result; + } + + // Wait while the server starts + semaphore.Wait(); + + // Semaphore has been signaled, close and return + semaphore.Close(); + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// Create server process +// --------------------------------------------------------------------------- +// +TInt RCatalogsPCConnectivityClient::CreateServerProcess() + { + + RProcess server; + + TInt result = server.Create( + KCatalogsPCConnectivityServerFilename, KNullDesC ); + if ( result != KErrNone ) + { + return result; + } + + // Resume server thread and close handle + server.Resume(); + server.Close(); + + return KErrNone; + } + + +//end