connectivitymodules/SeCon/clients/pcconn/src/sconpcconnclient.cpp
branchRCL_3
changeset 43 4a793f564d72
parent 0 d0791faffa3f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/connectivitymodules/SeCon/clients/pcconn/src/sconpcconnclient.cpp	Wed Sep 01 12:20:56 2010 +0100
@@ -0,0 +1,304 @@
+/*
+* Copyright (c) 2005-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:  PC Connectivity client
+*
+*/
+
+
+
+// -----------------------------------------------------------------------------
+// Includes
+// -----------------------------------------------------------------------------
+#include <e32base.h>
+#include <s32mem.h>
+
+// Client - server 
+#include "sconpcconnclient.h"
+#include "sconpcconnclientserver.h"
+#include "debug.h"
+
+// -----------------------------------------------------------------------------
+// RSConPCConnSession::RSConPCConnSession()
+// Default constructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C RSConPCConnSession::RSConPCConnSession()
+    {
+    TRACE_FUNC;
+    }
+
+// -----------------------------------------------------------------------------
+// RSConPCConnSession::~RSConPCConnSession()
+// Default destructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C RSConPCConnSession::~RSConPCConnSession()
+    {
+    TRACE_FUNC;
+    }
+
+// -----------------------------------------------------------------------------
+// RSConPCConnSession::Connect()
+// Creates a chunk and server, starts the server connection
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSConPCConnSession::Connect()
+    {
+    TRACE_FUNC_ENTRY;
+ 	
+    TInt ret ( KErrNone );
+
+    ret = CreateSession(KSConPCConnServerName,Version());
+    
+    if ( ret == KErrNotFound || ret == KErrServerTerminated )
+    	{
+    	ret = LaunchServer();
+    	
+    	if ( ret == KErrNone || ret == KErrAlreadyExists )
+    		{
+    		ret = CreateSession( KSConPCConnServerName, Version() );
+    		}
+    	}
+    	
+    if ( ret == KErrNone )
+    	{
+    	ret = CreateAndSendChunkHandle();
+    	if ( ret != KErrNone )
+    	    {
+    	    LOGGER_WRITE("CreateAndSendChunkHandle failed, close session");
+    	    Close();
+    	    }
+    	}
+    
+    LOGGER_WRITE_1( "RSConPCConnSession::Connect() : returned %d", ret );
+    return ret; 
+    }
+
+// -----------------------------------------------------------------------------
+// RSConPCConnSession::Close()
+// Closes the server connection
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSConPCConnSession::Close()
+    {
+    TRACE_FUNC_ENTRY;
+    iChunk.Close();
+    RSessionBase::Close();
+    TRACE_FUNC_EXIT;
+    }
+
+// -----------------------------------------------------------------------------
+// RSConPCConnSession::Version()
+// Returns the version of the client
+// -----------------------------------------------------------------------------
+//	
+TVersion RSConPCConnSession::Version(void) const
+    {
+    return (TVersion(KSConPCConnServerVersionMajor, 
+                               KSConPCConnServerVersionMinor, 
+                               KSConPCConnServerVersionBuild));
+    }
+
+// -----------------------------------------------------------------------------
+// RSConPCConnSession::Version()
+// Forwards a PUT -message to the server
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C TInt RSConPCConnSession::PutPacketL( 
+    const TDesC& aNameHeader, const TDesC8& aTypeHeader, CBufFlat*& aBuffer )
+    {
+    TRACE_FUNC_ENTRY;
+
+    if ( !aBuffer )
+        {
+        return KErrArgument;
+        }
+
+    if ((aBuffer->Size() + aTypeHeader.Size() + 
+         aNameHeader.Size()) > KSConPCConnChunkMaxSize)
+        {
+        LOGGER_WRITE( "RSConPCConnSession::PutPacketL() :\
+         WBXML document too big" );
+        return KErrTooBig;
+        }
+	
+    TInt ret (KErrNone);
+    iChunk.Adjust( KSConPCConnChunkMaxSize );
+    RMemWriteStream buf( iChunk.Base(), iChunk.Size() );
+	
+    buf.WriteInt32L( aNameHeader.Size() );
+    buf.WriteL( aNameHeader );
+
+    buf.WriteInt32L( aTypeHeader.Size() );
+    buf.WriteL( aTypeHeader );
+	
+    // WBXML document	
+    buf.WriteInt32L( aBuffer->Size() );
+    buf.WriteL( aBuffer->Ptr(0) );
+    buf.CommitL();
+    buf.Close();
+    
+    TIpcArgs args;
+    ret = SendReceive ( EPutMessage, args );
+
+    LOGGER_WRITE_1( "RSConPCConnSession::PutPacketL() : returned %d", ret );
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// RSConPCConnSession::Version()
+// Forwards a GET -message to the server
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C TInt RSConPCConnSession::GetPacketL( 
+    const TDesC& aNameHeader, const TDesC8& aTypeHeader, CBufFlat*& aBuffer )
+    {
+    TRACE_FUNC_ENTRY;
+
+    if ( !aBuffer )
+        {
+        return KErrArgument;
+        }
+
+    TInt ret (KErrNone);
+	
+    iChunk.Adjust( KSConPCConnChunkMaxSize);
+    RMemWriteStream writeBuf( iChunk.Base(), iChunk.Size() );
+    writeBuf.WriteInt32L( aNameHeader.Size() );
+    writeBuf.WriteL( aNameHeader );
+    
+    writeBuf.WriteInt32L( aTypeHeader.Size() );
+    writeBuf.WriteL( aTypeHeader );
+
+    writeBuf.CommitL();
+    writeBuf.Close();
+    
+    TIpcArgs args;
+    ret = SendReceive ( EGetMessage, args );
+
+    if ( ret != KErrNone) 
+        {
+        LOGGER_WRITE_1( "RSConPCConnSession::GetPacketL() :\
+         Send Receive failed with code %d", ret );
+        return ret;
+        };
+	
+    // copy data from the chunk
+    RMemReadStream readBuf( iChunk.Base(), iChunk.Size() );
+    TInt32 length ( 0 );
+
+    aBuffer->Reset();
+    length = readBuf.ReadInt32L();
+	
+    HBufC8* data = HBufC8::NewLC( length );
+    TPtr8 dataPtr = data->Des();
+	
+    readBuf.ReadL( dataPtr, length );
+    aBuffer->ExpandL( 0, length );
+    aBuffer->Write ( 0, dataPtr );
+	
+    readBuf.Close();
+	
+    CleanupStack::PopAndDestroy(); // data;
+
+    LOGGER_WRITE_1( "RSConPCConnSession::GetPacketL()\
+     : returned %d", ret );
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// RSConPCConnSession::Version()
+// Forwards a Reset -message to the server
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C TInt RSConPCConnSession::ResetServer()
+    {
+    TRACE_FUNC_ENTRY;
+    TInt ret ( KErrNone );
+    TIpcArgs args;
+    ret = SendReceive ( EResetMessage, args );
+    LOGGER_WRITE_1( "RSConPCConnSession::ResetServerL(): ret %d", ret );
+    return ret;
+    }
+    
+// -----------------------------------------------------------------------------
+// RSConPCConnSession::LaunchServer()
+// Launches the server
+// -----------------------------------------------------------------------------
+//	
+TInt RSConPCConnSession::LaunchServer()
+	{
+	TRACE_FUNC_ENTRY;
+	TInt ret( KErrNone );
+    
+    // Create server
+    RProcess p;
+    ret = p.Create(KSConPCConnServerExe, KNullDesC);
+    
+    if ( ret != KErrNone )
+        {
+        // Loading failed.
+        LOGGER_WRITE_1( "RProcess::Create failed, err: %d", ret );
+        return ret;
+        }
+    
+    
+    TRequestStatus status;
+    p.Rendezvous( status );
+    
+    if ( status != KRequestPending )
+        {
+        p.Kill(0);		// abort startup
+        p.Close();
+        LOGGER_WRITE("Abort startup, return KErrGeneral");
+        return KErrGeneral;   
+        }
+    else
+        {
+        p.Resume();	// logon OK - start the server
+        }
+    
+    User::WaitForRequest(status);
+    
+    p.Close();
+    
+	LOGGER_WRITE_1( "RSConPCConnSession::LaunchServerL(): returned %d", status.Int() );
+    return status.Int();
+	}
+	
+// -----------------------------------------------------------------------------
+// RSConPCConnSession::CreateAndSendChunkHandle()
+// Creates a chunk and sends a handle to server
+// -----------------------------------------------------------------------------
+//	
+TInt RSConPCConnSession::CreateAndSendChunkHandle()
+	{
+	TRACE_FUNC_ENTRY;
+	TInt err = iChunk.CreateGlobal( KNullDesC, 
+                                    KSConPCConnChunkSize, 
+                                    KSConPCConnChunkMaxSize );
+    if ( err != KErrNone )
+        {
+        LOGGER_WRITE_1("iChunk.CreateGlobal failed, err: %d", err);
+        return err;
+        }                           
+    TIpcArgs args;
+ 	args.Set( 0, iChunk );
+ 	err = SendReceive( EChunkMessage, args );
+    
+    LOGGER_WRITE_1("RSConPCConnSession::CreateAndSendChunkHandle : returned: %d", err);
+    return err;
+	}
+	
+// End of file