usbmgmt/usbmgr/usbman/server/SRC/CUsbServer.cpp
branchRCL_3
changeset 16 012cc2ee6408
parent 15 f92a4f87e424
equal deleted inserted replaced
15:f92a4f87e424 16:012cc2ee6408
     1 /*
     1 /*
     2 * Copyright (c) 1997-2010 Nokia Corporation and/or its subsidiary(-ies).
     2 * Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
     3 * All rights reserved.
     3 * All rights reserved.
     4 * This component and the accompanying materials are made available
     4 * This component and the accompanying materials are made available
     5 * under the terms of "Eclipse Public License v1.0"
     5 * under the terms of "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     6 * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
    19 /**
    19 /**
    20  @file
    20  @file
    21 */
    21 */
    22 
    22 
    23 #include <e32svr.h>
    23 #include <e32svr.h>
    24 #include <usb/usblogger.h>
       
    25 #include "UsbSettings.h"
    24 #include "UsbSettings.h"
    26 #include "CUsbServer.h"
    25 #include "CUsbServer.h"
    27 #include "CUsbSession.h"
    26 #include "CUsbSession.h"
    28 #include "CUsbDevice.h"
    27 #include "CUsbDevice.h"
    29 
    28 
    30 #ifdef SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
    29 #ifdef SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
    31 #include <e32property.h> //Publish & Subscribe header
       
    32 #include "CUsbOtg.h"
    30 #include "CUsbOtg.h"
    33 #include "cusbhost.h"
    31 #include "cusbhost.h"
       
    32 #include <e32property.h> //Publish & Subscribe header
    34 #endif // SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
    33 #endif // SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
    35 
    34 
       
    35 #include <usb/usblogger.h>
    36 #include "UsbmanServerSecurityPolicy.h"
    36 #include "UsbmanServerSecurityPolicy.h"
    37 #include "OstTraceDefinitions.h"
    37 #include <usb/usblogger.h>
    38 #ifdef OST_TRACE_COMPILER_IN_USE
    38 
    39 #include "CUsbServerTraces.h"
    39 #ifdef __FLOG_ACTIVE
    40 #endif
    40 _LIT8(KLogComponent, "USBSVR");
    41 
    41 #endif
    42 
       
    43 
    42 
    44 /**
    43 /**
    45  * The CUsbServer::NewL method
    44  * The CUsbServer::NewL method
    46  *
    45  *
    47  * Constructs a Usb Server
    46  * Constructs a Usb Server
    50  *
    49  *
    51  * @return	A new Usb Server object
    50  * @return	A new Usb Server object
    52  */
    51  */
    53 CUsbServer* CUsbServer::NewLC()
    52 CUsbServer* CUsbServer::NewLC()
    54 	{
    53 	{
    55 	OstTraceFunctionEntry0( CUSBSERVER_NEWLC_ENTRY );
    54 	LOG_STATIC_FUNC_ENTRY
    56 
    55 
    57 	CUsbServer* self = new(ELeave) CUsbServer;
    56 	CUsbServer* self = new(ELeave) CUsbServer;
    58 	CleanupStack::PushL(self);
    57 	CleanupStack::PushL(self);
    59 	self->StartL(KUsbServerName);
    58 	self->StartL(KUsbServerName);
    60 	self->ConstructL();
    59 	self->ConstructL();
    61 	OstTraceFunctionExit0( CUSBSERVER_NEWLC_EXIT );
       
    62 	return self;
    60 	return self;
    63 	}
    61 	}
    64 
    62 
    65 
    63 
    66 /**
    64 /**
    70  *
    68  *
    71  * @internalComponent
    69  * @internalComponent
    72  */
    70  */
    73 CUsbServer::~CUsbServer()
    71 CUsbServer::~CUsbServer()
    74 	{
    72 	{
    75 	OstTraceFunctionEntry0( CUSBSERVER_CUSBSERVER_DES_ENTRY );
    73 	LOG_FUNC
    76 
    74 
    77 	delete iShutdownTimer;
    75 	delete iShutdownTimer;
    78 	delete iUsbDevice;
    76 	delete iUsbDevice;
    79 	
    77 	
    80 #ifdef SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
    78 #ifdef SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
    81 	delete iUsbHost;
    79 	delete iUsbHost;
    82 	
    80 	
    83 #ifndef __OVER_DUMMYUSBDI__
    81 #ifndef __OVER_DUMMYUSBDI__
    84 	// Check that this is A-Device
    82 	// Check that this is A-Device
    85 	OstTrace0( TRACE_NORMAL, CUSBSERVER_CUSBSERVER, "CUsbServer::~CUsbServer; Checking Id-Pin state..." );
    83 	LOGTEXT(_L8("Checking Id-Pin state..."));
    86 	TInt value = 0;
    84 	TInt value = 0;
    87 	TInt err = RProperty::Get(KUidUsbManCategory, KUsbOtgIdPinPresentProperty,value);
    85 	TInt err = RProperty::Get(KUidUsbManCategory, KUsbOtgIdPinPresentProperty,value);
    88 	if (err == 0 && value == 1)
    86 	if (err == 0 && value == 1)
    89 		{
    87 		{
    90 		// Ensure VBus is dropped when Usb server exits
    88 		// Ensure VBus is dropped when Usb server exits
    91 		OstTrace0( TRACE_NORMAL, CUSBSERVER_CUSBSERVER_DUP1, "CUsbServer::~CUsbServer; Checking VBus state..." );
    89 		LOGTEXT(_L8("Checking VBus state..."));
    92 		err = RProperty::Get(KUidUsbManCategory, KUsbOtgVBusPoweredProperty,value);
    90 		err = RProperty::Get(KUidUsbManCategory, KUsbOtgVBusPoweredProperty,value);
    93 		if ( err == KErrNone && value != 0 )
    91 		if ( err == KErrNone && value != 0 )
    94 			{
    92 			{
    95 			if ( iUsbOtg )
    93 			if ( iUsbOtg )
    96 				{
    94 				{
    97 				err = iUsbOtg->BusDrop();
    95 				err = iUsbOtg->BusDrop();
    98 				OstTrace1( TRACE_NORMAL, CUSBSERVER_CUSBSERVER_DUP2, "CUsbServer::~CUsbServer;BusDrop() returned err = %d", err );
    96 				LOGTEXT2(_L8("BusDrop() returned err = %d"),err);
    99 				OstTrace0( TRACE_NORMAL, CUSBSERVER_CUSBSERVER_DUP3, "CUsbServer::~CUsbServer; USBMAN will wait until VBus is actually dropped" );
    97 				LOGTEXT(_L8("USBMAN will wait until VBus is actually dropped"));
   100 				// Wait 1 second for Hub driver to perform VBus drop
    98 				// Wait 1 second for Hub driver to perform VBus drop
   101 				RTimer timer;
    99 				RTimer timer;
   102 				err = timer.CreateLocal();
   100 				err = timer.CreateLocal();
   103 				if ( err == KErrNone )
   101 				if ( err == KErrNone )
   104 					{
   102 					{
   107 					User::WaitForRequest(tstatus);
   105 					User::WaitForRequest(tstatus);
   108 					timer.Close();
   106 					timer.Close();
   109 					}
   107 					}
   110 				else
   108 				else
   111 					{
   109 					{
   112 					OstTrace1( TRACE_NORMAL, CUSBSERVER_CUSBSERVER_DUP4, "CUsbServer::~CUsbServer;Failed to create local timer: err = %d", err );
   110 					LOGTEXT2(_L8("Failed to create local timer: err = %d"),err);
   113 					}
   111 					}
   114 				}
   112 				}
   115 			else
   113 			else
   116 				{
   114 				{
   117 				OstTrace0( TRACE_NORMAL, CUSBSERVER_CUSBSERVER_DUP5, "CUsbServer::~CUsbServer; Unexpected: OTG object is NULL" );
   115 				LOGTEXT(_L8("Unexpected: OTG object is NULL"));
   118 				}
   116 				}
   119 			}
   117 			}
   120 		else
   118 		else
   121 			{
   119 			{
   122 			OstTraceExt2( TRACE_NORMAL, CUSBSERVER_CUSBSERVER_DUP6, "CUsbServer::~CUsbServer;VBus is already dropped or an error occured: err = %d, value =%d", err, value );
   120 			LOGTEXT3(_L8("VBus is already dropped or an error occured: err = %d, value =%d"),err,value);
   123 			}
   121 			}
   124 		}
   122 		}
   125 	else
   123 	else
   126 		{
   124 		{
   127 		OstTraceExt2( TRACE_NORMAL, CUSBSERVER_CUSBSERVER_DUP7, "CUsbServer::~CUsbServer;No Id-Pin is found or an error occured: err = %d, value = %d", err, value );
   125 		LOGTEXT3(_L8("No Id-Pin is found or an error occured: err = %d, value = %d"), err, value);
   128 		}
   126 		}
   129 	
   127 	
   130 	delete iUsbOtg;
   128 	delete iUsbOtg;
   131 #endif
   129 #endif
   132 #endif // SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
   130 #endif // SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
   133 
   131 
   134 	OstTraceFunctionExit0( CUSBSERVER_CUSBSERVER_DES_EXIT );
   132 #ifdef __FLOG_ACTIVE
       
   133 	CUsbLog::Close();
       
   134 #endif
   135 	}
   135 	}
   136 
   136 
   137 
   137 
   138 /**
   138 /**
   139  * The CUsbServer::CUsbServer method
   139  * The CUsbServer::CUsbServer method
   154  *
   154  *
   155  * @internalComponent
   155  * @internalComponent
   156  */
   156  */
   157 void CUsbServer::ConstructL()
   157 void CUsbServer::ConstructL()
   158 	{
   158 	{
   159 
   159 #ifdef __FLOG_ACTIVE
       
   160 	// Set the logger up so that everything in this thread that logs using it 
       
   161 	// will do so 'connectedly' (i.e. quickly). If this fails, we don't care- 
       
   162 	// logging will still work, just 'statically' (i.e. slowly).
       
   163 	static_cast<void>(CUsbLog::Connect());
       
   164 #endif
   160 
   165 
   161 	iShutdownTimer = new(ELeave) CShutdownTimer;
   166 	iShutdownTimer = new(ELeave) CShutdownTimer;
   162 	iShutdownTimer->ConstructL(); 
   167 	iShutdownTimer->ConstructL(); 
   163 
   168 
   164 #ifdef SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
   169 #ifdef SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
   167 	iUsbOtg->StartL();
   172 	iUsbOtg->StartL();
   168 #endif
   173 #endif
   169 #endif // SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
   174 #endif // SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
   170 
   175 
   171 	iUsbDevice = CUsbDevice::NewL(*this);
   176 	iUsbDevice = CUsbDevice::NewL(*this);
   172 	OstTrace0( TRACE_NORMAL, CUSBSERVER_CONSTRUCTL, "CUsbServer::ConstructL; About to load USB classes" );
   177 	LOGTEXT(_L8("About to load USB classes"));
   173 	iUsbDevice->EnumerateClassControllersL();
   178 	iUsbDevice->EnumerateClassControllersL();
   174 
   179 
   175 #ifndef USE_DUMMY_CLASS_CONTROLLER	
   180 #ifndef USE_DUMMY_CLASS_CONTROLLER	
   176 	iUsbDevice->ReadPersonalitiesL();
   181 	iUsbDevice->ReadPersonalitiesL();
   177 	if (iUsbDevice->isPersonalityCfged())
   182 	if (iUsbDevice->isPersonalityCfged())
   181 #endif
   186 #endif
   182 		iUsbDevice->SetDefaultPersonalityL();		
   187 		iUsbDevice->SetDefaultPersonalityL();		
   183 		}
   188 		}
   184 	else  
   189 	else  
   185 		{
   190 		{
   186 		OstTrace0( TRACE_NORMAL, CUSBSERVER_CONSTRUCTL_DUP1, "CUsbServer::ConstructL;Personalities unconfigured, so using fallback CCs" );
   191 		LOGTEXT(_L8("Personalities unconfigured, so using fallback CCs"));
   187 		iUsbDevice->LoadFallbackClassControllersL();
   192 		iUsbDevice->LoadFallbackClassControllersL();
   188 		}
   193 		}
   189 #else // USE_DUMMY_CLASS_CONTROLLER
   194 #else // USE_DUMMY_CLASS_CONTROLLER
   190 	OstTrace0( TRACE_NORMAL, CUSBSERVER_CONSTRUCTL_DUP2, "CUsbServer::ConstructL; Using Dummy Class Controller, so using fallback CCs" );
   195 	LOGTEXT(_L8("Using Dummy Class Controller, so using fallback CCs"));
   191 	iUsbDevice->LoadFallbackClassControllersL();
   196 	iUsbDevice->LoadFallbackClassControllersL();
   192 #endif // USE_DUMMY_CLASS_CONTROLLER		
   197 #endif // USE_DUMMY_CLASS_CONTROLLER		
   193 
   198 
   194 #ifdef SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
   199 #ifdef SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
   195 	iUsbHost = CUsbHost::NewL();
   200 	iUsbHost = CUsbHost::NewL();
   197 	//But it will cause the loading of personality longer.
   202 	//But it will cause the loading of personality longer.
   198 	//So it is moved back here.
   203 	//So it is moved back here.
   199 	iUsbHost->StartL();
   204 	iUsbHost->StartL();
   200 #endif // SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
   205 #endif // SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
   201 
   206 
   202 	OstTrace0( TRACE_NORMAL, CUSBSERVER_CONSTRUCTL_DUP3, "CUsbServer::ConstructL; CUsbServer constructed" );
   207 	LOGTEXT(_L8("CUsbServer constructed"));
   203 	}
   208 	}
   204 
   209 
   205 
   210 
   206 /**
   211 /**
   207  * The CUsbServer::NewSessionL method
   212  * The CUsbServer::NewSessionL method
   214  *
   219  *
   215  * @return	A new USB session to be used for the client
   220  * @return	A new USB session to be used for the client
   216  */
   221  */
   217 CSession2* CUsbServer::NewSessionL(const TVersion &aVersion, const RMessage2& aMessage) const
   222 CSession2* CUsbServer::NewSessionL(const TVersion &aVersion, const RMessage2& aMessage) const
   218 	{
   223 	{
   219 	OstTraceFunctionEntry0( CUSBSERVER_NEWSESSIONL_ENTRY );
   224 	LOG_LINE
       
   225 	LOG_FUNC
   220 
   226 
   221 	(void)aMessage;//Remove compiler warning
   227 	(void)aMessage;//Remove compiler warning
   222 	
   228 	
   223 	TVersion v(KUsbSrvMajorVersionNumber,KUsbSrvMinorVersionNumber,KUsbSrvBuildVersionNumber);
   229 	TVersion v(KUsbSrvMajorVersionNumber,KUsbSrvMinorVersionNumber,KUsbSrvBuildVersionNumber);
   224 
   230 
   225 	OstTrace0( TRACE_NORMAL, CUSBSERVER_NEWSESSIONL, "CUsbServer::NewSessionL; CUsbServer::NewSessionL - creating new session..." );
   231 	LOGTEXT(_L8("CUsbServer::NewSessionL - creating new session..."));
   226 	if (!User::QueryVersionSupported(v, aVersion))
   232 	if (!User::QueryVersionSupported(v, aVersion))
   227 		{
   233 		{
   228         OstTrace1( TRACE_NORMAL, CUSBSERVER_NEWSESSIONL_DUP1, "CUsbServer::NewSessionL;leave reason=%d", KErrNotSupported );
   234 		LEAVEL(KErrNotSupported);
   229 		User::Leave(KErrNotSupported);
       
   230 		}
   235 		}
   231 
   236 
   232 	CUsbServer* ncThis = const_cast<CUsbServer*>(this);
   237 	CUsbServer* ncThis = const_cast<CUsbServer*>(this);
   233 	
   238 	
   234 	CUsbSession* sess = CUsbSession::NewL(ncThis);
   239 	CUsbSession* sess = CUsbSession::NewL(ncThis);
   235 		
   240 		
   236 	OstTraceFunctionExit0( CUSBSERVER_NEWSESSIONL_EXIT );
       
   237 	return sess;
   241 	return sess;
   238 	}
   242 	}
   239 
   243 
   240 
   244 
   241 /**
   245 /**
   243  *
   247  *
   244  * @param	aError	The error that has occurred
   248  * @param	aError	The error that has occurred
   245  */
   249  */
   246 void CUsbServer::Error(TInt aError)
   250 void CUsbServer::Error(TInt aError)
   247 	{
   251 	{
   248 	OstTrace1( TRACE_NORMAL, CUSBSERVER_ERROR, "CUsbServer::Error;aError=%d", aError );
   252 	LOGTEXT2(_L8("CUsbServer::Error [aError=%d]"), aError);
   249 
   253 
   250 	Message().Complete(aError);
   254 	Message().Complete(aError);
   251 	ReStart();
   255 	ReStart();
   252 	}
   256 	}
   253 
   257 
   256  * 
   260  * 
   257  * @post	the number of open sessions is incremented by one
   261  * @post	the number of open sessions is incremented by one
   258  */
   262  */
   259 void CUsbServer::IncrementSessionCount()
   263 void CUsbServer::IncrementSessionCount()
   260 	{
   264 	{
   261 	OstTraceFunctionEntry0( CUSBSERVER_INCREMENTSESSIONCOUNT_ENTRY );
   265 	LOGTEXT2(_L8(">CUsbServer::IncrementSessionCount %d"), iSessionCount);
   262 	OstTrace1( TRACE_NORMAL, CUSBSERVER_INCREMENTSESSIONCOUNT, "CUsbServer::IncrementSessionCount;iSessionCount=%d", iSessionCount );
   266 	__ASSERT_DEBUG(iSessionCount >= 0, _USB_PANIC(KUsbSvrPncCat, EICSInvalidCount));
   263 	if(iSessionCount < 0)
       
   264 	    {
       
   265         OstTrace1( TRACE_FATAL, CUSBSERVER_INCREMENTSESSIONCOUNT_DUP1, "CUsbServer::IncrementSessionCount;panic code=%d", EICSInvalidCount );
       
   266         __ASSERT_DEBUG(EFalse, User::Panic(KUsbSvrPncCat, EICSInvalidCount));
       
   267 	    }
       
   268 	
   267 	
   269 	++iSessionCount;
   268 	++iSessionCount;
   270 	iShutdownTimer->Cancel();
   269 	iShutdownTimer->Cancel();
   271 
   270 
   272 	OstTraceFunctionExit0( CUSBSERVER_INCREMENTSESSIONCOUNT_EXIT );
   271 	LOGTEXT(_L8("<CUsbServer::IncrementSessionCount"));
   273 	}
   272 	}
   274 
   273 
   275 /**
   274 /**
   276  * Decrement the open session count (iSessionCount) by one.
   275  * Decrement the open session count (iSessionCount) by one.
   277  * 
   276  * 
   278  * @post		the number of open sessions is decremented by one
   277  * @post		the number of open sessions is decremented by one
   279  */
   278  */
   280 void CUsbServer::DecrementSessionCount()
   279 void CUsbServer::DecrementSessionCount()
   281 	{
   280 	{
   282 	OstTraceExt2( TRACE_NORMAL, CUSBSERVER_DECREMENTSESSIONCOUNT, "CUsbServer::DecrementSessionCount;iSessionCount=%d;Device().ServiceState()=%d", iSessionCount, Device().ServiceState() );
   281 	LOGTEXT3(_L8("CUsbServer::DecrementSessionCount %d, %d"), iSessionCount, Device().ServiceState());
   283 	if(iSessionCount <= 0)
   282 	__ASSERT_DEBUG(iSessionCount > 0, _USB_PANIC(KUsbSvrPncCat, EDCSInvalidCount));
   284 	    {
       
   285         OstTrace1( TRACE_FATAL, CUSBSERVER_DECREMENTSESSIONCOUNT_DUP1, "CUsbServer::DecrementSessionCount;panic code=%d", EDCSInvalidCount );
       
   286         __ASSERT_DEBUG(EFalse, User::Panic(KUsbSvrPncCat, EDCSInvalidCount));
       
   287 	    }
       
   288 	
   283 	
   289 	--iSessionCount;
   284 	--iSessionCount;
   290 	
   285 	
   291 	if (iSessionCount == 0 && Device().ServiceState() == EUsbServiceIdle)
   286 	if (iSessionCount == 0 && Device().ServiceState() == EUsbServiceIdle)
   292 		{
   287 		{
   303  * @pre		the services have been stopped.
   298  * @pre		the services have been stopped.
   304  * @see		CUsbDevice::SetServiceStateIdle
   299  * @see		CUsbDevice::SetServiceStateIdle
   305  */
   300  */
   306 void CUsbServer::LaunchShutdownTimerIfNoSessions()
   301 void CUsbServer::LaunchShutdownTimerIfNoSessions()
   307 	{
   302 	{
   308 	OstTraceFunctionEntry0( CUSBSERVER_LAUNCHSHUTDOWNTIMERIFNOSESSIONS_ENTRY );
   303 	LOGTEXT(_L8("CUsbServer::LaunchShutdownTimerIfNoSessions"));
   309 #ifdef _DEBUG
   304 	__ASSERT_DEBUG(Device().ServiceState() == EUsbServiceIdle, _USB_PANIC(KUsbSvrPncCat, ELSTNSNotIdle));
   310 	if(Device().ServiceState() != EUsbServiceIdle)
   305 
   311 	    {
       
   312         OstTrace1( TRACE_FATAL, CUSBSERVER_LAUNCHSHUTDOWNTIMERIFNOSESSIONS, "CUsbServer::LaunchShutdownTimerIfNoSessions;panic code=%d", ELSTNSNotIdle );
       
   313         User::Panic(KUsbSvrPncCat, ELSTNSNotIdle);
       
   314 	    }
       
   315 #endif
       
   316 	if (iSessionCount == 0)
   306 	if (iSessionCount == 0)
   317 		iShutdownTimer->After(KShutdownDelay);
   307 		iShutdownTimer->After(KShutdownDelay);
   318 	OstTraceFunctionExit0( CUSBSERVER_LAUNCHSHUTDOWNTIMERIFNOSESSIONS_EXIT );
       
   319 	}
   308 	}
   320 
   309 
   321 /**
   310 /**
   322  * Initialize this shutdown timer as a normal-priority
   311  * Initialize this shutdown timer as a normal-priority
   323  * (EPriorityStandard) active object.
   312  * (EPriorityStandard) active object.