diff -r 0aa8cc770c8a -r 4a793f564d72 connectivitymodules/SeCon/clients/pcconn/src/sconpcconnclient.cpp --- /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 +#include + +// 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