diff -r 000000000000 -r 7f85d04be362 homesync/contentmanager/mediaservant/src/msmaincontainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homesync/contentmanager/mediaservant/src/msmaincontainer.cpp Thu Dec 17 08:52:00 2009 +0200 @@ -0,0 +1,1453 @@ +/* +* 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: CMSMainContainer class implementation +* +*/ + + + +#include +#include +#include +#include +#include + +#include "mserv.hlp.hrh" +#include "cmfillrule.h" +#include "msappui.h" +#include "msmainview.h" +#include "mediaservantuid.h" +#include "msmaincontainer.h" +#include "msengine.h" +#include "msconstants.h" +#include "msdebug.h" + +// Constants +const TInt KTimerInterval = 60000000; // 1 min +const TInt KNaviTimerInterval = 2000000; // 2 sec + + +// -------------------------------------------------------------------------- +// CMSMainContainer::CMSMainContainer() +// -------------------------------------------------------------------------- +// +CMSMainContainer::CMSMainContainer( CMSAppUi& aAppUi, + CMSMainView& aView ) + { + LOG(_L("[MediaServant]\t CMSMainContainer::CMSMainContainer")); + + iAppUi = &aAppUi; + iView = &aView; + iAppWizardRun = EFalse; + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::~CMSMainContainer() +// -------------------------------------------------------------------------- +// +CMSMainContainer::~CMSMainContainer() + { + LOG(_L("[MediaServant]\t CMSMainContainer::~CMSMainContainer")); + + if( iPeriodic ) + { + iPeriodic->Cancel(); + } + delete iPeriodic; + + if( iNaviTimer ) + { + iNaviTimer->Cancel(); + } + delete iNaviTimer; + + if( iUpdateList ) + { + iUpdateList->Cancel(); + } + delete iUpdateList; + + if( iMSPropertyWatcher ) + { + iMSPropertyWatcher->Stop(); + } + delete iMSPropertyWatcher; + + if( iMemoryCardMonitor ) + { + iMemoryCardMonitor->Cancel(); + } + delete iMemoryCardMonitor; + + delete iListBox; // Deletes listbox object. + } + + +// -------------------------------------------------------------------------- +// CMSMainContainer::ConstructL() +// -------------------------------------------------------------------------- +// +void CMSMainContainer::ConstructL( TRect aRect ) + { + LOG(_L("[MediaServant]\t CMSMainContainer::ConstructL")); + + // Create property watcher for progress info + iMSPropertyWatcher = CMSPropertyWatcher::NewL(); + // view will observe changes in property + iMSPropertyWatcher->SetObserver(this); + + //create a mmc monitor to capture mmc event + RFs& systemFs = CEikonEnv::Static()->FsSession(); + iMemoryCardMonitor = CMSMemoryCardMonitor::NewL( this, systemFs ); + iMemoryCardMonitor->StartMonitor(); + + CreateWindowL(); + + iListBox = new (ELeave) CAknDoubleLargeStyleListBox; + + SetListBoxFromResourceL(iListBox, R_MAIN_VIEW_LISTBOX); + + // Create icons + CAknIconArray* icons = new (ELeave) CAknIconArray( EIconCount ); + CleanupStack::PushL( icons ); + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + TFileName iconsPath( AknIconUtils::AvkonIconFileName() ); + + AppendIconToArrayL( icons, skin, + KMSMifFileName, + KAknsIIDDefault, + EMbmMediaservantQgn_mserv_sync, + EMbmMediaservantQgn_mserv_sync_mask ); + + AppendIconToArrayL( icons, skin, + KMSMifFileName, + KAknsIIDDefault, + EMbmMediaservantQgn_mserv_sync_stop, + EMbmMediaservantQgn_mserv_sync_stop_mask ); + + AppendIconToArrayL( icons, skin, + KMSMifFileName, + KAknsIIDDefault, + EMbmMediaservantQgn_mserv_to_home, + EMbmMediaservantQgn_mserv_to_home_mask ); + + AppendIconToArrayL( icons, skin, + KMSMifFileName, + KAknsIIDDefault, + EMbmMediaservantQgn_mserv_to_home_inactive, + EMbmMediaservantQgn_mserv_to_home_inactive_mask ); + + AppendIconToArrayL( icons, skin, + KMSMifFileName, + KAknsIIDDefault, + EMbmMediaservantQgn_mserv_from_home, + EMbmMediaservantQgn_mserv_from_home_mask ); + + AppendIconToArrayL( icons, skin, + KMSMifFileName, + KAknsIIDDefault, + EMbmMediaservantQgn_mserv_from_home_inactive, + EMbmMediaservantQgn_mserv_from_home_inactive_mask ); + + iListBox->ItemDrawer()->FormattedCellData()->SetIconArray(icons); + + CleanupStack::Pop(icons); + + // Container is listbox observer + iListBox->SetListBoxObserver( this ); + // Set engine observer + iAppUi->MSEngine()->SetObserver( this ); + + SetRect(aRect); + + // Check if automatic sync/harvest is ongoing + TCmServerState state; + iAppUi->MSEngine()->ServerState( state ); + if ( state == ECmServerStateStoring || + state == ECmServerStateFilling || + state == ECmServerStateSearchingForServers ) + { + iSyncRunning = ESyncRunning; + } + + if ( state == ECmServerStateHarvesting ) + { + iRefreshRunning = ETrue; + } + + // From home secondary item text depends list selections + iFillListSelected = CheckIfFillListSelected(); + + // Add data to listbox + UpdateListBoxDataL(); + + if ( iSyncRunning != ESyncRunning && + iRefreshRunning == EFalse && + state != ECmServerStateDeleting ) + { + // Set last sync time to navi pane + SetNaviTextLastSyncL(); + } + + // Delete may be in progress so we have to inform user + if ( state == ECmServerStateDeleting ) + { + HBufC* naviText = StringLoader::LoadLC( R_MS_PREPROCESSING_TEXT ); + iView->SetNavigationPaneTextL( *naviText ); + CleanupStack::PopAndDestroy( naviText ); + } + + // start listening property + iMSPropertyWatcher->StartL(); + + //Set current item + iListBox->SetCurrentItemIndex( + iAppUi->ParameterAgent()->MainViewFocusIndex() ); + + // Start timer for last sync time reading + iPeriodic = CPeriodic::NewL(CActive::EPriorityIdle); + iPeriodic->Start( 0, KTimerInterval, TCallBack(TimerCallbackL,this) ); + + // create navi text timer - don't start + iNaviTimer = CPeriodic::NewL( CActive::EPriorityIdle ); + + iUpdateList = CIdle::NewL( CActive::EPriorityIdle ); + + ActivateL(); // Activates window. ( Ready to draw ) + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::CountComponentControls() +// Returns number of components. +// -------------------------------------------------------------------------- +// +TInt CMSMainContainer::CountComponentControls() const + { + return 1; // return number of controls inside this container + } + + +// -------------------------------------------------------------------------- +// CMSMainContainer::ComponentControl() +// Returns pointer to particular component. +// -------------------------------------------------------------------------- +// +CCoeControl* CMSMainContainer::ComponentControl( TInt aIndex ) const + + { + CCoeControl* retval = NULL; + switch ( aIndex ) + { + case 0: + { + retval = iListBox; // return a pointer to the listbox + break; + } + default: + { + retval = NULL; + break; + } + } + return retval; + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::OfferKeyEventL() +// Handles the key events. +// -------------------------------------------------------------------------- +// +TKeyResponse CMSMainContainer::OfferKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + LOG(_L("[MediaServant]\t CMSMainContainer::OfferKeyEventL")); + + TKeyResponse response = EKeyWasNotConsumed; + + if ( aType != EEventKey ) + { + response = EKeyWasNotConsumed; + } + + if ( iListBox ) + { + response = iListBox->OfferKeyEventL( aKeyEvent, aType ); + } + + iView->SetCbaL( iListBox->CurrentItemIndex() ); + + return response; + } + + +// -------------------------------------------------------------------------- +// CMSMainContainer::OpenSelectedListboxItemL +// -------------------------------------------------------------------------- +// +void CMSMainContainer::OpenSelectedListboxItemL() + { + LOG(_L("[MediaServant]\t CMSMainContainer::OpenSelectedListboxItemL")); + + HandleListBoxEventL( NULL, EEventEnterKeyPressed ); + } + + +// -------------------------------------------------------------------------- +// CMSMainContainer::HandleListBoxEventL() +// Handles listbox event. +// -------------------------------------------------------------------------- +void CMSMainContainer::HandleListBoxEventL( + CEikListBox* /*aListBox*/, + TListBoxEvent aEventType ) + { + LOG(_L("[MediaServant]\t CMSMainContainer::HandleListBoxEventL")); + + if ( ( aEventType == MEikListBoxObserver::EEventEnterKeyPressed ) || + ( aEventType == MEikListBoxObserver::EEventItemClicked ) ) + { + TInt selected = iListBox->CurrentItemIndex(); + + switch ( selected ) + { + case EStoreAndFill: + { + // refresh is not active + if ( !iRefreshRunning ) + { + if ( iSyncRunning == ESyncNotRunning ) + { + StartSyncL(); + } + else + { + // Cancel current asyncronous operation + iAppUi->MSEngine()->StopOperation(); + iSyncRunning = ESyncNotRunning; + iView->ClearCurrentNaviPaneText(); + UpdateListBoxDataL(); + } + } + // refresh is ongoing + else + { + if ( iSyncRunning == ESyncWaiting ) + { + iSyncRunning = ESyncNotRunning; + } + else + { + iSyncRunning = ESyncWaiting; + } + UpdateListBoxDataL(); + } + + break; + } + case EStoreToNetwork: + { + if ( !iRefreshRunning && + !iSyncRunning && + !iPreprocessRunning ) + { + iAppUi->ChangeViewL( KMSMainViewId, + KMSStoreListViewId ); + } + else + { + TInt noteId = ( iRefreshRunning || iPreprocessRunning ? + R_MS_ACCESS_ERROR_NOTE : + R_MS_ACCESS_ERROR_NOTE_SYNC ); + ShowErrorNoteL( noteId ); + } + break; + } + case EFillToPhone: + { + if ( iAppUi->DriveSelectedL() ) + { + if ( !iRefreshRunning && + !iSyncRunning && + !iPreprocessRunning ) + { + iAppUi->ChangeViewL( KMSMainViewId, KMSFillViewId ); + } + else + { + TInt noteId = ( iRefreshRunning || + iPreprocessRunning ? + R_MS_ACCESS_ERROR_NOTE : + R_MS_ACCESS_ERROR_NOTE_SYNC ); + ShowErrorNoteL( noteId ); + } + } + else + { + ShowErrorNoteL( R_MS_INSERT_MEMORY_CARD_TEXT ); + } + break; + } + default: + { + LOG(_L("[MediaServant]\t CMSMainContainer::\ + HandleListBoxEventL no item selected")); + } + } + } + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::UpdateListBoxDataL() +// Updates listbox texts +// -------------------------------------------------------------------------- +// +void CMSMainContainer::UpdateListBoxDataL() + { + LOG(_L("[MediaServant]\t CMSMainContainer::UpdateListBoxDataL")); + + TCmServerState state; + iAppUi->MSEngine()->ServerState( state ); + + CDesCArray* itemArray = static_cast + (iListBox->Model()->ItemTextArray()); + + if ( itemArray->Count() ) + { + // delete all listbox items + itemArray->Reset(); + } + + + // Get file counts and sync time + TInt itemsToBeStored( 0 ); + TInt itemsToBeFilled( 0 ); + TInt syncTime( 0 ); + TInt syncTimeStore( 0 ); + TInt syncTimeFill( 0 ); + + iAppUi->MSEngine()->GetTransferInfo( ECmServiceStore, + itemsToBeStored, + syncTimeStore ); + + iAppUi->MSEngine()->GetTransferInfo( ECmServiceFill, + itemsToBeFilled, + syncTimeFill ); + + syncTime = syncTimeStore + syncTimeFill; + + // Create item strings + HBufC* primaryText = NULL; + HBufC* secondaryText = NULL; + TInt icon = EIconSync; + + switch ( iSyncRunning ) + { + default: + // fall trough + case ESyncNotRunning: + { + primaryText = StringLoader::LoadLC( R_MAIN_SYNC_NOW_TEXT ); + + if ( itemsToBeStored > 0 || itemsToBeFilled > 0) + { + if ( syncTime/60 > 1 ) // 1 minute + { + secondaryText = StringLoader::LoadLC( + R_MS_SYNC_TIME_TEXT, + syncTime/60 ); + // do number conversion + TPtr ptr = secondaryText->Des(); + AknTextUtils:: + DisplayTextLanguageSpecificNumberConversion( ptr ); + } + else + { + secondaryText = StringLoader::LoadLC( + R_MS_SYNC_TIME_ONE_MIN_TEXT ); + } + + } + break; + } + case ESyncRunning: + { + primaryText = StringLoader::LoadLC( R_MAIN_STOP_SYNC_TEXT ); + icon = EIconSyncStop; + break; + } + case ESyncWaiting: + { + primaryText = StringLoader::LoadLC( R_MAIN_STOP_SYNC_TEXT ); + secondaryText = StringLoader::LoadLC( R_MS_SYNC_WAITING_TEXT ); + icon = EIconSyncStop; + break; + } + } + + AppendItemToListBoxArrayL( iListBox, + iListBox->Model(), + icon, + *primaryText, + *secondaryText ); + + if ( secondaryText ) + { + CleanupStack::PopAndDestroy( secondaryText ); + secondaryText = NULL; + } + + if ( primaryText ) + { + CleanupStack::PopAndDestroy( primaryText ); + primaryText = NULL; + } + + + // From Home -item + primaryText = StringLoader::LoadLC( R_MAIN_FROM_HOME_TEXT ); + + TBool driveSelected = iAppUi->DriveSelectedL(); + + if ( driveSelected == EFalse ) + { + secondaryText = StringLoader::LoadLC( R_MS_MEMORY_CARD_NEEDED_TEXT ); + } + else if ( !iFillListSelected ) + { + secondaryText = StringLoader::LoadLC( R_MS_LIST_NOTHING_SELECTED ); + } + else if ( itemsToBeFilled <= 0 ) + { + secondaryText = StringLoader::LoadLC( R_MS_ALL_IN_SYNC_TEXT ); + } + + if ( iRefreshRunning || + iPreprocessRunning || + iSyncRunning == ESyncRunning || + driveSelected == EFalse ) + { + AppendItemToListBoxArrayL( iListBox, + iListBox->Model(), + EIconFromHomeInactive, + *primaryText, + *secondaryText ); + } + else + { + AppendItemToListBoxArrayL( iListBox, + iListBox->Model(), + EIconFromHome, + *primaryText, + *secondaryText ); + } + + if ( secondaryText ) + { + CleanupStack::PopAndDestroy( secondaryText ); + secondaryText = NULL; + } + + CleanupStack::PopAndDestroy( primaryText ); + primaryText = NULL; + + // To Home -item + primaryText = StringLoader::LoadLC( R_MAIN_TO_HOME_TEXT ); + + if ( itemsToBeStored < 1 ) + { + secondaryText = StringLoader::LoadLC( R_MS_ALL_IN_SYNC_TEXT ); + } + else if ( itemsToBeStored == 1 ) + { + secondaryText = StringLoader::LoadLC( R_MS_SYNC_ONE_NEW_ITEM_TEXT ); + } + else // > 1 + { + secondaryText = StringLoader::LoadLC( R_MS_SYNC_NEW_ITEMS_TEXT, + itemsToBeStored ); + // do number conversion + TPtr ptr = secondaryText->Des(); + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( ptr ); + } + + if ( iRefreshRunning || + iPreprocessRunning || + iSyncRunning == ESyncRunning ) + { + AppendItemToListBoxArrayL( iListBox, + iListBox->Model(), + EIconToHomeInactive, + *primaryText, + *secondaryText ); + } + else + { + AppendItemToListBoxArrayL( iListBox, + iListBox->Model(), + EIconToHome, + *primaryText, + *secondaryText ); + } + + if ( secondaryText ) + { + CleanupStack::PopAndDestroy( secondaryText ); + secondaryText = NULL; + } + + CleanupStack::PopAndDestroy( primaryText ); + primaryText = NULL; + + + iListBox->DrawNow(); + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::ReadyL() +// engine observer callback +// -------------------------------------------------------------------------- +// +void CMSMainContainer::ReadyL( TCmService aService, TInt aError ) + { + LOG(_L("[MediaServant]\t CMSMainContainer::ReadyL")); + + // Clears navi pane + iView->ClearCurrentNaviPaneText(); + + if( aError == KErrNotFound ) + { + ShowErrorNoteL( R_MS_ERROR_DEVICES_NOT_FOUND ); + } + else if( aError == KErrGeneral ) + { + ShowErrorNoteL( R_MS_ERROR_SYNC_INTERRUPTED ); + } + else if( aError == KErrDiskFull ) + { + ShowErrorNoteL( R_MS_ERROR_MEMORY_FULL ); + } + else if ( aError && aError != KErrCancel ) + { +#ifdef __DEBUG + ShowNoteL( R_ACTIVE_ERROR_NOTE_TEXT, aError ); +#endif + iRefreshRunning = EFalse; + iSyncRunning = ESyncNotRunning; + } + + switch ( aService ) + { + case ECmServiceDeleteMetadata: + { + iAppUi->MSEngine()->DeleteDeletedMediaserversL(); + // start harvest + iAppUi->MSEngine()->ScanMediaServersL(); + break; + } + case ECmServiceHarvest: + { + if( iAppWizardRun ) + { + LOG(_L("[MediaServant]\t CMSMainContainer::\ + ReadyL, HARVEST (Wizard)")); + + // refreshes also fill rules + iAppUi->RefreshListsL(); + + // "From home" secondary item text depends list selections + // must be read here again because list selections change + // after wizard run + iFillListSelected = CheckIfFillListSelected(); + + if ( iRefreshRunning && iSyncRunning == ESyncWaiting ) + { + StartSyncL(); + iRefreshRunning = EFalse; + } + + iRefreshRunning = EFalse; + iAppWizardRun = EFalse; + LOG(_L("[MediaServant]\t CMSMainContainer::ReadyL, \ + START PRE PRO")); + + // show navi pane text for 2 seconds + ShowRefreshCompleteTextL(); + iNaviTimer->Start( KNaviTimerInterval, + KNaviTimerInterval, + TCallBack( NaviTimerCallbackL, this ) ); + break; + } + else + { + if ( iRefreshRunning && iSyncRunning == ESyncWaiting ) + { + StartSyncL(); + iRefreshRunning = EFalse; + } + else + { + iRefreshRunning = EFalse; + // refreshes also fill rules and store item + iAppUi->RefreshListsL(); + + // show navi pane text for 2 seconds + ShowRefreshCompleteTextL(); + iNaviTimer->Start( KNaviTimerInterval, + KNaviTimerInterval, + TCallBack( NaviTimerCallbackL, this ) ); + } + } + break; + } + + case ECmServiceFill: + // fall trough + case ECmServiceStore: + { + iSyncRunning = ESyncNotRunning; + SetNaviTextLastSyncL(); + iAppUi->RefreshListsL(); + break; + } + + case ECmServicePreProcessingStore: + { + LOG(_L("[MediaServant]\t CMSMainContainer::ReadyL, \ + PRE PRO STORE")); + + if ( iSyncRunning == ESyncWaiting ) + { + StartSyncL(); + } + + iPreprocessRunning = EFalse; + iAppUi->RefreshListsL(); + break; + } + case ECmServicePreProcessingFill: + { + LOG(_L("[MediaServant]\t CMSMainContainer::ReadyL, \ + PRE PRO FILL")); + + // Set last sync time to navi pane + SetNaviTextLastSyncL(); + + iPreprocessRunning = EFalse; + break; + } + + case ECmServiceDeleteFilledFiles: + { + // Set last sync time to navi pane + SetNaviTextLastSyncL(); + break; + } + + default: + { + LOG(_L("[MediaServant]\t CMSMainContainer::ReadyL \ + service not found")); + break; + } + } + + UpdateListBoxDataL(); + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::PropertyChangedL +// -------------------------------------------------------------------------- +// +void CMSMainContainer::PropertyChangedL( TCmService aService, + TInt aTotalItems, + TInt aProcessedItems, + TInt /*aItemsToBeProcessed*/ ) + { + LOG(_L("[MediaServant]\t CMSMainContainer::PropertyChangedL")); + + switch ( aService ) + { + case ECmServiceHarvest: + { + // Launching propertywatcher causes unwanted call of observer + // (server previous state is returned + // We want to show progress only when refresh is truly running + if ( iRefreshRunning ) + { + TInt value( 0 ); + if ( aTotalItems > 0 ) + { + value = (TReal(aProcessedItems)/TReal(aTotalItems))*100; + } + + HBufC* progress = StringLoader::LoadLC( + R_MS_NAVI_REFRESHING_TEXT, value ); + + // do number conversion + TPtr ptr = progress->Des(); + AknTextUtils:: + DisplayTextLanguageSpecificNumberConversion( ptr ); + + // update navi pane + iView->SetNavigationPaneTextL( *progress ); + CleanupStack::PopAndDestroy( progress ); + } + break; + } + case ECmServiceStore: + // fall through + case ECmServiceFill: + { + if ( aTotalItems > 0 && aProcessedItems > 0 ) + { + // calculate procentual value + TInt value = (TReal(aProcessedItems)/TReal(aTotalItems))*100; + HBufC* progress = StringLoader::LoadLC( + R_MS_NAVI_SYNC_TEXT, value ); + + // do number conversion + TPtr ptr = progress->Des(); + AknTextUtils:: + DisplayTextLanguageSpecificNumberConversion( ptr ); + + // update navi pane + iView->SetNavigationPaneTextL( *progress ); + CleanupStack::PopAndDestroy( progress ); + } + break; + } + case ECmServiceNone: + { + iSyncRunning = ESyncNotRunning; + iRefreshRunning = EFalse; + if ( iNaviTimer && !iNaviTimer->IsActive() ) + { + SetNaviTextLastSyncL(); + } + + break; + } + default: + { + LOG(_L("[MediaServant]\t CMSMainContainer::PropertyChangedL \ + service not found")); + } + } + + if ( iUpdateList && !iUpdateList->IsActive() ) + { + iCurStep = EFirstStep; + iRequestCt = 1; + iUpdateList->Start( TCallBack( BackgroundUpdateListL, this ) ); + } + else + { + iRequestCt++; + LOG(_L("[MediaServant]\t S.L add to queue")); + } + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::SetManualWizardInfo +// -------------------------------------------------------------------------- +// +void CMSMainContainer::SetManualWizardInfo( TBool aAppWizardRun ) + { + iAppWizardRun = aAppWizardRun; + } + + +// -------------------------------------------------------------------------- +// CMSMainContainer::ShowRefreshIndicationL +// -------------------------------------------------------------------------- +// +void CMSMainContainer::ShowRefreshIndicationL() + { + LOG(_L("[MediaServant]\t CMSMainContainer::ShowRefreshIndicationL")); + + iRefreshRunning = ETrue; + // Start 0 % + HBufC* naviText = StringLoader::LoadLC( + R_MS_NAVI_REFRESHING_TEXT, 0 ); + + // do number conversion + TPtr ptr = naviText->Des(); + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( ptr ); + + iView->SetNavigationPaneTextL( *naviText ); + CleanupStack::PopAndDestroy( naviText ); + + UpdateListBoxDataL(); + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::StopRefreshL +// -------------------------------------------------------------------------- +// +void CMSMainContainer::StopRefreshL() + { + LOG(_L("[MediaServant]\t CMSMainContainer::StopRefreshL")); + + iRefreshRunning = EFalse; + iSyncRunning = ESyncNotRunning; + iAppUi->FillRuleController()->UpdateArrayL(); + UpdateListBoxDataL(); + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::StartSyncL +// -------------------------------------------------------------------------- +// +void CMSMainContainer::StartSyncL() + { + LOG(_L("[MediaServant]\t CMSMainContainer::StartSync")); + + iSyncRunning = ESyncRunning; + TInt error = iAppUi->MSEngine()->ExecuteSyncL(); + + if ( !error ) + { + UpdateListBoxDataL(); + + // set progress to 0% + HBufC* progress = StringLoader::LoadLC( + R_MS_NAVI_SYNC_TEXT, 0 ); + + // do number conversion + TPtr ptr = progress->Des(); + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( ptr ); + + iView->SetNavigationPaneTextL( *progress ); + CleanupStack::PopAndDestroy( progress ); + } + else + { + iSyncRunning = ESyncNotRunning; + } + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::StartMetadataDeleteL +// -------------------------------------------------------------------------- +// +void CMSMainContainer::StartMetadataDeleteL() + { + LOG(_L("[MediaServant]\t CMSMainContainer::StartMetadataDeleteL")); + + iAppUi->MSEngine()->DeleteMetadataL(); + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::SelectedItemIndex +// returns current item index +// -------------------------------------------------------------------------- +// +TInt CMSMainContainer::SelectedItemIndex() + { + return iListBox->CurrentItemIndex(); + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::ShowErrorNoteL +// Shows error note +// -------------------------------------------------------------------------- +// +void CMSMainContainer::ShowErrorNoteL( TInt aTextResource ) + { + LOG(_L("[MediaServant]\t CMSMainContainer::ShowErrorNoteL")); + + HBufC* errorText = StringLoader::LoadLC( aTextResource ); + CAknErrorNote* dlg = new ( ELeave ) CAknErrorNote(); + dlg->ExecuteLD( *errorText ); + CleanupStack::PopAndDestroy( errorText ); + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::SetNaviTextLastSyncL +// Sets last synchronization time to navi pane +// -------------------------------------------------------------------------- +// +void CMSMainContainer::SetNaviTextLastSyncL() + { + LOG(_L("[MediaServant]\t CMSMainContainer::SetNaviTextLastSyncL")); + + TTimeIntervalMinutes syncMinutes; + TTimeIntervalHours syncHours; + TTimeIntervalDays syncDays; + + TTime lastSync = iAppUi->MSEngine()->LastSyncTime(); + + if ( lastSync.Int64() > 0 ) + { + // Get current time + TTime time; + time.HomeTime(); + + time.MinutesFrom( lastSync, syncMinutes ); + time.HoursFrom( lastSync, syncHours ); + syncDays = time.DaysFrom( lastSync ); + + + HBufC* naviText = NULL; + + TInt days = syncDays.Int(); + TInt hours = syncHours.Int(); + TInt mins = syncMinutes.Int(); + if ( days > 0 ) + { + naviText = ( days == 1 ? StringLoader::LoadLC( + R_MS_LAST_SYNC_DAY ) : + StringLoader::LoadLC( + R_MS_LAST_SYNC_DAYS, days )); + } + else if ( hours > 0 ) + { + naviText = ( hours == 1 ? StringLoader::LoadLC( + R_MS_LAST_SYNC_HOUR ) : + StringLoader::LoadLC( + R_MS_LAST_SYNC_HOURS, hours )); + } + else if ( mins > 0 ) + { + naviText = ( mins == 1 ? StringLoader::LoadLC( + R_MS_LAST_SYNC_MIN ) : + StringLoader::LoadLC( + R_MS_LAST_SYNC_MINS, mins )); + } + else + { + // do nothing - leave navi pane empty + } + + if ( naviText ) + { + // do number conversion + TPtr ptr = naviText->Des(); + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( ptr ); + + iView->SetNavigationPaneTextL( *naviText ); + CleanupStack::PopAndDestroy( naviText ); + } + } + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::SizeChanged() +// Called by framework when the view size is changed. +// -------------------------------------------------------------------------- +// +void CMSMainContainer::SizeChanged() + { + // container control resize code. + if ( iListBox ) + { + iListBox->SetRect( Rect() ); // Set rectangle of listbox. + } + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::HandleResourceChange +// Handles layout change +// -------------------------------------------------------------------------- +// +void CMSMainContainer::HandleResourceChange( TInt aType ) + { + if ( aType == KEikDynamicLayoutVariantSwitch ) + { + SetRect( iView->ClientRect() ); + } + + CCoeControl::HandleResourceChange( aType ); + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::TimerCallbackL() +// Periodic timer callback +// -------------------------------------------------------------------------- +// +TInt CMSMainContainer::TimerCallbackL(TAny* aObject) + { + CMSMainContainer* mainContainer = + static_cast(aObject); + TCmServerState state; + mainContainer->iAppUi->MSEngine()->ServerState( state ); + if ( state == ECmServerStateIdle ) + { + mainContainer->SetNaviTextLastSyncL(); + } + return 0; + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::NaviTimerCallbackL() +// -------------------------------------------------------------------------- +// +TInt CMSMainContainer::NaviTimerCallbackL(TAny* aObject) + { + CMSMainContainer* mainContainer = + static_cast(aObject); + TCmServerState state; + mainContainer->iAppUi->MSEngine()->ServerState( state ); + + // Clear old text + mainContainer->iView->ClearCurrentNaviPaneText(); + + if ( state == ECmServerStateIdle ) + { + mainContainer->SetNaviTextLastSyncL(); + } + + mainContainer->iNaviTimer->Cancel(); + + return 0; + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::BackgroundUpdateListL +// Static callback method for update list box data +// -------------------------------------------------------------------------- +// +TInt CMSMainContainer::BackgroundUpdateListL( TAny* aObject ) + { + LOG(_L("[MediaServant]\t CMSMainContainer::BackgroundUpdateListL")); + TInt reslt = ( ( CMSMainContainer* )aObject )->UpdateListByStepL(); + return reslt; + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::UpdateListByStepL +// Update list box data steps +// -------------------------------------------------------------------------- +// +TInt CMSMainContainer::UpdateListByStepL() + { + TRACE(Print(_L("[MediaServant]\t CMSMainContainer:UpdateListByStepL \ + step: %d %d"), iCurStep, iUpdateList->IsActive())); + + // Get file counts and sync time + static TInt staItemsToBeStored( 0 ); + static TInt staItemsToBeFilled( 0 ); + static TInt staSyncTime( 0 ); + static TInt staSyncTimeStore( 0 ); + static TInt staSyncTimeFill( 0 ); + static TBool staDriveSelected( ETrue ); + + switch ( iCurStep ) + { + case EFirstStep: + { + iAppUi->MSEngine()->GetTransferInfo( ECmServiceStore, + staItemsToBeStored, + staSyncTimeStore ); + break; + } + case ESecondStep: + { + iAppUi->MSEngine()->GetTransferInfo( ECmServiceFill, + staItemsToBeFilled, + staSyncTimeFill ); + break; + } + case EThirdStep: + { + staDriveSelected = iAppUi->DriveSelectedL(); + break; + } + case EForthStep: + //fall through + default: + { + TInt icon = EIconSync; + // Create item strings + HBufC* primaryText = NULL; + HBufC* secondaryText = NULL; + + CDesCArray* itemArray = static_cast + (iListBox->Model()->ItemTextArray()); + if ( itemArray->Count() ) + { + // delete all listbox items + itemArray->Reset(); + } + staSyncTime = staSyncTimeStore + staSyncTimeFill; + //home-sync item + switch ( iSyncRunning ) + { + default: + // fall trough + case ESyncNotRunning: + { + primaryText = StringLoader::LoadLC( + R_MAIN_SYNC_NOW_TEXT ); + if ( staItemsToBeStored > 0 || staItemsToBeFilled > 0 ) + { + if ( staSyncTime/60 > 1 ) // 1 minute + { + secondaryText = StringLoader::LoadLC( + R_MS_SYNC_TIME_TEXT, + staSyncTime/60 ); + // do number conversion + TPtr ptr = secondaryText->Des(); + AknTextUtils:: + DisplayTextLanguageSpecificNumberConversion( ptr ); + } + else + { + secondaryText = StringLoader::LoadLC( + R_MS_SYNC_TIME_ONE_MIN_TEXT ); + } + } + break; + } + case ESyncRunning: + { + primaryText = StringLoader::LoadLC( + R_MAIN_STOP_SYNC_TEXT ); + icon = EIconSyncStop; + break; + } + case ESyncWaiting: + { + primaryText = StringLoader::LoadLC( + R_MAIN_STOP_SYNC_TEXT ); + secondaryText = StringLoader::LoadLC( + R_MS_SYNC_WAITING_TEXT ); + icon = EIconSyncStop; + break; + } + } + AppendItemToListBoxArrayL( iListBox, + iListBox->Model(), + icon, + *primaryText, + *secondaryText ); + + if ( secondaryText ) + { + CleanupStack::PopAndDestroy( secondaryText ); + secondaryText = NULL; + } + + if ( primaryText ) + { + CleanupStack::PopAndDestroy( primaryText ); + primaryText = NULL; + } + + // From Home -item + primaryText = StringLoader::LoadLC( R_MAIN_FROM_HOME_TEXT ); + + if ( staDriveSelected == EFalse ) + { + secondaryText = StringLoader::LoadLC( + R_MS_MEMORY_CARD_NEEDED_TEXT ); + } + else if ( !iFillListSelected ) + { + secondaryText = StringLoader::LoadLC( + R_MS_LIST_NOTHING_SELECTED ); + } + else if ( staItemsToBeFilled <= 0 ) + { + secondaryText = StringLoader::LoadLC( + R_MS_ALL_IN_SYNC_TEXT ); + } + + if ( iRefreshRunning || + iPreprocessRunning || + iSyncRunning == ESyncRunning || + staDriveSelected == EFalse ) + { + AppendItemToListBoxArrayL( iListBox, + iListBox->Model(), + EIconFromHomeInactive, + *primaryText, + *secondaryText ); + } + else + { + AppendItemToListBoxArrayL( iListBox, + iListBox->Model(), + EIconFromHome, + *primaryText, + *secondaryText ); + } + + if ( secondaryText ) + { + CleanupStack::PopAndDestroy( secondaryText ); + secondaryText = NULL; + } + + CleanupStack::PopAndDestroy( primaryText ); + primaryText = NULL; + + // To Home -item + primaryText = StringLoader::LoadLC( R_MAIN_TO_HOME_TEXT ); + + + if ( staItemsToBeStored < 1 ) + { + secondaryText = StringLoader::LoadLC( + R_MS_ALL_IN_SYNC_TEXT ); + } + else if ( staItemsToBeStored == 1 ) + { + secondaryText = StringLoader::LoadLC( + R_MS_SYNC_ONE_NEW_ITEM_TEXT ); + } + else // > 1 + { + secondaryText = StringLoader::LoadLC( + R_MS_SYNC_NEW_ITEMS_TEXT, + staItemsToBeStored ); + // do number conversion + TPtr ptr = secondaryText->Des(); + AknTextUtils:: + DisplayTextLanguageSpecificNumberConversion( ptr ); + } + + if ( iRefreshRunning || + iPreprocessRunning || + iSyncRunning == ESyncRunning ) + { + AppendItemToListBoxArrayL( iListBox, + iListBox->Model(), + EIconToHomeInactive, + *primaryText, + *secondaryText ); + } + else + { + AppendItemToListBoxArrayL( iListBox, + iListBox->Model(), + EIconToHome, + *primaryText, + *secondaryText ); + } + + if ( secondaryText ) + { + CleanupStack::PopAndDestroy( secondaryText ); + secondaryText = NULL; + } + CleanupStack::PopAndDestroy( primaryText ); + primaryText = NULL; + iListBox->DrawNow(); + break; + } + } + TInt theValue = ( TInt )iCurStep; + theValue++; + iCurStep = ( TMSUpdateStep )theValue; + + //complete one refresh request + TInt reslt( 0 ); + if( iCurStep == EEndStep ) + { + iRequestCt--; + if( iRequestCt ) + { + iCurStep = EFirstStep; + } + //if still have request,continue + reslt = iRequestCt; + } + //not the last step, contiue + else + { + reslt = ETrue; + } + return reslt; + } + +// --------------------------------------------------------------------------- +// CMSMainContainer::GetHelpContext +// --------------------------------------------------------------------------- +// +void CMSMainContainer::GetHelpContext( TCoeHelpContext& aContext ) const + { + LOG(_L("[MediaServant]\t CMSMainContainer::GetHelpContext")); + + aContext.iMajor = TUid::Uid(KMediaServantUID3); + aContext.iContext = KMSERV_HLP_MAIN_VIEW; + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::MemoryCardChangedL +// Callback to handle mmc insert +// -------------------------------------------------------------------------- +// +void CMSMainContainer::MemoryCardChangedL( TMemoryCardEvent aEvent ) + { + LOG(_L("[MediaServant]\t CMSMainContainer::MemoryCardChangedL start")); + switch ( aEvent ) + { + case EMemoryCardInsert: + { + if( !iAppUi->DriveSelectedL() ) + { + iView->CheckMemoryCardL(); + } + UpdateListBoxDataL(); + break; + } + default: + { + LOG(_L("[MediaServant]\t CMSMainContainer::MemoryCardChangedL \ + event not found")); + break; + } + } + LOG(_L("[MediaServant]\t CMSMainContainer::MemoryCardChangedL end")); + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::CheckIfFillListSelected +// -------------------------------------------------------------------------- +// +TBool CMSMainContainer::CheckIfFillListSelected() + { + LOG(_L("[MediaServant]\t CMSMainContainer::CheckIfFillListSelected")); + + TBool listSelected( EFalse ); + RPointerArray* listArray = + iAppUi->FillRuleController()->FillListArray(); + + for ( TInt i = 0; i < listArray->Count(); i++ ) + { + CCmFillRule* list = (*listArray)[i]->List(); + if ( list->Selected() == ECmSelected ) + { + listSelected = ETrue; + i = listArray->Count(); // break loop + } + } + return listSelected; + } + +// -------------------------------------------------------------------------- +// CMSMainContainer::ShowRefreshCompleteTextL +// -------------------------------------------------------------------------- +// +void CMSMainContainer::ShowRefreshCompleteTextL() + { + LOG(_L("[MediaServant]\t CMSMainContainer::ShowRefreshCompleteTextL")); + + HBufC* naviText = StringLoader::LoadLC( R_MS_NAVI_CONTENT_REFRESHED ); + iView->SetNavigationPaneTextL( *naviText ); + CleanupStack::PopAndDestroy( naviText ); + } +// End of File +