diff -r 000000000000 -r dfb7c4ff071f datacommsserver/esockserver/ssock/SS_MAIN.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/datacommsserver/esockserver/ssock/SS_MAIN.CPP Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,237 @@ +// Copyright (c) 1997-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: +// + +#include +#include +#include +//#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef SYMBIAN_ZERO_COPY_NETWORKING +#include +#else +#include +#endif // SYMBIAN_ZERO_COPY_NETWORKING + + +using namespace Den; + +void SocketServer::InitL(CWorkerThread* aWorker) + { + if(aWorker->WorkerId() == TWorkerThreadPublicInfo::EMainThread) + { + // ESock Startup + // Check for the existence of ESock sub-directories + + TAutoClose fs; + User::LeaveIfError(fs.iObj.Connect()); + fs.PushL(); + + // Create Private Path for ESock in system drive + TInt retCode = 0; + if(fs.iObj.CreatePrivatePath(RFs::GetSystemDrive()) != KErrNone) + { + // Error creating Private Path + User::Leave(retCode); + } + + // Create ESock Directories in the system drive if they're not already there.. + // We rely on undocumented behavior that the default path is on the system drive + retCode = fs.iObj.MkDirAll(KEsockIniFileDir); + if(retCode != KErrNone && retCode != KErrAlreadyExists) + { + // Error creating \esock Directory + User::Leave(retCode); + } + + retCode = fs.iObj.MkDirAll(KEsockNoBackupDir); + if(retCode != KErrNone && retCode != KErrAlreadyExists) + { + // Error creating \nobackup directory + User::Leave(retCode); + } + + fs.Pop(); + } + + LOG( ESockLog::Printf(_L("SocketServer::InitL() Done!")); ) + } + +void SocketServer::ShutDown() +/** +free data structures and close the protocol manager +*/ + { + // Mark ourself as on the way out + CSockManData* globals=SockManGlobals::Get(); + LOG( ESockLog::Printf(_L("--------------- SocketServer W%d starting shutdown ---------------"), globals->iWorkerThread->WorkerId()) ); + + // The sub-connection and connection (specially) factories needs to be deleted + // before ShutdownExtensions() is called since connection factories may hold a + // valid NifSession ref which may become invalid if Nifman is unloaded through + // ShutdownExtensions() + //destroy factories before anything else gets destroyed + globals->UninstallFactoryContainers(); + + ShutdownExtensions(); // including Nifman + + ProtocolManager::ShutDown(); + + __CFLOG_STMT(TInt id = globals->iWorkerThread->WorkerId()); + + __CFLOG_1(KESockComponentTag, KESockServerTag, _L8("SocketServer W%d: objects destroyed, waiting to drop Scheduler"), id); + } + +void SocketServer::ShutdownExtensions() +/** +Shutdown extention DLLs +*/ + { + TDblQue& list = SockManGlobals::Get()->iExtensions; + CSocketServExtRef *xref; + TDblQueIter iter(list); + iter.SetToLast(); + while (xref = iter--, xref!=NULL) + { + xref->Remove(); + } + + while (!list.IsEmpty()) + { + xref = list.Last(); + xref->Close(); + delete xref; + } + } + +TBool SocketServer::IsShuttingDown() +/** +Used for Protocol shutdown to tell us whether protocols must be closed +immediately. +*/ + { + return (SockManGlobals::Get()->SelfWorker()->ShuttingDown()); + } +#ifdef SYMBIAN_ZERO_COPY_NETWORKING +RCommsBufPond SocketServer::GetCommsBufPond() +/** +return context for the Mbuf manager. +*/ + { + return TCommsBufPondTLSOp::Get(); + } +#else +CMBufManager* SocketServer::GetMBufManager() +/** +return context for the Mbuf manager. +*/ + { + return CMBufManager::Context(); + } +#endif + +CDeltaTimer* SocketServer::GetTimer() +/** +return context for the global timer. +*/ + { + // PERF: doesn't appear to be used by us now? switched to just-in-time addition + CDeltaTimer* timer = SockManGlobals::Get()->iTimer; + if(!timer->IsAdded()) + { + LOG( ESockLog::Printf(_L8("SocketServer::GetTimer() - adding upon first use")); ) + CActiveScheduler::Add(timer); + } + return timer; + } + +CSocketServer* SocketServer::GetSocketServer() +/** +return context for the CServer + +*/ + { + return SockManGlobals::Get()->iSocketServer; + } + +#if defined(_DEBUG_SOCKET_FUNCTIONS) +EXPORT_C void SocketServer::__DbgForceLoadMBufManagerL() +/** + Force loading the MBuf manager and, just in case it gets lonely, make a timer. + DEPRECATED +*/ + { + } + +EXPORT_C void SocketServer::__DbgForceKillMBufManager() +/** + Force unloading the MBuf manager + DEPRECATED +*/ + { + } +#else +EXPORT_C void SocketServer::__DbgForceLoadMBufManagerL() +/** +do nothing for UREL builds +*/ + { + } + +EXPORT_C void SocketServer::__DbgForceKillMBufManager() +/** +do nothing for UREL builds +*/ + { + } + +#endif + +void SocketServer::InstallExtensionL(const TDesC& aDllName, const TDesC& aArgs) +/** +Installs an Esock extension dll + +*/ + { + CSocketServExtRef* xr = new (ELeave) CSocketServExtRef; + CleanupStack::PushL(xr); + xr->InstallL(aDllName, aArgs); + CSockManData* globals = SockManGlobals::Get(); + globals->iExtensions.AddLast(*xr); //lint -e429 // extension list does have ownership + CleanupStack::Pop(); + } + +void SocketServer::NewSession() +/** +Increment the session counter - if we were about to shutdown, stop. +*/ + { + LOG( ESockLog::Printf(_L8("SocketServer::NewSession()")) ); + } + +void SocketServer::SessionClosing() +/** +A session is closing, if it's the last one take our stumps home. +*/ + { + LOG( ESockLog::Printf(_L8("SocketServer::SessionClosing()")) ); + }