diff -r 000000000000 -r 96612d01cf9f videofeeds/server/IptvEpgManager/src/CIptvEpgManagerImpl.cpp --- /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 +#include +#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 path; + CIptvUtil::GetPathL( iFs, EIptvPathEcg, path ); + path.Append(KIptvEpgDbName); + TBuf service; + service.Num( aServiceId ); + path.Append( service ); + + dbHolder->iEpgDb = CIptvEpgDb::NewL( path, aServiceId, iServer ); + } + else + { + TBuf 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 path; + TRAP_IGNORE(CIptvUtil::GetPathL(fs, EIptvPathEcg, path, EDriveC, EFalse)); + + path.Append(KIptvEpgDbName); + + TBuf 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; + }