usbmgmt/usbmgr/host/functiondrivers/ms/msmm/server/src/msmmserver.cpp
changeset 0 c9bc50fca66e
child 15 f92a4f87e424
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/host/functiondrivers/ms/msmm/server/src/msmmserver.cpp	Tue Feb 02 02:02:59 2010 +0200
@@ -0,0 +1,230 @@
+/*
+* Copyright (c) 2008-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
+ @internalComponent
+*/
+
+#include "msmmserver.h"
+#include <usb/hostms/msmmpolicypluginbase.h>
+#include "msmm_internal_def.h"
+#include "msmmsession.h"
+#include "msmmengine.h"
+#include "eventqueue.h"
+#include "msmmterminator.h"
+
+#include <usb/usblogger.h>
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, "UsbHostMsmmServer");
+#endif
+
+//  Static public functions
+TInt CMsmmServer::ThreadFunction()
+    {
+    TInt ret = KErrNone;
+    
+    __UHEAP_MARK;
+    // Create the cleanup stack
+    CTrapCleanup* cleanupStack = CTrapCleanup::New();
+    if (cleanupStack)
+        {
+#ifdef __FLOG_ACTIVE
+        (void)CUsbLog::Connect();
+#endif
+
+        TRAP(ret, ThreadFunctionL());
+
+#ifdef __FLOG_ACTIVE
+        CUsbLog::Close();
+#endif
+        
+        delete cleanupStack;
+        }
+    else
+        {
+        ret = KErrNoMemory;
+        }
+    __UHEAP_MARKEND;
+    
+    return ret;
+    }
+
+void CMsmmServer::ThreadFunctionL()
+    {
+    LOG_STATIC_FUNC_ENTRY
+    
+    TSecureId creatorSID = User::CreatorSecureId();
+    if (KFDFWSecureId != creatorSID)
+        {
+        // Only FDF process can be the creator of the MSMM server
+        User::Leave(KErrPermissionDenied);
+        }
+    
+    // Create and install the active scheduler
+    CActiveScheduler* scheduler = new(ELeave) CActiveScheduler;
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    // Create the server and leave it on cleanup stack
+    CMsmmServer::NewLC();
+
+    // Signal the client that the server is up and running
+    RProcess::Rendezvous(KErrNone);
+    
+    RThread().SetPriority(EPriorityAbsoluteHigh);
+
+    // Start the active scheduler, the server will now service 
+    // request messages from clients.
+    CActiveScheduler::Start();
+
+    // Free the server and active scheduler.
+    CleanupStack::PopAndDestroy(2, scheduler);
+    }
+
+// Public functions
+// Construction and destruction
+CMsmmServer* CMsmmServer::NewLC()
+    {
+    LOG_STATIC_FUNC_ENTRY
+    CMsmmServer* self = new (ELeave) CMsmmServer(EPriorityHigh);
+    CleanupStack::PushL(self);
+    
+    // Create a server with unique server name
+    self->StartL(KMsmmServerName);
+    self->ConstructL();
+    
+    return self;
+    }
+
+CMsmmServer::~CMsmmServer()
+    {
+    LOG_FUNC
+    delete iPolicyPlugin;
+    delete iEventQueue;
+    delete iEngine;
+    delete iTerminator;
+    REComSession::FinalClose();
+
+#ifndef __OVER_DUMMYCOMPONENT__
+    iFs.RemoveProxyDrive(KPROXYDRIVENAME);
+    iFs.Close();
+#endif
+    }
+    
+    // CMsmmServer APIs
+CSession2* CMsmmServer::NewSessionL(const TVersion& aVersion, 
+        const RMessage2& aMessage) const
+    {
+    LOG_FUNC
+    
+    if (KMaxClientCount <= SessionNumber())
+        {
+        // There is a connection to MSMM server already.
+        // Currently design of MSMM allows only one activated client 
+        // at any time.
+        User::Leave(KErrInUse);
+        }
+    
+    // Check the client-side API version number against the server version 
+    // number.
+    TVersion serverVersion(KMsmmServMajorVersionNumber,
+        KMsmmServMinorVersionNumber, KMsmmServBuildVersionNumber);
+    
+    if (!User::QueryVersionSupported(serverVersion, aVersion))
+        {
+        // Server version incompatible with client-side API
+        PanicClient(aMessage, ENoSupportedVersion);
+        User::Leave(KErrNotSupported);
+        }
+
+    // Version number is OK - create the session
+    return CMsmmSession::NewL(*(const_cast<CMsmmServer*>(this)), *iEventQueue);
+    }
+
+TInt CMsmmServer::SessionNumber() const
+    {
+    LOG_FUNC
+    
+    return iNumSessions;
+    }
+
+void CMsmmServer::AddSession()
+    {
+    LOG_FUNC
+    
+    ++iNumSessions;
+    iTerminator->Cancel();
+    }
+
+void CMsmmServer::RemoveSession()
+    {
+    LOG_FUNC
+    
+    --iNumSessions;
+    if (iNumSessions == 0)
+        {
+        // Discard all pending adding interface events from queue
+        // and cancel event handler if a adding events is being 
+        // handled in it.
+        iEventQueue->Finalize();
+        iTerminator->Cancel();
+        iTerminator->Start();
+        }
+    }
+
+//  Private functions 
+// CMsmmServer Construction
+CMsmmServer::CMsmmServer(TInt aPriority)
+    :CPolicyServer(aPriority, KMsmmServerSecurityPolicy, EUnsharableSessions)
+    {
+    LOG_FUNC
+    //
+    }
+
+void CMsmmServer::ConstructL()
+    {
+    LOG_FUNC
+    
+    iEngine = CMsmmEngine::NewL();
+    iEventQueue = CDeviceEventQueue::NewL(*this);
+    iTerminator = CMsmmTerminator::NewL(*iEventQueue);
+    iPolicyPlugin = CMsmmPolicyPluginBase::NewL();
+    if (!iPolicyPlugin)
+        {
+        // Not any policy plugin implementation available
+        PanicServer(ENoPolicyPlugin);
+        }
+    
+    // Initalize RFs connection and add the ELOCAL file system to file server
+    User::LeaveIfError(iFs.Connect());
+
+#ifndef __OVER_DUMMYCOMPONENT__
+    TInt ret(KErrNone);
+    ret = iFs.AddProxyDrive(KFSEXTNAME);
+    if ((KErrNone != ret) && (KErrAlreadyExists !=  ret))
+        {
+        User::Leave(ret);
+        }
+#endif
+    
+    // Start automatic shutdown timer
+    iTerminator->Start();
+    }
+
+// End of file