omadrm/drmengine/server/src/DRMServerStarter.cpp
changeset 0 95b198f216e5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omadrm/drmengine/server/src/DRMServerStarter.cpp	Thu Dec 17 08:52:27 2009 +0200
@@ -0,0 +1,167 @@
+/*
+* Copyright (c) 2002 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:  This file is used only if RDRMRightsClient starts the
+*                DRM Rights Database server. 
+*
+*/
+
+// INCLUDE FILES
+#include   <e32std.h>
+#include    <e32uid.h>
+#include <f32file.h>
+
+#ifdef RD_MULTIPLE_DRIVE
+#include <DriveInfo.h>
+#endif
+
+#include "drmengineclientserver.h"
+
+// EXTERNAL DATA STRUCTURES
+// EXTERNAL FUNCTION PROTOTYPES  
+// CONSTANTS
+#ifdef __WINS__
+LOCAL_C const TUint KServerMinHeapSize =  0x1000;  
+LOCAL_C const TUint KServerMaxHeapSize = 0x300000; 
+_LIT( KRightsServerFile, "RightsServer" );
+#else
+
+#ifdef RD_MULTIPLE_DRIVE
+_LIT( KRightsServerFile, "%c:\\RightsServer.exe" );
+#else
+_LIT( KRightsServerFile, "e:\\RightsServer.exe" );
+#endif
+#endif
+
+// MACROS
+// LOCAL CONSTANTS AND MACROS
+// MODULE DATA STRUCTURES
+// LOCAL FUNCTION PROTOTYPES
+LOCAL_C TInt CreateServer( void );
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CreateServer launches the DRM Rights server [process (THUMB/ARMI)|thread (WINS)]. 
+// Returns: KErrNone: No errors.
+//          <KErrNone: Symbian wide error code.
+// -----------------------------------------------------------------------------
+//
+LOCAL_C TInt CreateServer( void )
+    {
+    TInt error = KErrNone;
+    
+        RProcess server;
+        
+#ifndef RD_MULTIPLE_DRIVE
+    
+        error = server.Create( KRightsServerFile, 
+                               KNullDesC );
+    
+#else //RD_MULTIPLE_DRIVE
+        
+        RFs fs;
+        TInt driveNumber( -1 );
+        TChar driveLetter;
+        DriveInfo::GetDefaultDrive( DriveInfo::EDefaultMassStorage, driveNumber );
+        
+        error = fs.Connect();
+        if( error != KErrNone )
+            {
+            fs.Close();
+            return error;
+            }
+        
+        fs.DriveToChar( driveNumber, driveLetter );
+        fs.Close();
+	
+        TFileName rightsServerFile;
+        rightsServerFile.Format( KRightsServerFile, (TUint)driveLetter );
+    
+        error = server.Create( rightsServerFile, 
+                               KNullDesC );
+    
+#endif
+        
+        if ( !error )
+            {
+            // Give some time to the process to start.
+            User::After( 1000 );
+            
+        // Kick the server up & running.
+        server.Resume();
+            
+        // Local handle not needed anymore.
+        server.Close();
+        }
+        
+    return error;
+    }
+    
+// ============================ MEMBER FUNCTIONS ===============================
+    
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+    
+// -----------------------------------------------------------------------------
+// DRMServerStarter starts the actual server.
+// Returns: KErrNone: All went OK, no errors.
+//          <KErrNone: Symbian wide error code.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt DRMServerStarter()
+    {
+    RSemaphore semaphore;
+    TFindServer server( DRMEngine::KServerName );
+    TFullName name;
+    
+    // Check if the server is already running.
+    TInt error = server.Next( name );
+    
+    if ( !error )
+        {
+        // Yep, it's already running.
+        return KErrNone;
+        }
+
+    error = semaphore.CreateGlobal( DRMEngine::KDRMSemaphore,   // name
+                                    0 ,              // count
+                                    EOwnerThread ); // owner
+    
+    if ( error == KErrAlreadyExists )
+        {
+        error = semaphore.OpenGlobal( DRMEngine::KDRMSemaphore );
+        }
+        
+    if ( !error )
+        {
+        error = CreateServer();
+        if ( !error )
+            {
+            // Wait until server has done all its things.
+            semaphore.Wait();
+            
+            // Signal the (possible) next one waiting in line. Server
+            // only signals the semaphore once but there might be several
+            // clients waiting for this semaphore, in theory.
+            semaphore.Signal();
+            }
+        
+        // Semaphore can be destroyed.
+        semaphore.Close();
+        }
+        
+    return error; 
+    }
+//  End of File