homesync/contentmanager/mediaservant/src/msstoreserverssetting.cpp
changeset 0 7f85d04be362
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homesync/contentmanager/mediaservant/src/msstoreserverssetting.cpp	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,350 @@
+/*
+* 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:  CMSStoreServersSetting class implementation
+*
+*/
+
+
+#include <mediaservant.rsg>
+#include <StringLoader.h>
+
+#include "cmmediaserverfull.h"
+#include "cmstorerule.h"
+#include "cmfillrule.h"
+#include "msstoreserverssetting.h"
+#include "msmultiselectionsettingpage.h"
+#include "msconstants.h"
+#include "msappui.h"
+#include "msengine.h"
+#include "msdebug.h"
+
+#include "upnpstring.h"
+
+// CONSTANTS
+const TInt KItemArrayGranularity = 3;
+
+// --------------------------------------------------------------------------
+// CMSStoreServersSetting::NewL
+// --------------------------------------------------------------------------
+//
+CMSStoreServersSetting* CMSStoreServersSetting::NewL(
+                                TInt aIdentifier,
+                                CCmStoreRule* aRule,
+                                CMSAppUi& aAppUi,
+                                TDes& aText )
+    {
+    LOG(_L("[MediaServant]\t CMSStoreServersSetting::NewL"));
+
+    CMSStoreServersSetting* self = CMSStoreServersSetting::NewLC(
+                                             aIdentifier,
+                                             aRule,
+                                             aAppUi,
+                                             aText );
+
+    CleanupStack::Pop(self);
+    
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CMSStoreServersSetting::NewLC
+// --------------------------------------------------------------------------
+//
+CMSStoreServersSetting* CMSStoreServersSetting::NewLC(
+                                TInt aIdentifier,
+                                CCmStoreRule* aRule,
+                                CMSAppUi& aAppUi,
+                                TDes& aText )
+    {
+    LOG(_L("[MediaServant]\t CMSStoreServersSetting::NewLC"));
+
+    CMSStoreServersSetting* self = new (ELeave) CMSStoreServersSetting(
+                                             aIdentifier,
+                                             aRule,
+                                             aAppUi,
+                                             aText );
+
+    CleanupStack::PushL(self);
+    self->ConstructL();
+
+    return self;
+    }
+    
+// --------------------------------------------------------------------------
+// CMSStoreServersSetting::ConstructL
+// --------------------------------------------------------------------------
+//
+void CMSStoreServersSetting::ConstructL()
+    {
+    LOG(_L("[MediaServant]\t CMSStoreServersSetting::ConstructL"));
+
+    iSettingText = HBufC::NewL( KMaxFileName );
+
+    // Get media server list
+    iServers = iAppUi.MSEngine()->GetMediaServersL();
+
+    // create item array
+    CreateSelectionItemListL();
+
+    SetSettingItemTextL();
+    }
+
+// --------------------------------------------------------------------------
+// CMSStoreServersSetting::CMSRuleServersSetting
+// --------------------------------------------------------------------------
+//
+CMSStoreServersSetting::CMSStoreServersSetting(
+    TInt aIdentifier,
+    CCmStoreRule* aRule,
+    CMSAppUi& aAppUi,
+    TDes& aText
+     ) :
+    CAknTextSettingItem( aIdentifier, aText ),
+    iRule( aRule ),
+    iAppUi( aAppUi )
+    {
+    }
+// --------------------------------------------------------------------------
+// CMSStoreServersSetting::~CMSStoreServersSetting()
+// --------------------------------------------------------------------------
+//
+CMSStoreServersSetting::~CMSStoreServersSetting()
+    {
+    delete iSettingText;
+
+    if ( iItemArray )
+        {
+        iItemArray->ResetAndDestroy();
+        delete iItemArray;
+        }
+
+    if ( iServers )
+        {
+        iServers->ResetAndDestroy();
+        iServers->Close();
+        delete iServers;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CMSStoreServersSetting::EditItemL( TBool aCalledFromMenu )
+// --------------------------------------------------------------------------
+//
+void CMSStoreServersSetting::EditItemL( TBool /*aCalledFromMenu*/ )
+    {
+    LOG(_L("[MediaServant]\t CMSStoreServersSetting::EditItemL"));
+
+    // Create setting page
+    CAknSettingPage* dlg = CMSMultiselectionSettingPage::NewL(
+            R_MS_STORE_SETTINGS_LOCATION_SETTING_PAGE,
+            *iItemArray, EFalse );
+    // launch setting page
+    if ( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ) )
+        {
+        DeleteAllServersFromRuleL();
+
+        for ( TInt index = 0; index < iItemArray->Count(); index++ )
+                {
+                CSelectableItem* item = iItemArray->At( index );
+                TBool selected = item->SelectionStatus();
+
+                CCmMediaServerFull* server = (*iServers)[index];
+                // get server UDN
+                TPtrC8 serverUDN = server->MediaServer();
+
+                // add server
+                if ( item->SelectionStatus() )
+                    {
+                    // set server for rule
+                    iRule->AddMediaServerL( serverUDN );
+                    }
+                }
+
+        SetSettingItemTextL();
+        LoadL();
+        // show value on screen
+        UpdateListBoxTextL();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CMSStoreServersSetting::CreateSelectionItemListL
+// Creates selection item list
+// --------------------------------------------------------------------------
+//
+void CMSStoreServersSetting::CreateSelectionItemListL()
+    {
+    if ( iItemArray )
+        {
+        iItemArray->ResetAndDestroy();
+        delete iItemArray;
+        iItemArray = NULL;
+        }
+
+    iItemArray =
+            new ( ELeave ) CSelectionItemList( KItemArrayGranularity );
+
+    TBuf8<KMaxFileName> itemText;
+
+    TInt serverCount(0);
+    if ( iServers )
+        {
+        serverCount = iServers->Count();
+        }
+
+    // Cycle trough all servers
+    for ( TInt idx = 0; idx < serverCount; idx++ )
+        {
+        // get server
+        CCmMediaServerFull* server = (*iServers)[idx];
+        // show only copy capable devices
+        if ( server->StoreUsage() )
+            {
+            HBufC* devName =
+                    UpnpString::ToUnicodeL( server->MediaServerName() );
+            CleanupStack::PushL( devName );
+            CSelectableItem* item = new ( ELeave ) CSelectableItem(
+                                                    *devName, EFalse);
+
+            CleanupStack::PushL( item );
+            // item must be constructed
+            item->ConstructL();
+
+            // count of servers set to rule
+            TInt ruleServerCount = iRule->MediaServerCount();
+
+            // Cycle trough all servers
+            for (TInt index = 0; index < ruleServerCount; index++ )
+                {
+                const TDesC8& ruleServerUDN = iRule->MediaServerL( index );
+
+                if (ruleServerUDN == server->MediaServer()) // compare UDNs
+                    {
+                    // found - break this loop
+                    index = ruleServerCount;
+                    // found - mark selected
+                    item->SetSelectionStatus( ETrue );
+                    iSelectedItemCount++;
+                    }
+                }
+            // append item to list
+            iItemArray->AppendL(item);
+            CleanupStack::Pop( item );
+            CleanupStack::PopAndDestroy( devName );
+            }
+        else    // we don't need this kind of servers anymore so remove it
+            {
+            delete server;
+            iServers->Remove( idx );
+            idx--; // remove transfers next item to current index
+            serverCount--; // servers on the list were reduced
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CMSStoreServersSetting::DeleteAllServersFromRuleL
+// Deletes all servers from rule
+// --------------------------------------------------------------------------
+//
+void CMSStoreServersSetting::DeleteAllServersFromRuleL()
+    {
+    LOG(_L("[MediaServant]\t CMSRuleServersSetting::\
+    CMSStoreServersSetting"));
+
+    // count of servers set to rule
+    TInt ruleServerCount = iRule->MediaServerCount();
+
+    for ( TInt index = ruleServerCount-1; index >= 0; index-- )
+        {
+        const TDesC8& ruleServerUDN = iRule->MediaServerL( index );
+        iRule->DeleteMediaServer( ruleServerUDN );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CMSStoreServersSetting::CountSelectedItems
+// Counts selected items
+// --------------------------------------------------------------------------
+//
+TInt CMSStoreServersSetting::CountSelectedItems()
+    {
+    LOG(_L("[MediaServant]\t CMSRuleServersSetting::\
+    CMSStoreServersSetting"));
+
+    TInt count(0);
+
+    for ( TInt index = 0; index < iItemArray->Count(); index++ )
+        {
+        if ( (*iItemArray)[index]->SelectionStatus() )
+            {
+            count++;
+            }
+        }
+
+    return count;
+    }
+
+// --------------------------------------------------------------------------
+// CMSStoreServersSetting::SetSettingItemTextL
+// Sets setting item secondary text according to selected items
+// --------------------------------------------------------------------------
+//
+void CMSStoreServersSetting::SetSettingItemTextL()
+    {
+        TInt count = CountSelectedItems();
+
+        HBufC* itemText = NULL;
+        // no items selected
+        if ( count == 0 )
+            {
+            itemText = StringLoader::LoadLC( R_MS_NO_SELECTED_ITEMS );
+            iSettingText->Des().Copy( *itemText );
+            }
+        // just one item selected
+        else if ( count == 1 )
+            {
+            TInt itemCount = iItemArray->Count();
+            for ( TInt index = 0; index < itemCount; index++ )
+                {
+                CSelectableItem* item = (*iItemArray)[ index ];
+                if ( item->SelectionStatus() )
+                    {
+                    iSettingText->Des().Copy( item->ItemText() );
+                    index = itemCount; // break loop
+                    }
+                }
+            }
+        // more than one item selected
+        else
+            {
+            itemText = StringLoader::LoadLC( R_MS_ITEM_DEVICES, count );
+
+            // do number conversion
+            TPtr ptr = itemText->Des();
+            AknTextUtils::DisplayTextLanguageSpecificNumberConversion( ptr );
+
+            iSettingText->Des().Copy( *itemText );
+            }
+
+        if ( itemText )
+            {
+            CleanupStack::PopAndDestroy( itemText );
+            }
+
+         // Set new value
+         SetExternalText( *iSettingText );
+    }
+// End of File
+