remotestoragefw/remotefileengine/src/rsfwrfeserver.cpp
branchRCL_3
changeset 15 88ee4cf65e19
parent 12 87c71b25c937
child 16 1aa8c82cb4cb
--- a/remotestoragefw/remotefileengine/src/rsfwrfeserver.cpp	Wed Jun 09 10:37:35 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,498 +0,0 @@
-/*
-* Copyright (c) 2003-2006 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:  Remote File Engine server
-*
-*/
-
-
-
-// INCLUDE FILES
-#include <e32svr.h>
-#include <e32math.h>
-#include <e32cons.h>
-
-#include <bacline.h>
-
-#include "rsfwvolumetable.h"
-#include "rsfwcommon.h"
-#include "rsfwinterface.h"
-#include "rsfwrfesession.h"
-#include "rsfwrfeserver.h"
-#include "mdebug.h"
-#include "ecom.h"
-#include "rsfwmountstore.h"
-
-#include "rsfwconfig.h"
-
-
-// ----------------------------------------------------------------------------------------
-// Server's policy here
-// ----------------------------------------------------------------------------------------
-
-//Total number of ranges
-const TUint remoteFileEngineRangeCount = 3;
-
-//Definition of the ranges of IPC numbers
-const TInt remoteFileEngineRanges[remoteFileEngineRangeCount] = 
-        {
-        0, // 0 & 1 ; ERfeRequest, EAsynchRequest
-        2, // 2 ; The Control API starts from EMount
-        12 // 12 ; The Access API starts from ERenameReplace
-        }; 
-
-//Policy to implement for each of the above ranges        
-const TUint8 remoteFileEngineElementsIndex[remoteFileEngineRangeCount] = 
-        {
-        CPolicyServer::EAlwaysPass,	//applies to 0th range
-        0,  //applies to 1st range
-        1  //applies to 2nd range
-        };
-
-//Specific capability checks
-const static CPolicyServer::TPolicyElement remoteFileEngineElements[] = 
-        {
-        // action = -1 ===> failing calls happens via CustomFailureActionL
-        // File Server is always allowed based on its SID from that function
-        //policy "0" for the Control API; fail call if NetworkServices and ReadDeviceData not present
-        {_INIT_SECURITY_POLICY_C2(ECapabilityNetworkServices, ECapabilityReadDeviceData), -1},  
-        //policy "1"; for the Access API, fail call if Network Services and AllFiles not prosent
-        {_INIT_SECURITY_POLICY_C2(ECapabilityNetworkServices, ECapabilityAllFiles), -1} 
-        };
-
-//Package all the above together into a policy
-const CPolicyServer::TPolicy remoteFileEnginePolicy =
-        {
-        CPolicyServer::EAlwaysPass, //specifies all connect attempts should pass
-        remoteFileEngineRangeCount,	//number of ranges                                   
-        remoteFileEngineRanges,	//ranges array
-        remoteFileEngineElementsIndex,	//elements<->ranges index
-        remoteFileEngineElements,		//array of elements
-        };
-
-
-// DATA STRUCTURES
-TRfeEnv* CRsfwRfeServer::iEnvp;
-
-// ============================ MEMBER FUNCTIONS ==============================
-
-
-// ----------------------------------------------------------------------------
-// CRsfwRfeServer::CRsfwRfeServer
-// ----------------------------------------------------------------------------
-// 
-inline CRsfwRfeServer::CRsfwRfeServer(TInt aPriority, TServerType aType)
-    :CPolicyServer(aPriority, remoteFileEnginePolicy, aType)
-    {
-    }
-
-// ----------------------------------------------------------------------------
-// CRsfwRfeServer::NewL
-// ----------------------------------------------------------------------------
-// 
-
-CRsfwRfeServer* CRsfwRfeServer::NewL()
-    {
-    CRsfwRfeServer* self = CRsfwRfeServer::NewLC();
-    CleanupStack::Pop(self);
-    return self;
-    }
-
-// ----------------------------------------------------------------------------
-// CRsfwRfeServer::NewLC
-// ----------------------------------------------------------------------------
-// 
-
-CRsfwRfeServer* CRsfwRfeServer::NewLC()
-    {
-    CRsfwRfeServer* self = new (ELeave) CRsfwRfeServer(EPriorityNormal,
-                                               ESharableSessions);
-    CleanupStack::PushL(self);
-    self->ConstructL();
-    return self;
-    }
-
-// ----------------------------------------------------------------------------
-// CRsfwRfeServer::ConstructL
-// ----------------------------------------------------------------------------
-// 
-
-void CRsfwRfeServer::ConstructL()
-    {
-    StartL(KRemoteFEName);
-    DEBUGSTRING(("registered RFE name 0x%x", this));
-
-    // Prepare the environment
-    iEnvp = &iEnv;
-    iDelayedShutdownTimer = CPeriodic::NewL(CActive::EPriorityLow);
-    User::LeaveIfError(iEnvp->iFs.Connect());
-    iEnvp->iRsfwConfig = CRsfwConfig::NewL(KCRUidRsfwCtrl);  
-    
-	// Make cache root directory
-   	PrepareCacheRootL();
-   	// Load configuration
-   	// Create volume table
-   	iVolumes = CRsfwVolumeTable::NewL(this, iEnvp->iRsfwConfig);
-    }
-
-// ----------------------------------------------------------------------------
-// CRsfwRfeServer::ThreadFunction
-// ----------------------------------------------------------------------------
-//
-TInt CRsfwRfeServer::ThreadFunction(TAny* /*aNone*/)
-    {
-    CTrapCleanup* cleanupStack = CTrapCleanup::New();
-    if (!cleanupStack)
-        {
-        PanicServer(ECreateTrapCleanup);
-        }
-
-//  __UHEAP_MARK;
-    TRAPD(err, ThreadFunctionL());
-//  __UHEAP_MARKENDC(0);
-    if (err != KErrNone)
-        {
-        PanicServer(ESrvCreateServer);
-        }
-
-    delete cleanupStack;
-    cleanupStack = NULL;
-
-    return KErrNone;
-    }
-
-// ----------------------------------------------------------------------------
-// CRsfwRfeServer::IncrementSessions
-// ----------------------------------------------------------------------------
-//
-void CRsfwRfeServer::IncrementSessions()
-    {
-    StopDelayedShutdownTimer();
-    iSessionCount++;
-    DEBUGSTRING(("+session count = %d", iSessionCount));
-    }
-
-// ----------------------------------------------------------------------------
-// CRsfwRfeServer::DecrementSessions
-// ----------------------------------------------------------------------------
-//
-void CRsfwRfeServer::DecrementSessions()
-    {
-    iSessionCount--;
-    // this debug output crashes the server for some reason
-//    DEBUGSTRING(("-session count = %d", iSessionCount));
-    // Note that the event causing server to shut down
-    // is not session count going to zero, as 
-    // there are "permanent" session(s) from the File Server plugin.
-    // (they would be closed when remote drives are unmounted, which never happens)
-    // Instead, server shutdown is triggered by last connected volume
-    // going to disconnect state, or inactivity timeout expires and
-    // there are no open files.
-    }
-
-// ----------------------------------------------------------------------------
-// CRsfwRfeServer::AllEnginesIdling
-// ----------------------------------------------------------------------------
-//
-void CRsfwRfeServer::AllEnginesIdling(TInt aTimeout)
-    {
-    if (!iShuttingDown)
-        {
-        DEBUGSTRING(("starting to shut down after %d seconds", aTimeout));
-        if (aTimeout)
-            {
-            StartDelayedShutdownTimer(aTimeout);
-            }
-        else
-            {
-            ShutDown();
-            }
-        }
-    }
-
-// ----------------------------------------------------------------------------
-// CRsfwRfeServer::ServiceRequested
-// ----------------------------------------------------------------------------
-//
-void CRsfwRfeServer::ServiceRequested()
-    {
-    StopDelayedShutdownTimer();
-    }
-
-// ----------------------------------------------------------------------------
-// CRsfwRfeServer::RunError
-// ----------------------------------------------------------------------------
-//
-TInt CRsfwRfeServer::RunError(TInt aError)
-    {
-    if (aError == KErrBadDescriptor)
-        {
-        // A bad descriptor error implies a badly programmed client,
-        // so panic it;
-        // otherwise report the error to the client
-        PanicClient(Message(), EBadDescriptor);
-        }
-    else
-        {
-        Message().Complete(aError);
-        }
-
-    // The leave will result in an early return from CServer::RunL(), skipping
-    // the call to request another message. So do that now in order to keep the
-    // server running.
-    ReStart();
-
-    return KErrNone;    // handled the error fully
-    }
-
-
-// ----------------------------------------------------------------------------
-// CRsfwRfeServer::CustomFailureActionL
-// ----------------------------------------------------------------------------
-//
-CPolicyServer::TCustomResult CRsfwRfeServer::CustomFailureActionL(const RMessage2& aMsg, 
-                                                   TInt /* aAction */, 
-                                                   const TSecurityInfo& /*aMissing */)
-    {
-    TCustomResult result = EFail;
-    TSecureId secId = aMsg.SecureId();
-    if (secId = KFileServerSecureUid) 
-        {
-        result = EPass;
-        }
-    return result;
-    }
-
-
-
-// ----------------------------------------------------------------------------
-// CRsfwRfeServer::PanicClient
-// ----------------------------------------------------------------------------
-//
-void CRsfwRfeServer::PanicClient(const RMessage2& aMessage, TRfePanic aPanic)
-    {
-    aMessage.Panic(KRfeServer, aPanic);
-    }
-
-// ----------------------------------------------------------------------------
-// CRsfwRfeServer::PanicServer
-// ----------------------------------------------------------------------------
-//
-void CRsfwRfeServer::PanicServer(TRfePanic aPanic)
-    {
-    User::Panic(KRfeServer, aPanic);
-    }
-
-// ----------------------------------------------------------------------------
-// CRsfwRfeServer::ThreadFunctionL
-// ----------------------------------------------------------------------------
-//
-void CRsfwRfeServer::ThreadFunctionL()
-    {
-
-    // Construct active scheduler
-    CActiveScheduler* activeScheduler = new (ELeave) CActiveScheduler;
-    CleanupStack::PushL(activeScheduler);
-
-    // Install active scheduler.
-    // We don't need to check whether an active scheduler is already installed
-    // as this is a new thread, so there won't be one
-    CActiveScheduler::Install(activeScheduler);
-
-    // Change the name of the thread, so it is easier to recognize
-    User::RenameThread(KRfeMain);
-    // Construct our server
-    CRsfwRfeServer::NewLC();    // anonymous
-
-    RSemaphore semaphore;
-    TInt err;
-    err = semaphore.OpenGlobal(KRfeSemaphoreName);
-    if (err == KErrNotFound)
-        {
-        err = semaphore.CreateGlobal(KRfeSemaphoreName, 0);
-        }
-    User::LeaveIfError(err);
-
-    // Semaphore opened ok
-    semaphore.Signal();
-    semaphore.Close();
-
-#ifdef _DEBUG
-    {
-    TInt8* p = (TInt8*)User::Alloc(1);
-    DEBUGSTRING(("Test alloc addr=0x%x", p));
-    delete p;
-    DEBUGSTRING(("Enter alloc count=%d", User::CountAllocCells()));
-    TInt b;
-    TInt a = User::Available(b);
-    DEBUGSTRING(("Enter alloc avail=%d, biggest=%d", a, b));
-    }
-#endif
-
-    // Start handling requests
-    CActiveScheduler::Start();
-#ifdef _DEBUG
-    {
-    DEBUGSTRING(("Exit alloc count=%d", User::CountAllocCells()));
-    TInt b;
-    TInt a = User::Available(b);
-    DEBUGSTRING(("Exit alloc avail=%d, biggest=%d", a, b));
-    }
-#endif
-    CleanupStack::PopAndDestroy(2, activeScheduler);
-    }
-
-// ----------------------------------------------------------------------------
-// CRsfwRfeServer::NewSessionL
-// ----------------------------------------------------------------------------
-//     
-CSession2* CRsfwRfeServer::NewSessionL(const TVersion &aVersion,
-                                   const RMessage2&) const
-    {
-    // Check we're the right version
-    if (!User::QueryVersionSupported(TVersion(KRfeMajorVersionNumber,
-                                              KRfeMinorVersionNumber,
-                                              KRfeBuildVersionNumber),
-                                     aVersion))
-        {
-        User::Leave(KErrNotSupported);
-        }
-    // Make new session
-    return CRsfwRfeSession::NewL(*const_cast<CRsfwRfeServer*> (this));
-    }
-
-// ----------------------------------------------------------------------------
-// CRsfwRfeServer::PrepareCacheRootL
-// Get the cache path and create the directory if it does not exist
-// ----------------------------------------------------------------------------
-//   
-void CRsfwRfeServer::PrepareCacheRootL()
-    {
-    TInt err;
-    err = iEnvp->iRsfwConfig->Get(RsfwConfigKeys::KCacheDirectoryPath,
-                                  iEnvp->iCacheRoot);
-    if (err == KErrNone)
-        {
-        TBuf<KMaxRsfwConfItemLength> driveString;
-        if ((iEnvp->iCacheRoot.Length() < 2) || (iEnvp->iCacheRoot[1] != ':'))
-            {
-            err = iEnvp->iRsfwConfig->Get(RsfwConfigKeys::KRsfwDefaultDrive,
-                                          driveString);
-            if (err != KErrNone)
-                {
-                driveString.Copy(KRSFWDefaultDrive);
-                }
-            }
-        if (driveString.Length() < 2)
-            {
-            driveString.Append(':');
-            }
-        iEnvp->iCacheRoot.Insert(0, driveString);
-        }
-    else
-        {
-        HBufC* defaultcacheRoot = HBufC::NewL(KMaxPath);
-        TPtr defaultCache(defaultcacheRoot->Des());
-        defaultCache.Append(KRSFWDefaultDrive);
-        defaultCache.Append(KCacheRootDefault);
-        iEnvp->iCacheRoot.Copy(defaultCache);
-        delete defaultcacheRoot;
-        }
-    RFs& fs = iEnvp->iFs;
-    TUint att;
-    TChar cacheDriveChar = iEnvp->iCacheRoot[0];
-    User::LeaveIfError(fs.CharToDrive(cacheDriveChar, iEnvp->iCacheDrive));
-    err = fs.Att(iEnvp->iCacheRoot, att);
-    if (err != KErrNone)
-        {
-        // There was no prior cache root
-        err = fs.MkDirAll(iEnvp->iCacheRoot);
-        DEBUGSTRING(("Cache root creation failed with err=%d", err));
-        User::LeaveIfError(err);
-        }
-    }
-
-// ----------------------------------------------------------------------------
-// CRsfwRfeServer::ShutDown
-// ----------------------------------------------------------------------------
-//
-void CRsfwRfeServer::ShutDown()
-    {
-    DEBUGSTRING(("shutting down"));
-    iShuttingDown = ETrue;
-    CActiveScheduler::Stop();
-    delete iVolumes;
-    iVolumes = NULL;
-    delete iEnvp->iRsfwConfig;
-    iEnvp->iRsfwConfig = NULL;
-    iEnvp->iFs.Close();
-    delete iDelayedShutdownTimer;
-    iDelayedShutdownTimer = NULL;
-    // REComSession::FinalClose must be called when everything else
-    // related to ECom use has been deleted
-    REComSession::FinalClose(); 
-    DEBUGSTRING(("shut down"));
-    }
-
-// ----------------------------------------------------------------------------
-// CRsfwRfeServer::StartDelayedShutdownTimer
-// ----------------------------------------------------------------------------
-//
-void CRsfwRfeServer::StartDelayedShutdownTimer(TInt aTimeout)
-    {
-    if (!iShuttingDown)
-        {
-        iDelayedShutdownTimer->Cancel();
-        DEBUGSTRING(("shutting down in %d seconds",
-                     aTimeout));
-        TCallBack callBack(CRsfwRfeServer::DelayedShutdownTimerExpired, this);
-        iDelayedShutdownTimer->Start(aTimeout * 1000000,
-                                     aTimeout * 1000000,
-                                     callBack);
-        }
-    }
-
-// ----------------------------------------------------------------------------
-// CRsfwRfeServer::StopDelayedShutdownTimer
-// ----------------------------------------------------------------------------
-//
-void CRsfwRfeServer::StopDelayedShutdownTimer()
-    {
-    if (iDelayedShutdownTimer)
-        {
-        iDelayedShutdownTimer->Cancel();
-        }
-    }
-
-// ----------------------------------------------------------------------------
-// CRsfwRfeServer::DelayedShutdownTimerExpired
-// ----------------------------------------------------------------------------
-//
-TInt CRsfwRfeServer::DelayedShutdownTimerExpired(TAny* aArg)
-    {   
-    CRsfwRfeServer* rfeServer = static_cast<CRsfwRfeServer*>(aArg);
-    rfeServer->ShutDown();
-    return 0;
-    }
-
-// ----------------------------------------------------------------------------
-// E32Main
-// ----------------------------------------------------------------------------
-//
-TInt E32Main()
-    {
-    return CRsfwRfeServer::ThreadFunction(NULL);
-    }
-
-
-// End of File