homesync/contentmanager/mediaservant/src/msfillrulecontroller.cpp
changeset 0 7f85d04be362
child 30 5ec426854821
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homesync/contentmanager/mediaservant/src/msfillrulecontroller.cpp	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,664 @@
+/*
+* Copyright (c) 2008 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:  CMSFillRuleController class implementation
+*
+*/
+
+
+#include <StringLoader.h>
+#include <mediaservant.rsg>
+#include <utf.h>
+
+#include "cmfillrulecontainer.h"
+#include "cmfillrule.h"
+#include "msfillrulecontroller.h"
+#include "msconstants.h"
+#include "mediaservant.hrh"
+#include "msengine.h"
+#include "msdebug.h"
+
+
+// --------------------------------------------------------------------------
+// CMSFillRuleController::NewL
+// --------------------------------------------------------------------------
+//
+CMSFillRuleController* CMSFillRuleController::NewL( CMSEngine& aMSEngine )
+    {
+    LOG(_L("[MediaServant]\t CMSFillRuleController::NewL"));
+
+    CMSFillRuleController* self = CMSFillRuleController::NewLC( aMSEngine );    
+    CleanupStack::Pop(self);
+    
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillRuleController::NewLC
+// --------------------------------------------------------------------------
+//
+CMSFillRuleController* CMSFillRuleController::NewLC( CMSEngine& aMSEngine )
+    {
+    LOG(_L("[MediaServant]\t CMSFillRuleController::NewLC"));
+
+    CMSFillRuleController* self = new (ELeave) CMSFillRuleController(
+                                                    aMSEngine );
+
+    CleanupStack::PushL(self);
+    self->ConstructL();
+        
+    return self;
+    }
+    
+// --------------------------------------------------------------------------
+// CMSFillRuleController::ConstructL
+// --------------------------------------------------------------------------
+//
+void CMSFillRuleController::ConstructL()
+    {
+    LOG(_L("[MediaServant]\t CMSFillRuleController::ConstructL"));
+
+    if (iMSEngine)
+        {
+        InitializeRuleContainersL();
+        }
+    }
+// --------------------------------------------------------------------------
+// CMSFillRuleController::CMSFillRuleController()
+// --------------------------------------------------------------------------
+//
+CMSFillRuleController::CMSFillRuleController( CMSEngine& aMSEngine )
+    {
+    LOG(_L("[MediaServant]\t CMSFillRuleController::CMSFillRuleController"));
+
+    iMSEngine = &aMSEngine;
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillRuleController::~CMSFillRuleController()
+// --------------------------------------------------------------------------
+//
+CMSFillRuleController::~CMSFillRuleController()
+    {
+    LOG(_L("[MediaServant]\t CMSFillRuleController::~CMSFillRuleController"));
+
+    iFillListArray.ResetAndDestroy();
+    iFillListArray.Close();
+
+    delete iRuleContainer;
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillRuleController::FillListArray()
+// Returns pointer to fill list array
+// --------------------------------------------------------------------------
+//
+RPointerArray<CMSFillList>* CMSFillRuleController::FillListArray()
+    {
+    LOG(_L("[MediaServant]\t CMSFillRuleController::FillListArray"));
+
+    return &iFillListArray;
+    }
+
+// ---------------------------------------------------------------------------
+// CMSFillRuleController::InitializeRuleContainersL
+// initializes rule containers
+// ---------------------------------------------------------------------------
+//
+void CMSFillRuleController::InitializeRuleContainersL()
+    {
+    LOG(_L("[MediaServant]\t CMSFillRuleController::\
+    InitializeRuleContainersL"));
+
+    TInt error( KErrNone );
+    // Check if wizard has been executed
+    TBool runWizard = iMSEngine->GetAppWizardState( error );
+
+    if ( !runWizard  )
+        {
+        CreateFillRulesL();
+        delete iRuleContainer;
+        iRuleContainer = NULL;
+        iRuleContainer = iMSEngine->FillRulesL();
+        }
+    else
+        {
+        // FILL RULES
+        iRuleContainer = iMSEngine->FillRulesL();
+        }
+
+    // Creates pointer array to rules so we can change rule order at UI
+    // Operations done trough pointer array affects original rules
+    // in RuleContainer
+    if ( iRuleContainer )
+        {
+        // Arrange rules by priority to pointer table
+        TInt rulecount = iRuleContainer->FillRuleCount();
+
+        for (TUint8 order = 0; order < rulecount; order++)
+            {
+            // search rule with desired priority
+            for (TInt index = 0; index < rulecount; index++)
+                {
+
+                CCmFillRule* rule = iRuleContainer->FillRule(index);
+                TUint8 priority = rule->Priority();
+
+                if ( order == priority )
+                    {
+                    CMSFillList* list =
+                        CMSFillList::NewL( *iMSEngine, *rule );
+                    // add list to array
+                    iFillListArray.Append( list );
+
+                    // stop for loop
+                    index = rulecount;
+                    }
+                }
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillRuleController::CreateFillRulesL()
+// FOR TEST
+// --------------------------------------------------------------------------
+//
+void CMSFillRuleController::CreateFillRulesL()
+    {
+    CCmFillRuleContainer* fillRuleContainer = CCmFillRuleContainer::NewLC();
+
+    // default list 1
+    CCmFillRule* defaultList1 = CCmFillRule::NewLC();
+
+    HBufC* temp = StringLoader::LoadLC( R_MS_DEFAULT_FILL_LIST_1 );
+    HBufC8* listName = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *temp );
+    CleanupStack::PushL( listName );
+    defaultList1->SetNameL( *listName );
+    CleanupStack::PopAndDestroy( 2, temp );
+
+    defaultList1->SetMediaType( ECmImage );
+    defaultList1->SetMethod( ECmLatest );
+    defaultList1->SetSelected( ECmUnSelected );
+    defaultList1->SetPriority( 0 );
+    defaultList1->SetTemplateId( EMSDefaultImageList );
+    defaultList1->SetStatus( ECmToBeFilled );
+    defaultList1->SetLimitType( EMbits );
+    defaultList1->SetAmount( KDefaultListSize50 );
+
+    fillRuleContainer->AddFillRuleL( defaultList1 );
+
+    // default list 2
+    CCmFillRule* defaultList2 = CCmFillRule::NewLC();
+
+    temp = StringLoader::LoadLC( R_MS_DEFAULT_FILL_LIST_2 );
+    listName = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *temp );
+    CleanupStack::PushL( listName );
+    defaultList2->SetNameL( *listName );
+    CleanupStack::PopAndDestroy( 2, temp );
+
+    defaultList2->SetMediaType( ECmVideo );
+    defaultList2->SetMethod( ECmLatest );
+    defaultList2->SetSelected( ECmUnSelected );
+    defaultList2->SetPriority( 1 );
+    defaultList2->SetTemplateId( EMSDefaultVideoList );
+    defaultList2->SetStatus( ECmToBeFilled );
+    defaultList2->SetLimitType( EMbits );
+    defaultList2->SetAmount( KDefaultListSize50 );
+
+    fillRuleContainer->AddFillRuleL( defaultList2 );
+
+    // default list 3
+    CCmFillRule* defaultList3 = CCmFillRule::NewLC();
+
+    temp = StringLoader::LoadLC( R_MS_DEFAULT_FILL_LIST_3 );
+    listName = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *temp );
+    CleanupStack::PushL( listName );
+    defaultList3->SetNameL( *listName );
+    CleanupStack::PopAndDestroy( 2, temp );
+
+    defaultList3->SetMediaType( ECmAudio );
+    defaultList3->SetMethod( ECmLatest );
+    defaultList3->SetSelected( ECmUnSelected );
+    defaultList3->SetPriority( 2 );
+    defaultList3->SetTemplateId( EMSDefaultMusicList );
+    defaultList3->SetStatus( ECmToBeFilled );
+    defaultList3->SetLimitType( EMbits );
+    defaultList3->SetAmount( KDefaultListSize200 );
+
+    fillRuleContainer->AddFillRuleL( defaultList3 );
+
+    iMSEngine->SetFillRulesL( fillRuleContainer );
+
+    CleanupStack::Pop( defaultList3 );
+    CleanupStack::Pop( defaultList2 );
+    CleanupStack::Pop( defaultList1 );
+    CleanupStack::PopAndDestroy( fillRuleContainer );
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillRuleController::DeleteRuleL()
+// Deletes current rule
+// --------------------------------------------------------------------------
+//
+void CMSFillRuleController::DeleteRuleL( TInt aCurrentIndex )
+    {
+    LOG(_L("[MediaServant]\t CMSFillContainer::DeleteRuleL"));
+
+    // get priority of selected rule
+    TInt currentPriority =
+            iFillListArray[ aCurrentIndex ]->List()->Priority();
+
+    // Rulecontainer must be scanned to find the index index of
+    // rule container.
+    // Priority can be used to compare because there can't be two rules
+    // with same priority.
+    for (TInt index = 0; index < iRuleContainer->FillRuleCount(); index++)
+        {
+        if (currentPriority == iRuleContainer->FillRule( index )->Priority())
+            {
+            iFillListArray[ aCurrentIndex ]->
+                    List()->SetSelected( ECmDeleted );
+            }
+        }
+
+    // recalculate priorities
+    SetPriorities();
+
+    // store rules to server
+    iMSEngine->SetFillRulesL( iRuleContainer );
+
+    // update pointer array
+    UpdateArrayL();
+
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillRuleController::AddRuleL()
+// Adds new rule
+// --------------------------------------------------------------------------
+//
+void CMSFillRuleController::AddRuleL( CCmFillRule* aRule )
+    {
+    LOG(_L("[MediaServant]\t CMSFillContainer::DeleteRuleL"));
+
+    if ( aRule )
+        {
+        TInt priority = iFillListArray.Count();
+        aRule->SetPriority( priority );
+        iRuleContainer->AddFillRuleL( aRule );
+
+        // store rules to server
+        iMSEngine->SetFillRulesL( iRuleContainer );
+
+        // update pointer array
+        UpdateArrayL();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillRuleController::SetPriorities()
+// Sets priorities of rule array
+// --------------------------------------------------------------------------
+//
+void CMSFillRuleController::SetPriorities()
+    {
+    TInt priority = 0;
+
+    for ( TInt index = 0; index < iFillListArray.Count(); index++ )
+        {
+        if ( iFillListArray[index]->List()->Selected() != ECmDeleted )
+            {
+            iFillListArray[index]->List()->SetPriority( priority );
+            priority++; // next list priority
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillRuleController::compare()
+// For sort. Sort is based on rule priority
+// --------------------------------------------------------------------------
+//
+TInt CMSFillRuleController::compare ( const CMSFillList& rule1,
+                                      const CMSFillList& rule2)
+
+    {
+    LOG(_L("[MediaServant]\t CMSFillRuleController::compare"));
+
+    TInt result = 0;
+
+    if ( rule1.Priority() < rule2.Priority() )
+        {
+        result = -1;
+        }
+    else if ( rule1.Priority() > rule2.Priority() )
+        {
+        result = 1;
+        }
+
+    return result;
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillRuleController::ChangePriority()
+// Change priorities of rules
+// --------------------------------------------------------------------------
+//
+void CMSFillRuleController::ChangePriority( TUint aTotalItem,
+                                            TUint aCurrentItem,
+                                            TInt aDirection )
+    {
+    LOG(_L("[MediaServant]\t CMSFillRuleController::ChangePriority"));
+
+    TLinearOrder<CMSFillList> key(CMSFillRuleController::compare);
+
+    // up
+    if (aDirection == -1 && aCurrentItem)
+        {
+        // swap priotities of rules
+        iFillListArray[aCurrentItem]->List()->SetPriority(aCurrentItem-1);
+        iFillListArray[aCurrentItem-1]->List()->SetPriority(aCurrentItem);
+
+        iFillListArray.Sort(key);
+        }
+    // down
+    else if ( aDirection == 1 && aCurrentItem < aTotalItem - 1 )
+        {
+        // swap priotities of rules
+        iFillListArray[aCurrentItem]->List()->SetPriority(aCurrentItem+1);
+        iFillListArray[aCurrentItem+1]->List()->SetPriority(aCurrentItem);
+
+        iFillListArray.Sort(key);
+        }
+    else
+        {
+        // Do nothing
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillRuleController::UpdateArrayL()
+// Resets old fill rule array and reads new rules from server
+// --------------------------------------------------------------------------
+//
+void  CMSFillRuleController::UpdateArrayL()
+    {
+    LOG(_L("[MediaServant]\t CMSFillRuleController::UpdateArrayL"));
+
+    // FILL RULES
+    delete iRuleContainer;
+    iRuleContainer = NULL;
+    iRuleContainer = iMSEngine->FillRulesL();
+
+    // Creates pointer array to rules so we can change rule order at UI
+    // Operations done trough pointer array affects original rules
+    // in RuleContainer
+    if ( iRuleContainer )
+        {
+        iFillListArray.ResetAndDestroy();
+        // Arrange rules by priority to pointer table
+        TInt rulecount = iRuleContainer->FillRuleCount();
+
+        for (TUint8 order = 0; order < rulecount; order++)
+            {
+            // search rule with desired priority
+            for (TInt index = 0; index < rulecount; index++)
+                {
+
+                CCmFillRule* rule = iRuleContainer->FillRule(index);
+                TUint8 priority = rule->Priority();
+
+                if ( order == priority )
+                    {
+                    // stop for loop
+                    index = rulecount;
+                    CMSFillList* list =
+                            CMSFillList::NewLC( *iMSEngine, *rule );
+                    // add rule to array
+                    iFillListArray.Append( list );
+                    CleanupStack::Pop( list );
+                    }
+                }
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillRuleController::SaveRulesL()
+// Sends fill rules to server
+// --------------------------------------------------------------------------
+//
+void  CMSFillRuleController::SaveRulesL()
+    {
+    LOG(_L("[MediaServant]\t CMSFillRuleController::SaveRulesL"));
+
+    iMSEngine->SetFillRulesL( iRuleContainer );
+    }
+
+
+// --------------------------------------------------------------------------
+// CMSFillRuleController::HasPriorityChangedL()
+// Checks if list priorities has been changed
+// --------------------------------------------------------------------------
+//
+TBool CMSFillRuleController::HasPriorityChangedL()
+    {
+    LOG(_L("[MediaServant]\t CMSFillRuleController::\
+    HasPriorityChangedL"));
+
+    TBool status( EFalse );
+
+    CCmFillRuleContainer* fillLists = iMSEngine->FillRulesL();
+    CleanupStack::PushL( fillLists );
+    TInt listCount = fillLists->FillRuleCount();
+    TInt arrayCount = iFillListArray.Count();
+
+    if ( listCount == arrayCount )
+        {
+        for ( TInt index = 0; index < listCount; index++ )
+            {
+            CCmFillRule* origList = fillLists->FillRule(index);
+            TInt origPriority = origList->Priority();
+
+            // lists are in priority order in iFillListArray
+            CCmFillRule* modList = iFillListArray[ origPriority ]->List();
+
+            // if list names are same we have the same lists
+            if ( origList->Name().Compare( modList->Name() ) )
+                {
+                status = ETrue;
+                index = listCount; // break loop
+                }
+            }
+        }
+    else
+        {
+        status = ETrue;
+        }
+
+    CleanupStack::PopAndDestroy( fillLists );
+    return status;
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillRuleController::HasSelectionsChanged()
+// Checks if list activity has been changed
+// --------------------------------------------------------------------------
+//
+TBool CMSFillRuleController::HasSelectionsChanged( TCmFillRuleStatus aStatus )
+    {
+    LOG(_L("[MediaServant]\t CMSFillRuleController::\
+    HasSelectionsChanged"));
+
+    TBool status( EFalse );
+
+    TInt listCount = iFillListArray.Count();
+
+    for ( TInt index = 0; index < listCount; index++ )
+        {
+        if ( iFillListArray[ index ]->OriginalSelectionStatus() !=
+             iFillListArray[ index ]->List()->Selected() &&
+             iFillListArray[ index ]->OriginalSelectionStatus() != aStatus )
+            {
+            // activity changed
+            status = ETrue;
+            index = listCount;
+            }
+
+        }
+    return status;
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillRuleController::RestoreOriginalSelections()
+// --------------------------------------------------------------------------
+//
+void CMSFillRuleController::RestoreOriginalSelections()
+    {
+    LOG(_L("[MediaServant]\t CMSFillRuleController::\
+    RestoreOriginalSelections"));
+    TInt listCount = iFillListArray.Count();
+
+    for ( TInt index = 0; index < listCount; index++ )
+        {
+        iFillListArray[index]->List()->SetSelected(
+                iFillListArray[index]->OriginalSelectionStatus() );
+        }
+    }
+
+
+
+
+
+/***************** CMSFillList class implementation **********************/
+
+
+// --------------------------------------------------------------------------
+// CMSFillList::NewL
+// --------------------------------------------------------------------------
+//
+CMSFillList* CMSFillList::NewL( CMSEngine& aMSEngine, CCmFillRule& aFillList )
+    {
+    LOG(_L("[MediaServant]\t CMSFillList::NewL"));
+
+    CMSFillList* self = CMSFillList::NewLC( aMSEngine, aFillList );
+    CleanupStack::Pop(self);
+    
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillList::NewLC
+// --------------------------------------------------------------------------
+//
+CMSFillList* CMSFillList::NewLC( CMSEngine& aMSEngine,
+                                 CCmFillRule& aFillList )
+    {
+    LOG(_L("[MediaServant]\t CMSFillList::NewLC"));
+
+    CMSFillList* self = new (ELeave) CMSFillList( aMSEngine, aFillList );
+
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    
+    return self;
+    }
+    
+// --------------------------------------------------------------------------
+// CMSFillList::ConstructL
+// --------------------------------------------------------------------------
+//
+void CMSFillList::ConstructL()
+    {
+    LOG(_L("[MediaServant]\t CMSFillList::ConstructL"));
+
+    iListSize = iFillList->ListRealSizeInBytes();
+    iItemCount = iFillList->ListRealCount();
+    }
+// --------------------------------------------------------------------------
+// CMSFillList::CMSFillList()
+// --------------------------------------------------------------------------
+//
+CMSFillList::CMSFillList( CMSEngine& aMSEngine, CCmFillRule& aFillList )
+    {
+    LOG(_L("[MediaServant]\t CMSFillRuleController::CMSFillRuleController"));
+    iFillList = &aFillList;
+    iMSEngine = &aMSEngine;
+
+    iSelected = iFillList->Selected();
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillList::~CMSFillList()
+// --------------------------------------------------------------------------
+//
+CMSFillList::~CMSFillList()
+    {
+    LOG(_L("[MediaServant]\t CMSFillList::~CMSFillList"));
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillList::List()
+// --------------------------------------------------------------------------
+//
+CCmFillRule* CMSFillList::List()
+    {
+    LOG(_L("[MediaServant]\t CMSFillList::List"));
+
+    return iFillList;
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillList::List()
+// --------------------------------------------------------------------------
+//
+TUint32 CMSFillList::ListSize()
+    {
+    LOG(_L("[MediaServant]\t CMSFillList::ListSize"));
+
+    return iListSize;
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillList::List()
+// --------------------------------------------------------------------------
+//
+TUint32 CMSFillList::ItemCount()
+    {
+    LOG(_L("[MediaServant]\t CMSFillList::ItemCount"));
+
+    return iItemCount;
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::Priority
+// Return list priority
+// --------------------------------------------------------------------------
+//
+TInt CMSFillList::Priority() const
+    {
+    return iFillList->Priority();
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::Priority
+// Return list priority
+// --------------------------------------------------------------------------
+//
+TCmFillRuleStatus CMSFillList::OriginalSelectionStatus()
+    {
+    return iSelected;
+    }
+
+// End of File