videofeeds/server/IptvEpgManager/src/CIptvEpgManagerImpl.cpp
changeset 0 96612d01cf9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videofeeds/server/IptvEpgManager/src/CIptvEpgManagerImpl.cpp	Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,278 @@
+/*
+* Copyright (c) 2004-2005 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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 FILES
+#include <e32base.h>
+#include <bautils.h>
+#include "IptvDebug.h"
+#include "CIptvEpgDatabase.h"
+#include "CIptvEpgLiveTvCallbackImpl.h"
+#include "IptvLiveEpgConstants.h"
+#include "CIptvEpgDb.h"
+#include "CIptvEpgManagerImpl.h"
+#include "CIptvServer.h"
+#include "CIptvEpgSession.h"
+#include "CIptvServiceManager.h"
+#include "CIptvEpgVodMsqQueue.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ---------------------------------------------------------
+// CIptvEpgManagerImpl::ConstructL
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------
+//
+void CIptvEpgManagerImpl::ConstructL()
+    {       
+    IPTVLOGSTRING_LOW_LEVEL("CIptvEpgManagerImpl::ConstructL");
+
+    User::LeaveIfError( iServer.iServiceManager->RegisterObserver( this ) );
+    User::LeaveIfError( iFs.Connect() );
+    }
+
+// ---------------------------------------------------------
+// CIptvEpgManagerImpl::NewL
+// Two-phased constructor.
+// Create instance of concrete interface implementation
+// ---------------------------------------------------------
+//
+CIptvEpgManagerImpl* CIptvEpgManagerImpl::NewL(CIptvServer& aServer)
+    {
+    IPTVLOGSTRING_LOW_LEVEL("CIptvEpgManagerImpl::NewL");  
+
+    CIptvEpgManagerImpl* self = new(ELeave) CIptvEpgManagerImpl(aServer);
+    CleanupStack::PushL(self);
+
+    self->ConstructL();
+
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// ---------------------------------------------------------
+// CIptvEpgManagerImpl::~CIptvEpgManagerImpl
+// Destructor
+// ---------------------------------------------------------
+//
+CIptvEpgManagerImpl::~CIptvEpgManagerImpl()
+    {	
+    IPTVLOGSTRING_LOW_LEVEL("CIptvEpgManagerImpl::~CIptvEpgManagerImpl");  
+
+    iServer.iServiceManager->DeRegisterObserver(this);
+    iEpgDbArray.ResetAndDestroy();
+    iFs.Close();
+    }
+
+// ---------------------------------------------------------
+// CIptvEpgManagerImpl::CIptvEpgManagerImpl
+// C++ default constructor
+// ---------------------------------------------------------
+//
+CIptvEpgManagerImpl::CIptvEpgManagerImpl(CIptvServer& aServer) : 
+    iServer( aServer )
+    {
+    IPTVLOGSTRING_LOW_LEVEL("CIptvEpgManagerImpl::CIptvEpgManagerImpl");
+    }
+
+// ---------------------------------------------------------
+// CIptvEpgManagerImpl::CreateSession
+// 
+// ---------------------------------------------------------
+// 
+CIptvEpgSession* CIptvEpgManagerImpl::CreateSessionL(TUint32 aServiceId, CIptvEpgVodMsqQueue* aMsgQueue, TInt& aError, TBool aPluginCanRun)
+    {    
+    IPTVLOGSTRING_LOW_LEVEL("CIptvEpgManagerImpl::CreateSession");  
+  
+    CIptvEpgSession* session = NULL;
+    CIptvService*    service = NULL;
+
+    service = iServer.iServiceManager->GetServiceL( aServiceId, ETrue /* do open/close */ );
+
+    if (service)
+        {
+        CIptvService::TServiceType serviceType = service->GetType();
+        delete service;
+
+        CDbHolder* dbHolder = NULL;
+
+        switch (serviceType)
+            {
+            case CIptvService::EVod:
+            case CIptvService::EVodCast:
+            case CIptvService::ESearch:
+            case CIptvService::EServiceGroup:
+                {
+                dbHolder = GetDatabaseHolderL( aServiceId, ETrue );
+                session = CIptvEpgSession::NewL(dbHolder->iEpgDb, aServiceId, aMsgQueue, iServer, aPluginCanRun, aError);
+                }
+                break;
+            case CIptvService::ELiveTv:
+                {
+                dbHolder = GetDatabaseHolderL( aServiceId, EFalse );
+                session = CIptvEpgSession::NewL(dbHolder->iLiveTvDb, aServiceId, aMsgQueue, iServer, aPluginCanRun, aError);
+                }
+                break;                        
+            default:
+                User::Leave( KErrNotSupported );
+                break;
+            }
+        }
+    else
+        {
+        User::Leave( KErrNotFound );
+        }
+
+    return session;
+    }
+
+// --------------------------------------------------------------------------
+// CIptvEpgManagerImpl::GetDatabaseHolderL
+// 
+// --------------------------------------------------------------------------
+// 
+CIptvEpgManagerImpl::CDbHolder* CIptvEpgManagerImpl::GetDatabaseHolderL(
+    TUint32 aServiceId,
+    TBool aEpgDb )
+    {
+    //  Try to find first
+    for (TInt i = 0; i < iEpgDbArray.Count(); i++)
+        {
+        CIptvEpgManagerImpl::CDbHolder* dbHolder = iEpgDbArray[i];
+        if (dbHolder->iServiceId == aServiceId)
+            {
+            dbHolder->iReferenceCount++;
+            return dbHolder;
+            }
+        }
+
+    //  Create holder for the db
+    CIptvEpgManagerImpl::CDbHolder* dbHolder = new (ELeave) CDbHolder();
+    CleanupStack::PushL( dbHolder );
+    iEpgDbArray.AppendL( dbHolder );
+    CleanupStack::Pop( dbHolder );
+    dbHolder->iServiceId = aServiceId;
+    dbHolder->iReferenceCount = 1;
+
+    //  Create db
+    if (aEpgDb)
+        {
+        TBuf<KIptvMaxPath> path;
+        CIptvUtil::GetPathL( iFs, EIptvPathEcg, path );
+        path.Append(KIptvEpgDbName);
+        TBuf<KIptvServiceIdMaxLength> service;
+        service.Num( aServiceId );
+        path.Append( service );
+
+        dbHolder->iEpgDb = CIptvEpgDb::NewL( path, aServiceId, iServer );
+        }
+    else
+        {
+        TBuf<KIptvMaxPath> path;
+        CIptvUtil::GetPathL( iFs, EIptvPathTmpLive, aServiceId, path );
+        path.Append( KLiveTvEPGDatabaseName );
+        
+        // if path exists delete the file. This is done to make sure
+        // update is done to a clear database.
+        if ( BaflUtils::FileExists( iFs, path ) )
+        	{
+        	TInt error = BaflUtils::DeleteFile( iFs, path );
+			if ( error != KErrNone )
+				{
+				IPTVLOGSTRING2_LOW_LEVEL("Failed to delete live database file: %d", error);  	
+				}
+		    
+        	}
+        dbHolder->iLiveTvDb = CIptvEpgDatabase::NewL( path );
+        }
+
+    return dbHolder;
+    }
+
+// ---------------------------------------------------------
+// CIptvEpgManagerImpl::CloseSession
+// 
+// ---------------------------------------------------------
+// 
+void CIptvEpgManagerImpl::CloseSession(TUint32 aServiceId)
+    {
+    IPTVLOGSTRING_LOW_LEVEL("CIptvEpgManagerImpl::CloseSession");  
+
+    //  Find the database
+    for (TInt i = 0; i < iEpgDbArray.Count(); i++)
+        {
+        CIptvEpgManagerImpl::CDbHolder* dbHolder = iEpgDbArray[i];
+        if (dbHolder->iServiceId == aServiceId)
+            {
+            //  Decrease ref count and if it goes to zero, delete it
+            dbHolder->iReferenceCount--;
+            if (dbHolder->iReferenceCount < 1)
+                {
+                iEpgDbArray.Remove( i );
+                delete dbHolder;
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CIptvEpgManagerImpl::HandleSmEvent
+// 
+// ---------------------------------------------------------
+// 
+void CIptvEpgManagerImpl::HandleSmEvent(CIptvSmEvent& aEvent)
+    {
+    IPTVLOGSTRING_LOW_LEVEL("CIptvEpgManagerImpl::ServiceModified");
+
+    // Delete epg-database. There is no session with aServiceId when this mehtod is called.
+    // -> We can delete database directly.
+
+    if (aEvent.iEvent == CIptvSmEvent::EServiceModified)
+        {
+        RFs fs;
+        TInt error = fs.Connect();
+        if (error == KErrNone)
+            {        
+            TBuf<KIptvMaxPath> path;
+            TRAP_IGNORE(CIptvUtil::GetPathL(fs, EIptvPathEcg, path, EDriveC, EFalse));
+        
+            path.Append(KIptvEpgDbName);
+        
+            TBuf<KIptvServiceIdMaxLength> service;
+            service.Num(aEvent.iServiceId);
+            path.Append(service);
+        
+            IPTVLOGSTRING2_LOW_LEVEL("CIptvEpgManagerImpl::ServiceModified --> deleting: %S", &path);
+        
+            // If exist, delete epg database
+            if (BaflUtils::FileExists(fs, path))
+                {    
+                BaflUtils::DeleteFile(fs, path);
+                }      
+          
+            fs.Close();
+            }
+        }
+    }
+
+CIptvEpgManagerImpl::CDbHolder::~CDbHolder()
+    {
+    delete iEpgDb;
+    delete iLiveTvDb;
+    }