connectivitymodules/SeCon/catalogspcconnectivityplugin/src/catalogspcconnectivityclient.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:20:56 +0100
branchRCL_3
changeset 20 4a793f564d72
parent 0 d0791faffa3f
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201032 Kit: 201035

/*
* 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<TDataType> RCatalogsPCConnectivityClient::
SupportedMimeTypesL()
    {
    RPointerArray<TDataType> supportedMIMEs;
    TBool isThereMore = ETrue;
    TPckgBuf<TBool> pckgIsThereMore;
    TDataType* tempMIME = 0;
    TPckgBuf<TDataType> 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<TDataType> 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<TInt> pckgSize;
    TPckgBuf<TDataType> 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