diff -r 000000000000 -r d0791faffa3f mtpfws/mtpfw/daemon/server/src/cmtpserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mtpfws/mtpfw/daemon/server/src/cmtpserver.cpp Tue Feb 02 01:11:40 2010 +0200 @@ -0,0 +1,249 @@ +// Copyright (c) 2006-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 + @internalTechnology +*/ + +#include + +#include "cmtpconnectionmgr.h" +#include "cmtpdataprovidercontroller.h" +#include "cmtpserver.h" +#include "cmtpserversession.h" +#include "cmtpshutdown.h" +#include "mtpclientserver.h" +#include "mtpdebug.h" +#include "rmtpframework.h" + +#define UNUSED_VAR(a) (a) = (a) + +__FLOG_STMT(_LIT8(KComponent,"Server");) + +/** +PlatSec policy. +*/ +const TUint8 KMTPPolicyElementNetworkAndLocal = 0; + +const TInt KMTPFunctionCodeRanges[] = + { + EMTPClientStartTransport, + EMTPClientNotSupported, + }; + +const TUint KMTPFunctionCodeRangeCount(sizeof(KMTPFunctionCodeRanges) / sizeof(KMTPFunctionCodeRanges[0])); + +const TUint8 KMtpElementsIndex[KMTPFunctionCodeRangeCount] = + { + KMTPPolicyElementNetworkAndLocal, + CPolicyServer::ENotSupported, + }; + +const CPolicyServer::TPolicyElement KMtpPolicyElements[] = + { + {_INIT_SECURITY_POLICY_C2(ECapabilityNetworkServices, ECapabilityLocalServices), CPolicyServer::EFailClient}, + }; + +const static CPolicyServer::TPolicy KMTPServerPolicy = + { + CPolicyServer::EAlwaysPass, //specifies all connect attempts should pass + KMTPFunctionCodeRangeCount, + KMTPFunctionCodeRanges, + KMtpElementsIndex, // what each range is compared to + KMtpPolicyElements // what policies range is compared to + }; + +/** +Destructor. +*/ +CMTPServer::~CMTPServer() + { + __FLOG(_L8("~CMTPServer - Entry")); + delete iShutdown; + iFrameworkSingletons.ConnectionMgr().StopTransports(); + iFrameworkSingletons.DpController().UnloadDataProviders(); + iFrameworkSingletons.Close(); + REComSession::FinalClose(); + __FLOG(_L8("~CMTPServer - Exit")); + __FLOG_CLOSE; + } + +/** +Creates and executes a new CMTPServer instance. +@leave One of the system wide error codes, if a processing failure occurs. +*/ +void CMTPServer::RunServerL() + { + __FLOG_STATIC(KMTPSubsystem, KComponent, _L8("RunServerL - Entry")); + + // Naming the server thread after the server helps to debug panics + User::LeaveIfError(User::RenameProcess(KMTPServerName)); + + // Create and install the active scheduler. + CActiveScheduler* scheduler(new(ELeave) CActiveScheduler); + CleanupStack::PushL(scheduler); + CActiveScheduler::Install(scheduler); + + // Create the server and leave it on the cleanup stack. + CMTPServer* server(CMTPServer::NewLC()); + + // Initialisation complete, signal the client + RProcess::Rendezvous(KErrNone); + + // Execute the server. + CActiveScheduler::Start(); + + // Server shutting down. + CleanupStack::PopAndDestroy(server); + + CleanupStack::PopAndDestroy(1); // scheduler + __FLOG_STATIC(KMTPSubsystem, KComponent, _L8("RunServerL - Exit")); + } + +/** +Adds a new CMTPServer session. +*/ +void CMTPServer::AddSession() + { + __FLOG(_L8("AddSession - Entry")); + if(iShutdown && iShutdown->IsActive()) + { + iShutdown->Cancel(); + } + ++iSessionCount; + __FLOG(_L8("AddSession - Exit")); + } + +/** +Removes a CMTPServer session. If there are no active MTP client API sessions +remaining and no active MTP connections, then a shutdown timer is started to +terminate the server thread. +*/ +void CMTPServer::DropSession() + { + __FLOG(_L8("DropSession - Entry")); + + if (--iSessionCount==0 && iFrameworkSingletons.ConnectionMgr().TransportCount() == 0) + { + // No active MTP client API sessions remain, start the shutdown timer. + if (!iShutdown) + { + TRAPD(error, iShutdown = CMTPShutdown::NewL()); + __FLOG(_L8("CMTPShutdown Loaded- Entry")); + UNUSED_VAR(error); + } + if (iShutdown) + { + __FLOG(_L8("Shutdown Started - Entry")); + iShutdown->Start(); + } + } + __FLOG(_L8("DropSession - Exit")); + } + +CSession2* CMTPServer::NewSessionL(const TVersion&,const RMessage2&) const + { + __FLOG(_L8("NewSessionL - Entry")); + __FLOG(_L8("NewSessionL - Exit")); + return new(ELeave) CMTPServerSession(); + } + +/** +CMTPServer factory method. A pointer to the constructed CMTPServer instance is +placed on the cleanup stack. +@return A pointer to a new CMTPServer instance. Ownership IS transfered. +@leave One of the system wide error codes if a processing failure occurs. +*/ +CMTPServer* CMTPServer::NewLC() + { + CMTPServer* self=new(ELeave) CMTPServer; + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +/** +Constructor. +*/ +CMTPServer::CMTPServer() : + CPolicyServer(CActive::EPriorityStandard, KMTPServerPolicy) + { + + } + +/** +second-phase constructor. +*/ +void CMTPServer::ConstructL() + { + __FLOG_OPEN(KMTPSubsystem, KComponent); + __FLOG(_L8("ConstructL - Entry")); + StartL(KMTPServerName); + iFrameworkSingletons.OpenL(); + __FLOG(_L8("ConstructL - Exit")); + } + +/* +RMessage::Panic() also completes the message. This is: +(a) important for efficient cleanup within the kernel +(b) a problem if the message is completed a second time +@param aMessage Message to be paniced. +@param aPanic Panic code. +*/ +void PanicClient(const RMessagePtr2& aMessage,TMTPPanic aPanic) + { + __FLOG_STATIC(KMTPSubsystem, KComponent, _L8("PanicClient - Entry")); + __FLOG_STATIC_VA((KMTPSubsystem, KComponent, _L8("Panic = %d"), aPanic)); + _LIT(KPanic,"MTPServer"); + aMessage.Panic(KPanic, aPanic); + __FLOG_STATIC(KMTPSubsystem, KComponent, _L8("PanicClient - Exit")); + } + +/** +Process entry point +*/ +TInt E32Main() + { + __UHEAP_MARK; + __FLOG_STATIC(KMTPSubsystem, KComponent, _L8("E32Main - Entry")); + __MTP_HEAP_FLOG + + CTrapCleanup* cleanup=CTrapCleanup::New(); + TInt ret = KErrNoMemory; + if (cleanup) + { +#ifdef __OOM_TESTING__ + TInt i = 0; + while (ret == KErrNoMemory || ret == KErrNone) + { + __UHEAP_SETFAIL(RHeap::EDeterministic,i++); + __UHEAP_MARK; + + TRAP(nRet, RunServerL()); + + __UHEAP_MARKEND; + __UHEAP_RESET; + } +#else + TRAP(ret, CMTPServer::RunServerL()); + +#endif + delete cleanup; + } + __FLOG_STATIC(KMTPSubsystem, KComponent, _L8("E32Main - Exit")); + __UHEAP_MARKEND; + return ret; + }