diff -r 000000000000 -r c9bc50fca66e usbmgmt/usbmgr/host/functiondrivers/ms/msmm/client/src/msmmclient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usbmgmt/usbmgr/host/functiondrivers/ms/msmm/client/src/msmmclient.cpp Tue Feb 02 02:02:59 2010 +0200 @@ -0,0 +1,196 @@ +/* +* Copyright (c) 2008-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: +* +*/ + +/** + @file + @internalComponent +*/ + +#include "msmmclient.h" +#include + +#include + +#include "srvdef.h" + +#ifdef __FLOG_ACTIVE +_LIT8(KLogComponent, "UsbHostMsmmClient"); +#endif + +// Costants +const TInt KConnectRetry = 0x2; + +//--------------------------------------------------------------------------- +// +// NON-MEMBER FUNCTIONS + +static TInt StartServer() + { + LOG_STATIC_FUNC_ENTRY + + TInt ret = KErrNone; + + // Create the server process + const TUidType serverUid(KNullUid, KNullUid, KMsmmServUid); + RProcess server; + _LIT(KNullCommand,""); + ret = server.Create(KMsmmServerBinaryName, KNullCommand, serverUid); + + // Was server process created OK? + if (KErrNone != ret) + { + return ret; + } + + // Set up Rendezvous so that server thread can signal correct startup + TRequestStatus serverDiedRequestStatus; + server.Rendezvous(serverDiedRequestStatus); + + // Status flag should still be pending as we haven't + // resumed the server yet! + if (serverDiedRequestStatus != KRequestPending) + { + server.Kill(0); // abort the startup here + } + else + { + server.Resume(); // start server + } + + User::WaitForRequest(serverDiedRequestStatus); + + // determine the reason for the server exit + TInt exitReason = (EExitPanic == server.ExitType()) ? + KErrGeneral : serverDiedRequestStatus.Int(); + server.Close(); + return exitReason; + } + +//--------------------------------------------------------------------------- +// RMsmmSession +// +// Public member functions + +EXPORT_C TInt RMsmmSession::Connect() + { + LOG_FUNC + + TInt retry = KConnectRetry; // Attempt connect twice then give up + TInt ret(KErrNone); + FOREVER + { + ret = CreateSession(KMsmmServerName, Version(), KDefaultMessageSlots); + if ((KErrNotFound != ret) && (KErrServerTerminated != ret)) + { + break; + } + + if ((--retry) == 0) + { + break; + } + + ret = StartServer(); + if ((KErrNone != ret) && (KErrAlreadyExists != ret)) + { + break; + } + } + + if (KErrNone != ret) + { + LOGTEXT2(_L("Underlying error value = %d"), ret) + ret = KErrCouldNotConnect; + } + + return ret; + } + +EXPORT_C TInt RMsmmSession::Disconnect() + { + LOG_FUNC + + Close(); + return KErrNone; + } + +// Called to provide the version number of the server we require for this API +EXPORT_C TVersion RMsmmSession::Version() const + { + LOG_FUNC + + return TVersion(KMsmmServMajorVersionNumber, + KMsmmServMinorVersionNumber, + KMsmmServBuildVersionNumber); + } + +EXPORT_C TInt RMsmmSession::AddFunction( + const TUSBMSDeviceDescription& aDevice, + TUint8 aInterfaceNumber, TUint32 aInterfaceToken) + { + LOG_FUNC + + TInt ret(KErrNone); + + TIpcArgs usbmsIpcArgs; + iDevicePkg = aDevice; // Package the device description + usbmsIpcArgs.Set(0, &iDevicePkg); + usbmsIpcArgs.Set(1, aInterfaceNumber); + usbmsIpcArgs.Set(2, aInterfaceToken); + + ret = SendReceive(EHostMsmmServerAddFunction, usbmsIpcArgs); + + return ret; + } + +EXPORT_C TInt RMsmmSession::RemoveDevice(TUint aDevice) + { + LOG_FUNC + + TInt ret(KErrNone); + + TIpcArgs usbmsIpcArgs(aDevice); + + ret = SendReceive(EHostMsmmServerRemoveDevice, usbmsIpcArgs); + + return ret; + } + +EXPORT_C TInt RMsmmSession::__DbgFailNext(TInt aCount) + { + LOG_FUNC + +#ifdef _DEBUG + return SendReceive(EHostMsmmServerDbgFailNext, TIpcArgs(aCount)); +#else + (void)aCount; + return KErrNone; +#endif + } + +EXPORT_C TInt RMsmmSession::__DbgAlloc() + { + LOG_FUNC + +#ifdef _DEBUG + return SendReceive(EHostMsmmServerDbgAlloc); +#else + return KErrNone; +#endif + } + +// End of file