diff -r 000000000000 -r 7f85d04be362 homesync/contentmanager/mediaservant/src/msstoreserverssetting.cpp --- /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 +#include + +#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 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 +