userlibandfileserver/fileserver/shostmassstorage/msproxy/hostusbmsfactory.cpp
changeset 0 a41df078684a
child 297 b2826f67641f
equal deleted inserted replaced
-1:000000000000 0:a41df078684a
       
     1 // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of the License "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 /**
       
    17  @file
       
    18  @internalTechnology
       
    19 */
       
    20 
       
    21 #include <f32fsys.h>
       
    22 #include <e32property.h>
       
    23 
       
    24 #include "hostusbmsproxy.h"
       
    25 #include "hostusbmsfactory.h"
       
    26 #include "debug.h"
       
    27 
       
    28 CUsbHostMsProxyDriveFactory::CUsbHostMsProxyDriveFactory()
       
    29 	{
       
    30 	__MSFNSLOG
       
    31 	}
       
    32 
       
    33 CUsbHostMsProxyDriveFactory::~CUsbHostMsProxyDriveFactory()
       
    34 	{
       
    35 	__MSFNSLOG
       
    36 	}
       
    37 
       
    38 TInt CUsbHostMsProxyDriveFactory::Install()
       
    39 	{
       
    40 	__MSFNSLOG
       
    41 	_LIT(KLoggerName,"usbhostms");
       
    42 	return SetName(&KLoggerName);
       
    43 	}
       
    44 
       
    45 TInt CUsbHostMsProxyDriveFactory::CreateProxyDrive(CProxyDrive*& aMountProxyDrive,CMountCB* aMount)
       
    46 	{
       
    47 	__MSFNSLOG
       
    48     aMountProxyDrive = new CUsbHostMsProxyDrive(aMount,this);
       
    49     return (aMountProxyDrive==NULL) ? KErrNoMemory : KErrNone;
       
    50 	}
       
    51 
       
    52 
       
    53 extern "C" {
       
    54 
       
    55 
       
    56 /* 
       
    57 Create the proxy drive factory object for the usbhost mass storage proxy
       
    58 */
       
    59 EXPORT_C CExtProxyDriveFactory* CreateFileSystem()
       
    60 	{
       
    61 	__MSFNSLOG
       
    62 	return new CUsbHostMsProxyDriveFactory();
       
    63 	}
       
    64 }
       
    65 
       
    66 /*
       
    67 This function will be called to kick off a speculative probe for USB mass storage devices.
       
    68 This function issues an application session request (through publish and subscribe) to the USB manager.
       
    69 Upon USB Manager receiving this application session request in consent with the USB watcher application,
       
    70 the Bus request is passed to the OTG  component to bringup the VBus, thus enumerating the mass storage
       
    71 devices Upon enumerating the FDF will communicate with the Mount Manager which will allocate mass storage 
       
    72 drives for the logical units and continues drive access through the Usb host mass storage proxy drive.
       
    73 
       
    74 Ps: Note that the this request cant be handled by the MSC since, in the scenario where MSC is not running
       
    75 initially, the request will try to create the process. Creation of process will involve the file server inturn
       
    76 to load the MSC binary (.exe) to run. Since the RMessages are handled sequentially, the file server would not
       
    77 be able to service the request until the AsyncEnuerate is completed. Where, the process creation will wait 
       
    78 for the rendezvous to complete creating the deadlock situation. Hence the application session request is handled
       
    79 in the factory object itself!
       
    80 */
       
    81 void CUsbHostMsProxyDriveFactory::AsyncEnumerate()
       
    82 {
       
    83 	__MSFNSLOG
       
    84 
       
    85 	RProperty prop;
       
    86 	TInt ret;
       
    87 
       
    88 	/* The property category is the USB manager */
       
    89 	const TUid KUidUsbManCategory={0x101fe1db};
       
    90 	/* The Key used is #6 for the Usb request session */
       
    91 	const TInt KUsbRequestSessionProperty = 6;
       
    92 
       
    93 	/* By this time the property should be available and allow us to get the handle.
       
    94 		If the property is not created (for some reason), we do not have anything to do */
       
    95 	ret = prop.Attach(KUidUsbManCategory, KUsbRequestSessionProperty);
       
    96     __PXYPRINT1(_L("Property attach returned %d"),ret);
       
    97 	if(ret == KErrNone)
       
    98     {
       
    99 		/* The Usb Manager does not evaluate the value passed through this property. 
       
   100 			We pass 1 (an arbitary value) for completion */
       
   101 		ret = prop.Set(KUidUsbManCategory, KUsbRequestSessionProperty, 1); 
       
   102 	     __PXYPRINT1(_L("Property set returned %d"),ret);
       
   103 		prop.Close();
       
   104 	}
       
   105 }
       
   106