sl@0: // Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of the License "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // Implements a Session of a Symbian OS server for the RUsbMassStorage API sl@0: // sl@0: // sl@0: sl@0: sl@0: sl@0: /** sl@0: @file sl@0: @internalTechnology sl@0: */ sl@0: sl@0: #include sl@0: #include sl@0: sl@0: #include "usbmsshared.h" sl@0: #include "mstypes.h" sl@0: #include "msctypes.h" sl@0: #include "cusbmassstoragesession.h" sl@0: #include "cusbmassstoragecontroller.h" sl@0: #include "cusbmassstorageserver.h" sl@0: sl@0: #include "debug.h" sl@0: #include "msdebug.h" sl@0: sl@0: /** sl@0: Construct a Symbian OS session object. sl@0: sl@0: @param aServer Service the session will be a member of sl@0: @param aMessage The message from the client. sl@0: @return A new CUsbMassStorageSession object sl@0: */ sl@0: CUsbMassStorageSession* CUsbMassStorageSession::NewL(CUsbMassStorageServer& aServer) sl@0: { sl@0: __MSFNSLOG sl@0: CUsbMassStorageSession* r = new (ELeave) CUsbMassStorageSession(aServer); sl@0: CleanupStack::PushL(r); sl@0: r->ConstructL(); sl@0: CleanupStack::Pop(); sl@0: return r; sl@0: } sl@0: sl@0: /** sl@0: Constructor. sl@0: sl@0: @param aServer Service the session will be a member of sl@0: */ sl@0: CUsbMassStorageSession::CUsbMassStorageSession(CUsbMassStorageServer& aServer) sl@0: : iUsbMsServer(aServer) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: /** sl@0: 2nd Phase Construction. sl@0: */ sl@0: void CUsbMassStorageSession::ConstructL() sl@0: { sl@0: __MSFNLOG sl@0: iUsbMsServer.IncrementSessionCount(); sl@0: if (iUsbMsServer.SessionCount() > 1) sl@0: { sl@0: __PRINT1(_L("\tiSessionCount: %d\n"), iUsbMsServer.SessionCount()); sl@0: // Only one session is allowed sl@0: User::Leave(KErrInUse); sl@0: } sl@0: } sl@0: sl@0: sl@0: /** sl@0: Destructor. sl@0: */ sl@0: CUsbMassStorageSession::~CUsbMassStorageSession() sl@0: { sl@0: __MSFNLOG sl@0: iUsbMsServer.DecrementSessionCount(); sl@0: } sl@0: sl@0: /** sl@0: Called when a message is received from the client. sl@0: sl@0: @param aMessage Message received from the client sl@0: */ sl@0: void CUsbMassStorageSession::ServiceL(const RMessage2& aMessage) sl@0: { sl@0: __MSFNLOG sl@0: DispatchMessageL(aMessage); sl@0: } sl@0: sl@0: /** sl@0: Handles the request (in the form of a the message) received from the client sl@0: sl@0: @internalTechnology sl@0: @param aMessage The received message sl@0: */ sl@0: void CUsbMassStorageSession::DispatchMessageL(const RMessage2& aMessage) sl@0: { sl@0: __MSFNLOG sl@0: TInt ret = KErrNone; sl@0: sl@0: switch (aMessage.Function()) sl@0: { sl@0: case EUsbMsStart: sl@0: ret = Start(aMessage); sl@0: break; sl@0: case EUsbMsStop: sl@0: ret = Stop(); sl@0: break; sl@0: case EUsbMsShutdown: sl@0: ret = Shutdown(); sl@0: break; sl@0: sl@0: default: sl@0: aMessage.Panic(KUsbMsCliPncCat, EUsbMsPanicIllegalIPC); sl@0: break; sl@0: } sl@0: sl@0: aMessage.Complete(ret); sl@0: } sl@0: sl@0: /** sl@0: Client request to start the device. sl@0: sl@0: @return Any error that occurred or KErrNone sl@0: */ sl@0: TInt CUsbMassStorageSession::Start(const RMessage2& aMessage) sl@0: { sl@0: __MSFNLOG sl@0: __PRINT(_L("CUsbMassStorageSession::Start\n")); sl@0: sl@0: TMassStorageConfig msConfig; sl@0: TRAPD(err, GetMsConfigL(aMessage, msConfig)); sl@0: if (err != KErrNone) sl@0: { sl@0: __PRINT(_L("Failed to get mass storage configuration data\n")); sl@0: return err; sl@0: } sl@0: sl@0: return iUsbMsServer.Controller().Start(msConfig); sl@0: } sl@0: sl@0: /** sl@0: Client request to stop the device. sl@0: sl@0: @return Any error that occurred or KErrNone sl@0: */ sl@0: TInt CUsbMassStorageSession::Stop() sl@0: { sl@0: __MSFNLOG sl@0: TInt err = iUsbMsServer.Controller().Stop(); sl@0: return err; sl@0: } sl@0: sl@0: /** sl@0: Client request to shut down the server sl@0: sl@0: @return KErrNone sl@0: */ sl@0: TInt CUsbMassStorageSession::Shutdown() sl@0: { sl@0: __MSFNLOG sl@0: CActiveScheduler::Stop(); sl@0: return KErrNone; sl@0: } sl@0: sl@0: /** sl@0: Get mass storage configuration data from the received message sl@0: */ sl@0: void CUsbMassStorageSession::GetMsConfigL(const RMessage2& aMessage, TMassStorageConfig& aMsStorage) sl@0: { sl@0: __MSFNLOG sl@0: aMessage.ReadL(0,aMsStorage.iVendorId); sl@0: aMessage.ReadL(1,aMsStorage.iProductId); sl@0: aMessage.ReadL(2,aMsStorage.iProductRev); sl@0: }