--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpharvester/common/cmlibrary/src/cmstorerule.cpp Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,465 @@
+/*
+* Copyright (c) 2006-2007 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: Capsulating store rule
+*
+*/
+
+
+
+
+
+
+// INCLUDES
+#include <e32std.h>
+#include <s32mem.h>
+#include "cmmediaserver.h"
+#include "cmstorerule.h"
+#include "msdebug.h"
+
+// CONSTANTS
+const TInt KArrayGranularity = 16;
+const TInt KArrayGranularityContainer = 8;
+
+// ======== LOCAL FUNCTIONS ========
+// ---------------------------------------------------------------------------
+// NewL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CCmStoreRule* CCmStoreRule::NewL()
+ {
+ CCmStoreRule* self = CCmStoreRule::NewLC();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// NewLC
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CCmStoreRule* CCmStoreRule::NewLC()
+ {
+ CCmStoreRule* self = new ( ELeave ) CCmStoreRule();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CCmStoreRule::~CCmStoreRule()
+ {
+ delete iName;
+
+ iRuleDefs.Reset();
+ iRuleDefs.Close();
+
+ iMediaServers.ResetAndDestroy();
+ iMediaServers.Close();
+
+ iExcPlayLists->Reset();
+ iExcAlbums->Reset();
+
+ delete iExcPlayLists;
+ delete iExcAlbums;
+ }
+
+// ---------------------------------------------------------------------------
+// Add new rule into StoreRule
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CCmStoreRule::AddStoreRuleL( TCmMediaType aMediaType )
+ {
+ iRuleDefs.AppendL( aMediaType );
+ TInt index = iRuleDefs.Count() - 1;
+ return index;
+ }
+
+// ---------------------------------------------------------------------------
+// Get rule
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCmStoreRule::StoreRule( TInt aIndex, TCmMediaType* aMediaType )
+ {
+ *aMediaType = (TCmMediaType)iRuleDefs[aIndex];
+ }
+
+// ---------------------------------------------------------------------------
+// Add new media server into FillRule
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CCmStoreRule::AddMediaServerL( const TDesC8& aUDN )
+ {
+ CCmMediaServer* server = CCmMediaServer::NewLC();
+ server->SetUDNL( aUDN );
+ iMediaServers.Append( server );
+ CleanupStack::Pop( server );
+ TInt index = iMediaServers.Count() - 1;
+ return index;
+ }
+
+// ---------------------------------------------------------------------------
+// Delete media server from the store rule
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCmStoreRule::DeleteMediaServer( const TDesC8& aUDN )
+ {
+ TBool deleted( EFalse );
+ for( TInt i = 0; i < iMediaServers.Count() && !deleted; i++ )
+ {
+ if( KErrNone == iMediaServers[i]->MediaServer().Compare(aUDN) )
+ {
+ delete iMediaServers[i];
+ iMediaServers.Remove(i);
+ iMediaServers.Compress();
+ deleted = ETrue;
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Adds one album into excluded list
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCmStoreRule::AddExcAlbumL( const TDesC& aAlbum )
+ {
+ TRACE(Print(_L("[COMMON]\t AddExcAlbumL( %S )"), &aAlbum ));
+ HBufC* temp = aAlbum.AllocL();
+ CleanupStack::PushL( temp );
+ iExcAlbums->AppendL( *temp );
+ CleanupStack::Pop( temp );
+ }
+
+// ---------------------------------------------------------------------------
+// Adds one playlist into excluded list
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCmStoreRule::AddExcPlayListL( const TDesC& aPlayList )
+ {
+ HBufC* temp = aPlayList.AllocL();
+ CleanupStack::PushL( temp );
+ iExcPlayLists->AppendL( *temp );
+ CleanupStack::Pop( temp );
+ }
+
+// ---------------------------------------------------------------------------
+// Removes one album from the excluded list
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCmStoreRule::RemoveExcAlbum( const TDesC& aAlbum )
+ {
+ TInt pos( KErrNone );
+ TInt err( iExcAlbums->Find( aAlbum, pos, ECmpNormal ) );
+ if( err == KErrNone )
+ {
+ iExcAlbums->Delete( pos );
+ iExcAlbums->Compress();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Removes one playlist from the excluded list
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCmStoreRule::RemoveExcPlayList( const TDesC& aPlayList )
+ {
+ TInt pos( KErrNone );
+ TInt err( iExcPlayLists->Find( aPlayList, pos, ECmpNormal ) );
+ if( err == KErrNone )
+ {
+ iExcPlayLists->Delete( pos );
+ iExcPlayLists->Compress();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Returns excluded albums
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CDesCArray& CCmStoreRule::ExcAlbums()
+ {
+ return *iExcAlbums;
+ }
+
+// ---------------------------------------------------------------------------
+// Returns excluded playlists
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CDesCArray& CCmStoreRule::ExcPlayLists()
+ {
+ return *iExcPlayLists;
+ }
+
+// ---------------------------------------------------------------------------
+// Get media server
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const TDesC8& CCmStoreRule::MediaServerL( TInt aIndex )
+ {
+ // check parameter
+ if ( aIndex < 0 || aIndex >= iMediaServers.Count() )
+ {
+ User::Leave( KErrArgument );
+ }
+
+ return iMediaServers[aIndex]->MediaServer();
+ }
+
+// ---------------------------------------------------------------------------
+// Returns count of rules
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CCmStoreRule::DefCount() const
+ {
+ return iRuleDefs.Count();
+ }
+
+// ---------------------------------------------------------------------------
+// Returns count of media servers
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CCmStoreRule::MediaServerCount() const
+ {
+ return iMediaServers.Count();
+ }
+
+// ---------------------------------------------------------------------------
+// Sets FillRule name
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCmStoreRule::SetNameL( const TDesC8& aName )
+ {
+ delete iName;
+ iName = NULL;
+ iName = aName.AllocL();
+ }
+
+// ---------------------------------------------------------------------------
+// Get Name
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TDesC8& CCmStoreRule::Name() const
+ {
+ return *iName;
+ }
+
+// ---------------------------------------------------------------------------
+// Sets list id, when storing data into db this values isn't used as a
+// db list id
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCmStoreRule::SetListId( const TUint aId )
+ {
+ iId = aId;
+ }
+
+// ---------------------------------------------------------------------------
+// Get list id
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TUint CCmStoreRule::ListId() const
+ {
+ return iId;
+ }
+
+// ---------------------------------------------------------------------------
+// Sets selected state
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCmStoreRule::SetSelected( TCmFillRuleStatus aSelected )
+ {
+ iSelected = aSelected;
+ }
+
+// ---------------------------------------------------------------------------
+// Returns method
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TCmFillRuleStatus CCmStoreRule::Selected() const
+ {
+ return iSelected;
+ }
+
+// ---------------------------------------------------------------------------
+// Sets rule's status ( e.g ECmToBeRemoved )
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCmStoreRule::SetStatus( TCmListItemStatus aStatus )
+ {
+ iStatus = aStatus;
+ }
+
+// ---------------------------------------------------------------------------
+// Returns status
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TCmListItemStatus CCmStoreRule::Status() const
+ {
+ return iStatus;
+ }
+
+// ---------------------------------------------------------------------------
+// CCmStoreRule::ExternalizeL
+// ---------------------------------------------------------------------------
+//
+void CCmStoreRule::ExternalizeL( RWriteStream& aStream ) const
+ {
+ aStream.WriteInt32L( iName->Length() );
+ if ( iName )
+ {
+ aStream << *iName;
+ }
+ else
+ {
+ aStream << KNullDesC8();
+ }
+
+ aStream.WriteInt16L((TInt)iSelected );
+ aStream.WriteInt16L((TInt)iStatus );
+
+ aStream.WriteInt16L( iRuleDefs.Count() );
+ for ( TInt index(0); index < iRuleDefs.Count(); index++ )
+ {
+ aStream.WriteInt16L((TInt)iRuleDefs[index] );
+ }
+
+ aStream.WriteInt16L( iMediaServers.Count() );
+ for ( TInt index(0); index < iMediaServers.Count(); index++ )
+ {
+ iMediaServers[index]->ExternalizeL( aStream );
+ }
+ TRACE(Print(_L("[COMMON]\t iExcAlbums->Count() = %d"),
+ iExcAlbums->Count() ));
+ aStream.WriteInt16L( iExcAlbums->Count() );
+ for ( TInt index(0); index < iExcAlbums->Count(); index++ )
+ {
+ TRACE(Print(_L("[COMMON]\t iExcAlbums[index].Length() = %d"),
+ iExcAlbums->MdcaPoint(index).Length() ));
+ aStream.WriteInt32L( iExcAlbums->MdcaPoint(index).Length() );
+ aStream << iExcAlbums->MdcaPoint(index);
+ }
+ TRACE(Print(_L("[COMMON]\t iExcPlayLists->Count() = %d"),
+ iExcPlayLists->Count() ));
+ aStream.WriteInt16L( iExcPlayLists->Count() );
+ for ( TInt index(0); index < iExcPlayLists->Count(); index++ )
+ {
+ TRACE(Print(_L("[COMMON]\t iExcPlayLists[index].Length() = %d"),
+ iExcPlayLists->MdcaPoint(index).Length() ));
+ aStream.WriteInt32L( iExcPlayLists->MdcaPoint(index).Length() );
+ aStream << iExcPlayLists->MdcaPoint(index);
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCmFillRule::InternalizeL
+// ---------------------------------------------------------------------------
+//
+void CCmStoreRule::InternalizeL( RReadStream& aStream )
+ {
+ // Content
+ if ( iName )
+ {
+ delete iName;
+ iName = NULL;
+ }
+ TInt bufLength = aStream.ReadInt32L();
+ iName = HBufC8::NewL( aStream, bufLength );
+
+ // cleanup
+ iRuleDefs.Reset();
+
+ iSelected = (TCmFillRuleStatus)aStream.ReadInt16L();
+ iStatus = (TCmListItemStatus)aStream.ReadInt16L();
+
+ // rule count
+ TInt ruleCount = aStream.ReadInt16L();
+
+ // Then internalize them from the stream one by one
+ for (TInt index = 0; index < ruleCount; index++ )
+ {
+ iRuleDefs.Append((TCmMediaType)aStream.ReadInt16L());
+ }
+
+ // cleanup
+ iMediaServers.ResetAndDestroy();
+
+ // media Server count
+ TInt mediaServerCount = aStream.ReadInt16L();
+
+ // Then internalize them from the stream one by one
+ for (TInt index = 0; index < mediaServerCount; index++ )
+ {
+ CCmMediaServer* server = CCmMediaServer::NewLC();
+ server->InternalizeL( aStream );
+ iMediaServers.Append( server );
+ CleanupStack::Pop( server );
+ server = NULL;
+ }
+ iExcAlbums->Reset();
+ TInt excAlbumsCount( aStream.ReadInt16L() );
+ bufLength = KErrNone;
+ HBufC* temp;
+ TRACE(Print(_L("[COMMON]\t excAlbumsCount = %d"), excAlbumsCount ));
+ for ( TInt index(0); index < excAlbumsCount ; index++ )
+ {
+ bufLength = aStream.ReadInt32L();
+ TRACE(Print(_L("[COMMON]\t bufLength = %d"), bufLength ));
+ temp = HBufC::NewL( aStream, bufLength );
+ CleanupStack::PushL( temp );
+ iExcAlbums->AppendL( *temp );
+ CleanupStack::Pop( temp );
+ temp = NULL;
+ }
+ iExcPlayLists->Reset();
+ TInt excPlayListCount( aStream.ReadInt16L() );
+ bufLength = KErrNone;
+ TRACE(Print(_L("[COMMON]\t excPlayListCount = %d"), excPlayListCount ));
+ for ( TInt index(0); index < excPlayListCount ; index++ )
+ {
+ bufLength = aStream.ReadInt32L();
+ TRACE(Print(_L("[COMMON]\t bufLength = %d"), bufLength ));
+ temp = HBufC::NewL( aStream, bufLength );
+ CleanupStack::PushL( temp );
+ iExcPlayLists->AppendL( *temp );
+ CleanupStack::Pop( temp );
+ temp = NULL;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Default constructor
+// C++ default constructor can NOT contain any code, that might leave.
+// ---------------------------------------------------------------------------
+//
+CCmStoreRule::CCmStoreRule() :
+ iRuleDefs( KArrayGranularity ),
+ iMediaServers( KArrayGranularity )
+ {
+
+ }
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------------------------
+//
+void CCmStoreRule::ConstructL()
+ {
+ iExcAlbums = new ( ELeave ) CDesCArrayFlat( KArrayGranularityContainer );
+ iExcPlayLists =
+ new ( ELeave ) CDesCArrayFlat( KArrayGranularityContainer );
+ }
+
+// End of file
+