diff -r 4096754ee773 -r 52a167391590 localconnectivityservice/obexserviceman/obexservicemanclient/src/ObexSMClient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/localconnectivityservice/obexserviceman/obexservicemanclient/src/ObexSMClient.cpp Wed Sep 01 12:20:40 2010 +0100 @@ -0,0 +1,271 @@ +/* +* Copyright (c) 2006-2007 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: obexservicemanager client class implementation +* +*/ + + +// INCLUDE FILES +#include "obexsmclient.h" +#include +#include "debug.h" + + +// CONSTANTS +const TInt KServerConnectRetries = 2; // How many times client tries to make connection to server + +// ======== LOCAL FUNCTIONS ======== + +// --------------------------------------------------------- +// StartThread +// +// Create the server thread/process depending on the framework. +// This function is exported from the DLL and called from the client +// RObexSMServer::Connect() -method. +// Returns: TInt: Error Code +// +// --------------------------------------------------------- + +TInt StartThread() + { + TRACE_FUNC + + TInt retVal = KErrNone; + // create server - if one of this name does not already exist + TFindServer findSrcs(KSrcsName); + TFullName name; + + if ( findSrcs.Next( name ) != KErrNone ) // we don't exist already + { + TRequestStatus started; + //TSrcsStart start( started ); + const TUidType serverUid( KNullUid,KNullUid,KSrcsUid ); + + // Then we have to create the server + // This depends on if we are in WINS or target HW environment. + + TRACE_INFO(_L("[SRCS]\tclient\tSrcs StartThread(): create the server")); + // We are on target HW or EKA2 WINS. + // New process has to be created for the SRCS + RProcess server; + retVal=server.Create(KSrcsName, // Full path to SRCS + KNullDesC, // Descriptor of parameters + serverUid); // Triplet UID of executable + + // Check the return value of process creation + if ( retVal != KErrNone ) + { + // Loading failed. + TRACE_ERROR((_L("[SRCS]\tclient\tSrcs StartThread(): process creation failed %d"), retVal)); + return retVal; + } + + TRACE_INFO(_L("[SRCS]\tclient\tSrcs StartThread(): Process created successfully")); + + + // Process/Thread has been created + // Now logon to the server + TRequestStatus stat; + //server.Logon(died); + server.Rendezvous(stat); + + if (stat!=KRequestPending) + { + server.Kill(0); // abort startup + //FTRACE(FPrint(_L("c\tclient\tSrcs abort startup.\n"))); + } + else + { + server.Resume(); // logon OK - start the server + //FTRACE(FPrint(_L("c\tclient\tSrcs Resumed.\n"))); + } + + // Then wait the start or death of the server. + User::WaitForRequest(stat); + + // we can't use the 'exit reason' if the server panicked as this + // is the panic 'reason' and may be '0' which cannot be distinguished + // from KErrNone + TRACE_INFO((_L("[SRCS]\tclient\tSrcs Server started, code %d (0=>success)\n"), stat.Int())); + retVal=(server.ExitType()==EExitPanic) ? KErrGeneral : stat.Int(); + + server.Close(); + TRACE_INFO(_L("[SRCS]\tclient\tSrcs server handle closed.")); + } + + return retVal; + } + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------------------------- +// Default constructor +// --------------------------------------------------------------------------- +// +RObexSMServer::RObexSMServer() + { + } + + +// --------------------------------------------------------- +// Connect +// Handles connection to server( creates session ) +// --------------------------------------------------------- +// +TInt RObexSMServer::Connect() + { + TRACE_FUNC + + // IF there is allready a session handle, + // no other session is created. + if ( Handle() ) + { + return KErrAlreadyExists; + } + + // Else try to create a new session with server + TInt retry= KServerConnectRetries; + + FOREVER + { + // Try to make session with server + TInt retVal=CreateSession(KSrcsName,Version()); + TRACE_INFO((_L("[SRCS]\tclient\tRSrcs: create Session returned: %d"), retVal)); + if ( retVal != KErrNotFound && retVal != KErrServerTerminated ) + { + // Error which can't be handled happened. + return retVal; + } + // Decrease count + --retry; + if ( retry == 0 ) + { + return retVal; + } + + // Try to start the server + TRACE_INFO(_L("[SRCS]\tclient\tRSrcs::Connect(): try to start server")); + retVal=StartThread(); + TRACE_INFO((_L("[SRCS]\tclient\tRSrcs: StartThread returned: %d"), retVal)); + + if ( retVal != KErrNone && retVal != KErrAlreadyExists ) + { + // Error can't be handled. + return retVal; + } + } + + } + +// --------------------------------------------------------- +// Version +// Defines server version number +// --------------------------------------------------------- +// +TVersion RObexSMServer::Version() const + { + TRACE_FUNC + return( TVersion( KSrcsMajorVersionNumber, + KSrcsMinorVersionNumber, + KSrcsBuildVersionNumber )); + } + +// --------------------------------------------------------- +// ManageServices +// Sends Manage services command to SRCS. +// --------------------------------------------------------- +// +TInt RObexSMServer::ManageServices(TLocodBearer aBearer, TBool aBearStatus,TRequestStatus &aStatus ) + { + TRACE_FUNC + TInt retVal = KErrNone; + + TPckgBuf pckg; + TIpcArgs args( &pckg, NULL, NULL ); + TSrcsServRequest request; + + switch(aBearer) + { + case ELocodBearerBT: + { + if(aBearStatus) + { + request=ESrcsBTServicesON; + } + else + { + request=ESrcsBTServicesOFF; + } + } + break; + case ELocodBearerIR: + { + if(aBearStatus) + { + request=ESrcsIrDAServicesON; + } + else + { + request=ESrcsIrDAServicesOFF; + } + } + break; + case ELocodBearerUSB: + { + if(aBearStatus) + { + request=ESrcsStartUSB; + } + else + { + request=ESrcsStopUSB; + } + } + break; + default: + { + TRACE_ERROR(_L("[SRCS]\tclient\tRSrcs Manageservice: Bad bearer")); + return KErrArgument; + } + } + if ( Handle() ) + { + SendReceive( request, args, aStatus ); + } + else + { + TRACE_ERROR(_L("[SRCS]\tclient\tRSrcs ManageBTServices. No Handle")); + retVal = KErrBadHandle; + } + return retVal; + } + +// --------------------------------------------------------- +// CancelRequest +// --------------------------------------------------------- +// +void RObexSMServer::CancelRequest() + { + TPckgBuf pckg; + TIpcArgs args( &pckg, NULL, NULL ); + TSrcsServRequest request; + request=ESrcsCancelRequest; + if ( Handle() ) + { + SendReceive( request, args ); + } + + } +//end of file +