PECengine/StorageManager2/ClientSrc/RPEngStorageClient.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/StorageManager2/ClientSrc/RPEngStorageClient.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,266 @@
+/*
+* Copyright (c) 2002 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:  Storage main client
+*
+*/
+
+
+// INCLUDE FILES
+#include "RPEngStorageClient.h"
+#include <eikdll.h>
+#include <f32file.h>
+
+#include "PEngServerStarter.h"
+#include "PEngStorageServerCommon.h"
+#include "TPEngStorageServerMessages.h"
+
+// PEC Engine internal constants
+#include "PEngPresenceEngineConsts2.h"
+#include "PEngInternalGlobalConsts.h"
+
+#include "PresenceDebugPrint.h"
+
+
+// CONSTANTS
+// each session can have several sub-session, while only one sub-session
+// is using asynchronous requests, 20 slots shall be enough to cover
+const TUint KMessageSlotCount = 20;
+
+
+// MACROS
+#define RETURN_IF_NOT_CONNECTED()\
+    if(!iConnected)\
+        {\
+        return KErrDisconnected;\
+        }
+
+#define RETURN_IF_NULL( desBuff )\
+    if ( !desBuff )\
+        {\
+        return KErrNoMemory;\
+        }
+
+// ============================ MEMBER FUNCTIONS ===============================
+// -----------------------------------------------------------------------------
+// RPEngStorageClient::RPEngStorageClient
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+RPEngStorageClient::RPEngStorageClient()
+    {
+    }
+
+// Destructor
+RPEngStorageClient::~RPEngStorageClient()
+    {
+    }
+
+// =============================================================================
+// =============Function of the client for Connection managing =================
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// RPEngStorageClient::Connect
+// -----------------------------------------------------------------------------
+//
+TInt RPEngStorageClient::Connect()
+    {
+    PENG_DP_TXT( "RPEngStorageClient::Connect()" );
+
+    //Connects this client to the server.
+    //Launches new server process if one not yet running.
+    TInt err = PEngServerStarter::ConnectServer( *this,
+                                                 KStorageServerName,
+                                                 Version(),
+                                                 KMessageSlotCount,
+                                                 KStorageServerExe );
+
+    iConnected = ( err == KErrNone );
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RPEngStorageClient::Close
+// -----------------------------------------------------------------------------
+//
+void RPEngStorageClient::Close()
+    {
+    PENG_DP_TXT( "RPEngStorageClient::Close()" );
+
+    // all requests from this session are canceled on the server side
+    RSessionBase::Close();
+    iConnected = EFalse;
+    }
+
+// =============================================================================
+// ============= New Function of the client  ===================================
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// RPEngStorageClient::SessionSlotState()
+// -----------------------------------------------------------------------------
+//
+TInt RPEngStorageClient::SessionSlotState(
+    const TDesC8& aSessionName,
+    HBufC8*& aSessionState,
+    TInt aInitSize )
+    {
+    RETURN_IF_NOT_CONNECTED();
+    TIpcArgs messArgs;
+    messArgs.Set( KMessageSlot0, &aSessionName );
+    aSessionState = HBufC8::New( aInitSize );
+    RETURN_IF_NULL( aSessionState );
+    TPtr8 sessState ( aSessionState->Des() );
+    messArgs.Set( KMessageSlot1, &sessState );
+    TInt err( SendReceive( EMainSessGetSessionState, messArgs ) );
+    // if error is positive, then buffer was not big enough
+    if ( err > KErrNone )
+        {
+        // realloc buffer, looks complicated, but safe, avoiding realloc
+        delete aSessionState;
+        aSessionState = NULL;
+        aSessionState = HBufC8::New( err );
+        RETURN_IF_NULL( aSessionState );
+        sessState.Set( aSessionState->Des() );
+        messArgs.Set( KMessageSlot1, &sessState );
+        err = SendReceive( EMainSessGetSessionState, messArgs );
+        }
+    // if there was error erase buffer
+    if ( err < KErrNone )
+        {
+        delete aSessionState;
+        aSessionState = NULL;
+        }
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RPEngStorageClient::AllSessionSlotsStates()
+// -----------------------------------------------------------------------------
+//
+TInt RPEngStorageClient::AllSessionSlotsStates(
+    HBufC8*& aSessionSlotsBuffer,
+    TInt aInitSize )
+    {
+    RETURN_IF_NOT_CONNECTED();
+    TIpcArgs messArgs;
+    aSessionSlotsBuffer = HBufC8::New( aInitSize );
+    RETURN_IF_NULL( aSessionSlotsBuffer );
+    TPtr8 sessStates ( aSessionSlotsBuffer->Des() );
+    messArgs.Set( KMessageSlot0, &sessStates );
+    TInt err( SendReceive( EMainSessGetAllSessionStates, messArgs ) );
+    // if error is positive, then buffer was not big enough
+    if ( err > KErrNone )
+        {
+        // realloc buffer, looks complicated, but safe, avoiding realloc
+        delete aSessionSlotsBuffer;
+        aSessionSlotsBuffer = NULL;
+        aSessionSlotsBuffer = HBufC8::New( err );
+        RETURN_IF_NULL( aSessionSlotsBuffer );
+        sessStates.Set( aSessionSlotsBuffer->Des() );
+        messArgs.Set( KMessageSlot1, &sessStates );
+        err = SendReceive( EMainSessGetAllSessionStates, messArgs );
+        }
+    // if there was error erase buffer
+    if ( err < KErrNone )
+        {
+        delete aSessionSlotsBuffer;
+        aSessionSlotsBuffer = NULL;
+        }
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RPEngStorageClient::ListenGlobalEvents()
+// -----------------------------------------------------------------------------
+//
+TInt RPEngStorageClient::ListenGlobalEvents()
+    {
+    RETURN_IF_NOT_CONNECTED();
+    return SendReceive( EMainSessListenGlobalEvents );
+    }
+
+// -----------------------------------------------------------------------------
+// RPEngStorageClient::ReloadGlobalEventListener()
+// -----------------------------------------------------------------------------
+//
+TInt RPEngStorageClient::ReloadGlobalEventListener(
+    TDes8& aGlobalEventBuffer,
+    TRequestStatus& aStatus )
+    {
+    RETURN_IF_NOT_CONNECTED();
+    TIpcArgs messArgs;
+    messArgs.Set( KMessageSlot0, EMainSessListenGlobalEvents );
+    messArgs.Set( KMessageSlot1, &aGlobalEventBuffer );
+    SendReceive( EMainSessReloadAsynchronousScout, messArgs, aStatus );
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// RPEngStorageClient::StopEventListening()
+// -----------------------------------------------------------------------------
+//
+TInt RPEngStorageClient::StopEventListening()
+    {
+    RETURN_IF_NOT_CONNECTED();
+    TIpcArgs messArgs;
+    messArgs.Set( KMessageSlot0, EMainSessListenGlobalEvents );
+    return SendReceive( EMainSessCancelRequest, messArgs );
+    }
+
+// -----------------------------------------------------------------------------
+// RPEngStorageClient::CreateSessionFolder()
+// -----------------------------------------------------------------------------
+//
+TInt RPEngStorageClient::CreateSessionFolder(
+    const TDesC8& aSessionSlot,
+    const TDesC16& aApplicationId )
+    {
+    RETURN_IF_NOT_CONNECTED();
+    TIpcArgs messArgs;
+    messArgs.Set( KMessageSlot0, &aSessionSlot );
+    messArgs.Set( KMessageSlot1, &aApplicationId );
+
+    return SendReceive( EMainSessCreateSessionFolder, messArgs );
+    }
+
+// -----------------------------------------------------------------------------
+// RPEngStorageClient::RemoveSessionFolder()
+// -----------------------------------------------------------------------------
+//
+TInt RPEngStorageClient::RemoveSessionFolder(
+    const TDesC8& aSessionSlot,
+    const TDesC16& aApplicationId )
+    {
+    RETURN_IF_NOT_CONNECTED();
+    TIpcArgs messArgs;
+    messArgs.Set( KMessageSlot0, &aSessionSlot );
+    messArgs.Set( KMessageSlot1, &aApplicationId );
+    return SendReceive( EMainSessRemoveSessionFolder, messArgs );
+    }
+
+
+// -----------------------------------------------------------------------------
+// RPEngStorageClient::Version()
+// -----------------------------------------------------------------------------
+//
+TVersion RPEngStorageClient::Version() const
+    {
+    return( TVersion( KClientVersionMajor,
+                      KClientVersionMinor,
+                      KClientVersionBuild ) );
+    }
+
+//  End of File
+