diff -r 000000000000 -r 7f85d04be362 homesync/contentmanager/homesyncgsplugin/src/mssettingitemdevices.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homesync/contentmanager/homesyncgsplugin/src/mssettingitemdevices.cpp Thu Dec 17 08:52:00 2009 +0200 @@ -0,0 +1,776 @@ +/* +* Copyright (c) 2009 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: CMSSettingItemDevices class implementation +* +*/ + + +#include +#include +#include "upnpavdevice.h" +#include "upnpavcontroller.h" // for MUPnPAVController +#include "upnpavcontrollerfactory.h" // for UPnPAVControllerFactory +#include +#include // for CnvUtfConverter + +#include "cmmediaserverfull.h" +#include "cmcommonutils.h" +#include +#include "mssettingitemdevices.h" +#include "msmultiselectionpopup.h" +#include "msengine.h" +#include "upnpavdevicelist.h" +#include "msdebug.h" + +// CONSTANTS + +// reserved list size +const TInt KItemArrayGranularity = 3; + +// ================= MEMBER FUNCTIONS ======================= + +// -------------------------------------------------------------------------- +// CMSSettingItemDevices::NewL +// -------------------------------------------------------------------------- +// +CMSSettingItemDevices* CMSSettingItemDevices::NewL( + TInt aIdentifier, + TDes& aText, + CMSEngine& aMSEngine, + RPointerArray& aStoredServers, + TBool aUploadCapabilitySupport ) + { + LOG(_L("[MSGSPlugin]\t CMSSettingItemDevices::NewL")); + + CMSSettingItemDevices* self = CMSSettingItemDevices::NewLC( + aIdentifier, + aText, + aMSEngine, + aStoredServers, + aUploadCapabilitySupport ); + + CleanupStack::Pop( self ); + return self; + } + +// -------------------------------------------------------------------------- +// CMSSettingItemDevices::NewLC +// -------------------------------------------------------------------------- +// +CMSSettingItemDevices* CMSSettingItemDevices::NewLC( + TInt aIdentifier, + TDes& aText, + CMSEngine& aMSEngine, + RPointerArray& aStoredServers, + TBool aUploadCapabilitySupport ) + { + LOG(_L("[MSGSPlugin]\t CMSSettingItemDevices::NewLC")); + + CMSSettingItemDevices* self = new ( ELeave ) CMSSettingItemDevices( + aIdentifier, + aText, + aMSEngine, + aStoredServers, + aUploadCapabilitySupport ); + + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// -------------------------------------------------------------------------- +// CMSSettingItemDevices::ConstructL +// -------------------------------------------------------------------------- +// +void CMSSettingItemDevices::ConstructL() + { + LOG(_L("[MSGSPlugin]\t CMSSettingItemDevices::ConstructL begins")); + + iSettingText = HBufC::NewL( KMaxFileName ); + + iSelectedServers = + new (ELeave) CArrayFixFlat( KItemArrayGranularity ); + + SetSettingItemTextL(); + + LOG(_L("[MSGSPlugin]\t CMSSettingItemDevices::ConstructL ends")); + } + +// -------------------------------------------------------------------------- +// CMSSettingItemDevices::~~CMSSettingItemDevices() +// -------------------------------------------------------------------------- +// +CMSSettingItemDevices::~CMSSettingItemDevices() + { + LOG(_L("[MSGSPlugin]\t CMSSettingItemDevices::~CMSSettingItemDevices")); + + delete iSettingText; + + delete iSelectedServers; + + iServerList.Reset(); + iServerList.Close(); + + if ( iAvController ) + { + iAvController->RemoveDeviceObserver(); + iAvController->Release(); + iAvController = NULL; + } + + if ( iWaitDialog ) + { + TRAP_IGNORE( iWaitDialog->ProcessFinishedL() ); + iWaitDialog = NULL; + } + + if ( iWait.IsStarted() ) + { + iWait.AsyncStop(); + } + + } + +// -------------------------------------------------------------------------- +// CMSSettingItemDevices::EditItemL( TBool aCalledFromMenu ) +// -------------------------------------------------------------------------- +// +void CMSSettingItemDevices::EditItemL( TBool /*aCalledFromMenu*/ ) + { + LOG( _L("[MSGSPlugin]\t CMSSettingItemDevices::EditItemL") ); + + // restore original state + SetAcceptState( EFalse ); + + // Create list for selection + ReadServerListL(); + + // Create Avcontroller and fetch already discovered devices from it. + CreateAvcAndFetchDevicesL(); + + if( !iUserCancelledSearch ) + { + if ( iUploadCapabilitySupport ) + { + iDevSelectionDlg = CMSMultiselectionPopup::NewL( + iUploadCapabilitySupport, + &iServerList, + iSelectedServers ); + iDevSelectionDlg->PrepareLC( + R_MS_TARGET_DEVICE_SELECTION_DIALOG ); + } + else + { + iDevSelectionDlg = CMSMultiselectionPopup::NewL( + iUploadCapabilitySupport, + &iServerList, + iSelectedServers ); + iDevSelectionDlg->PrepareLC( + R_MS_SOURCE_DEVICE_SELECTION_DIALOG ); + } + + #ifndef __WINS__ + iDevSelectionDlg->QueryHeading()->SetHeaderAnimationL( + R_MSGS_ANIMATION_FOR_SELECTION_DIALOG ); + #endif + + TInt returnValue = iDevSelectionDlg->RunLD(); + + iDevSelectionDlg = NULL; + + CancelDeviceSearch(); + + if( returnValue ) + { + // User presses OK + SetAcceptState( ETrue ); + + SetServersActivity(); + SetSettingItemTextL(); + + iMSEngine.SetMediaServersL( iStoredServers ); + + LoadL(); + UpdateListBoxTextL(); + } + } + } + +// --------------------------------------------------------------------------- +// CMSSettingItemDevices::SetServersActivity +// --------------------------------------------------------------------------- +// +void CMSSettingItemDevices::SetServersActivity() + { + LOG(_L("[MSGSPlugin]\t CMSSettingItemDevices::SetServersActivity \ + begins")); + + // Set all servers inactive + for( TInt ind=0; ind < iStoredServers.Count(); ind++ ) + { + CCmMediaServerFull* server = iStoredServers[ind]; + + if ( iUploadCapabilitySupport ) + { + server->SetStoreUsage( EFalse ); + } + else + { + server->SetFillUsage( EFalse ); + } + + if ( !server->StoreUsage() && !server->FillUsage() ) + { + server->SetIsActive( EFalse ); + } + } + + // Set selected servers active + if( iSelectedServers ) + { + // loop trough selected servers + for ( TInt iy = 0; iy < iSelectedServers->Count(); iy++ ) + { + + // Look for the server in selection array + TInt selectedIndex = iSelectedServers->At( iy ); + // server points to iStoredServers table + CCmMediaServerFull* server = iServerList[selectedIndex]; + + if ( iUploadCapabilitySupport ) + { + server->SetStoreUsage( ETrue ); + } + else // fill server + { + server->SetFillUsage( ETrue ); + } + server->SetIsActive( ETrue ); + } + } + + LOG(_L("[MSGSPlugin]\t CMSSettingItemDevices::SetServersActivity \ + ends")); + } + +// -------------------------------------------------------------------------- +// CMSSettingItemDevices::CMSSettingItemDevices +// -------------------------------------------------------------------------- +// +CMSSettingItemDevices::CMSSettingItemDevices( TInt aIdentifier, TDes& aText, + CMSEngine& aMSEngine, + RPointerArray& aStoredServers, + TBool aUploadCapabilitySupport ): + CMSTextSettingItem( aIdentifier, aText ), + iMSEngine( aMSEngine ), + iStoredServers( aStoredServers ), + iUploadCapabilitySupport( aUploadCapabilitySupport ) + { + LOG( _L("[MSGSPlugin]\t CMSSettingItemDevices::CMSSettingItemDevices") ); + } + +// -------------------------------------------------------------------------- +// CMSSettingItemDevices::ReadServerListL +// +// -------------------------------------------------------------------------- +// +void CMSSettingItemDevices::ReadServerListL() + { + LOG(_L("[MSGSPlugin]\t CMSSettingItemDevices::ReadServerListL")); + + // delete old ones + iServerList.Reset(); + + for ( TInt i = 0; i < iStoredServers.Count(); i++ ) + { + // Add selected/marked servers to list + if (iUploadCapabilitySupport && iStoredServers[i]->CopyCapability() + && iStoredServers[i]->StoreUsage() ) + { + // Add selected target servers + iServerList.AppendL(iStoredServers[i]); + } + else if (!iUploadCapabilitySupport && iStoredServers[i]->FillUsage() ) + { + // Add selected source servers + iServerList.AppendL(iStoredServers[i]); + } + else + { + LOG(_L("[MSGSPlugin]\t CMSSettingItemDevices::ReadServerListL \ + Not selected servers should not show to user")); + } + } + } + +// -------------------------------------------------------------------------- +// CMSSettingItemDevices::SetSettingItemTextL +// Sets setting item secondary text according to selected items +// -------------------------------------------------------------------------- +// +void CMSSettingItemDevices::SetSettingItemTextL() + { + LOG( _L("[MSGSPlugin]\t CMSSettingItemDevices::SetSettingItemTextL") ); + + // count how many active devices threre are + TInt count = CountSelectedItems(); + HBufC* itemText = NULL; + + if ( count == 1 ) + { + // one active found - need to get server name + for ( TInt index = 0; index < iStoredServers.Count(); index++ ) + { + CCmMediaServerFull* server = iStoredServers[index]; + + if ( ( iUploadCapabilitySupport && server->StoreUsage() ) || + ( !iUploadCapabilitySupport && server->FillUsage() ) ) + { + itemText = CnvUtfConverter::ConvertToUnicodeFromUtf8L( + server->MediaServerName() ); + CleanupStack::PushL(itemText); + + iSettingText->Des().Copy( itemText->Left( KMaxFileName) ); + + CleanupStack::PopAndDestroy( itemText ); + index = iStoredServers.Count(); // break loop + } + else + { + LOG(_L("[MSGSPlugin]\t CMSSettingItemDevices::\ + SetSettingItemTextL copycapability required but not \ + supported by server")); + } + } + } + // more than one item selected + else + { + if ( count > 1 ) + { + itemText = StringLoader::LoadLC( R_MS_ITEM_DEVICES, count ); + } + else + { + itemText = StringLoader::LoadLC( R_MS_NO_SERVER_SELECTED ); + } + + // do number conversion + TPtr ptr = itemText->Des(); + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( ptr ); + + iSettingText->Des().Copy( *itemText ); + CleanupStack::PopAndDestroy( itemText ); + } + + // Set new value + SetExternalText( *iSettingText ); + } + +// -------------------------------------------------------------------------- +// CMSSettingItemDevices::CountSelectedItems +// Counts selected items +// -------------------------------------------------------------------------- +// +TInt CMSSettingItemDevices::CountSelectedItems() const + { + LOG(_L("[MSGSPlugin]\t CMSSettingItemDevices::CountSelectedItems")); + + TInt count(0); + + if( iStoredServers.Count() ) + { + TRACE(Print(_L("[MSGSPlugin]\t server COUNT: = %d"), + iStoredServers.Count() )); + for ( TInt index = 0; index < iStoredServers.Count(); index++ ) + { + + CCmMediaServerFull* server = iStoredServers[index]; + + if ( iUploadCapabilitySupport && server->StoreUsage() ) + { + count++; + } + else if ( !iUploadCapabilitySupport && server->FillUsage() ) + { + count++; + } + else + { + LOG(_L("[MSGSPlugin]\t CMSSettingItemDevices::\ + CountSelectedItems server not used")); + } + } + } + TRACE(Print(_L("[MSGSPlugin]\t active server COUNT: = %d"), + count )); + return count; + } + +// --------------------------------------------------------------------------- +// CMSSettingItemDevices::DialogDismissedL +// --------------------------------------------------------------------------- +// +void CMSSettingItemDevices::DialogDismissedL( TInt aButtonId ) + { + LOG(_L("[MSGSPlugin]\t CMSSettingItemDevices::DialogDismissedL")); + + if( aButtonId != EAknSoftkeyDone ) + { + LOG(_L("[MSGSPlugin]\t CMSSettingItemDevices::\ + DialogDismissedL CANCEL")); + iUserCancelledSearch = ETrue; + // cancel server search if it was started + CancelDeviceSearch(); + } + + if ( iWait.IsStarted() ) + { + iWait.AsyncStop(); + } + } + +// --------------------------------------------------------------------------- +// CMSSettingItemDevices::UPnPDeviceDiscoveredL +// Returns discovered device from UPnP AV control point. +// --------------------------------------------------------------------------- +// +void CMSSettingItemDevices::UPnPDeviceDiscoveredL( + const CUpnpAVDevice& aDevice) + { + LOG(_L("[MSGSPlugin]\t CMSSettingItemDevices::UPnPDeviceDiscoveredL")); + + // Check that this is mediaserver + if ( aDevice.DeviceType() == CUpnpAVDevice::EMediaServer && + aDevice.SearchCapability() && aDevice.DlnaCompatible() ) + { + LOG(_L("[MSGSPlugin]\t Found device is Media server!")); + +#ifdef __DEBUG + HBufC* devName = UpnpString::ToUnicodeL( aDevice.FriendlyName() ); + TRACE(Print(_L("[MSGSPlugin]\t device Name= %S"), devName )); + delete devName; +#endif + TPtrC8 deviceUDN = aDevice.Uuid(); + + TInt serverCount = iStoredServers.Count(); + TBool newServer( ETrue ); + CCmMediaServerFull* tempServer = NULL; + + // Check if server is already on the list + for ( TInt i=0; i < serverCount; i++ ) + { + // Compare server udn + if ( deviceUDN.Compare( + iStoredServers[i]->MediaServer() ) == 0 ) + { + tempServer = iStoredServers[i]; + // server already on the list + i = serverCount; // end loop + newServer = EFalse; + } + } + + if ( newServer ) + { + tempServer = CCmMediaServerFull::NewL(); + CleanupStack::PushL( tempServer ); + tempServer->SetUDNL( aDevice.Uuid() ); + tempServer->SetMediaServerNameL( aDevice.FriendlyName() ); + tempServer->SetCopyCapability( aDevice.CopyCapability() ); + + // Add the server to found list + iStoredServers.Append( tempServer ); + + CleanupStack::Pop( tempServer ); + } + // Add unselected servers to show to user + if ( ( iUploadCapabilitySupport && tempServer->CopyCapability() + && !tempServer->StoreUsage() ) + || ( !iUploadCapabilitySupport && !tempServer->FillUsage() ) ) + { + iServerList.AppendL( tempServer ); + if ( iWaitDialog ) + { + TRAP_IGNORE( iWaitDialog->ProcessFinishedL() ); + iWaitDialog = NULL; + } + + // If devices are searched for the first time + // the dialog needs to be created in EditItemL. + // This call is for updating existing dialog. + if ( iDevSelectionDlg ) + { + iDevSelectionDlg->UpdateAndDrawPopupL( tempServer ); + } + } + } + } + +// --------------------------------------------------------------------------- +// CMSSettingItemDevices::UPnPDeviceDiscovered +// Returns discovered device from UPnP AV control point +// --------------------------------------------------------------------------- +// +void CMSSettingItemDevices::UPnPDeviceDiscovered( + const CUpnpAVDevice& aDevice ) + { + LOG(_L("[MSGSPlugin]\t CMSSettingItemDevices::\ + UPnPDeviceDiscovered")); + + TRAP_IGNORE( UPnPDeviceDiscoveredL( aDevice ) ); + } + +// --------------------------------------------------------------------------- +// CMSSettingItemDevices::UPnPDeviceDisappeared +// Returns disappeared device from UPnP AV control point. +// --------------------------------------------------------------------------- +// +void CMSSettingItemDevices::UPnPDeviceDisappeared( + const CUpnpAVDevice& /*aDevice*/ ) + { + LOG(_L("[MSGSPlugin]\t CMSSettingItemDevices::\ + UPnPDeviceDisappeared")); + // do nothing + } + +// --------------------------------------------------------------------------- +// CMSSettingItemDevices::WLANConnectionLost +// Notifies wlan connection lost +// --------------------------------------------------------------------------- +// +void CMSSettingItemDevices::WLANConnectionLost() + { + LOG(_L("[MSGSPlugin]\t CMSSettingItemDevices::WLANConnectionLost")); + + TRAP_IGNORE( DialogDismissedL( EAknSoftkeyCancel ) ); + if ( iWaitDialog ) + { + TRAP_IGNORE( iWaitDialog->ProcessFinishedL() ); + iWaitDialog = NULL; + } + } + +// -------------------------------------------------------------------------- +// CMSSettingItemDevices::CreateAvcontrollerL +// +// -------------------------------------------------------------------------- +// +TInt CMSSettingItemDevices::CreateAvcontrollerL() + { + LOG( _L("[MSGSPlugin]\t CMSSettingItemDevices::CreateAvcontrollerL" ) ); + + if( iAvController ) + { + iAvController->Release(); + iAvController = NULL; + } + + iAvController = UPnPAVControllerFactory::NewUPnPAVControllerL(); + + if( iAvController ) + { + iAvController->SetDeviceObserver( *this ); + } + + return KErrNone; + } + +// -------------------------------------------------------------------------- +// CMSSettingItemDevices::CancelDeviceSearch +// +// -------------------------------------------------------------------------- +// +void CMSSettingItemDevices::CancelDeviceSearch() + { + LOG( _L( "[MSGSPlugin]\t CMSSettingItemDevices::CancelDeviceSearch" ) ); + + if ( iAvController ) + { + iAvController->RemoveDeviceObserver(); + iAvController->Release(); + iAvController = NULL; + } + } + +// --------------------------------------------------------------------------- +// CMSSettingItemDevices::FetchAlreadyDiscoveredDevicesL +// Fetches devices from AVController and calls +// DeviceDiscovered-callback for each of them. +// --------------------------------------------------------------------------- +// +void CMSSettingItemDevices::FetchAlreadyDiscoveredDevicesL() + { + LOG( _L("[MSGSPlugin]\t CMSSettingItemDevices::\ + FetchAlreadyDiscoveredDevicesL") ); + + // If iAvController is not created, this method is unusable. + // Call CreateAvControllerL first. + User::LeaveIfNull( iAvController ); + + // Fetch already found devices from AVController. + CUpnpAVDeviceList* discoveredDevices = + iAvController->GetMediaServersL(); + CleanupStack::PushL( discoveredDevices ); + + if ( discoveredDevices && discoveredDevices->Count() > 0 ) + { + // the AVController already has some devices. + LOG(_L("[MSGSPlugin]\t \ + CMSSettingItemDevices::FetchAlreadyDiscoveredDevicesL: \ + AVController has already discovered devices" ) ); + + // process the already existing devices + for ( TInt i = 0 ; i < discoveredDevices->Count() ; i++ ) + { + UPnPDeviceDiscovered( + *( discoveredDevices->operator[](i) ) ); + } + } + + // clean up + CleanupStack::PopAndDestroy( discoveredDevices ); + discoveredDevices = NULL; + } + +// --------------------------------------------------------------------------- +// CMSSettingItemDevices::CreateAvcAndFetchDevicesL +// Creates AVController, fetches devices from it and calls +// DeviceDiscovered-callback for each of them. Starts wait note if no devices +// are already discovered. +// --------------------------------------------------------------------------- +// +TInt CMSSettingItemDevices::CreateAvcAndFetchDevicesL() + { + LOG( _L( + "[MSGSPlugin]\t CMSSettingItemDevices::CreateAvcAndFetchDevicesL" ) + ); + + iUserCancelledSearch = EFalse; + + if( iSelectedServers ) + { + iSelectedServers->Reset(); + delete iSelectedServers; + iSelectedServers = NULL; + } + iSelectedServers = + new (ELeave) CArrayFixFlat( KItemArrayGranularity ); + + iCreateAvCState = EPhaseNotActive; + CAknWaitNoteWrapper* waitNoteWrapper = CAknWaitNoteWrapper::NewL(); + CleanupStack::PushL( reinterpret_cast( waitNoteWrapper ) ); + TRAPD( err, waitNoteWrapper->ExecuteL( + R_MS_WAIT_FOR_CREATEAVC_DIALOG, + *this, + ETrue ) );//ETrue = show immediately + CleanupStack::PopAndDestroy( waitNoteWrapper ); + + + if ( iAvController ) + { + // Process devices that AVController has already discovered. + FetchAlreadyDiscoveredDevicesL(); + + // If still no devices discovered, start wait note. + if ( iServerList.Count() == 0 ) + { + iWaitDialog = new ( ELeave ) CAknWaitDialog( + ( REINTERPRET_CAST( CEikDialog**, &iWaitDialog ) ) ); + iWaitDialog->SetCallback( this ); + iWaitDialog->ExecuteLD( R_MS_WAIT_DIALOG ); + LOG( _L( "[MSGSPlugin]\t CMSSettingItemDevices::\ + CreateAvcAndFetchDevicesL starting wait" ) ); + iWait.Start(); // wait here until first server is found. + } + } + else + { + //handle the error + if( KErrDiskFull == err ) + { + ShowErrorNoteL( R_MS_GS_MEMORY_FULL ); + } + iUserCancelledSearch = ETrue; // Don't show selection dialog. + } + + return err; + } + +// --------------------------------------------------------------------------- +// CMSSettingItemDevices::ShowErrorNoteL +// --------------------------------------------------------------------------- +// +void CMSSettingItemDevices::ShowErrorNoteL( TInt aTextResource ) + { + LOG( _L( "[MSGSPlugin]\t CMSSettingItemDevices::ShowErrorNoteL" ) ); + HBufC* warningText = + StringLoader::LoadLC( aTextResource ); + CAknErrorNote* dlg = new ( ELeave ) CAknErrorNote( ); + dlg->ExecuteLD( *warningText ); + CleanupStack::PopAndDestroy( warningText ); + } + +// --------------------------------------------------------------------------- +// CMSSettingItemDevices::StepL +// --------------------------------------------------------------------------- +// +void CMSSettingItemDevices::StepL() + { + LOG( _L( "[MSGSPlugin]\t CMSSettingItemDevices::StepL" ) ); + if( EPhaseNotActive == iCreateAvCState ) + { + CreateAvcontrollerL(); + iCreateAvCState = EPhaseCompleted; + } + } + +// --------------------------------------------------------------------------- +// CMSSettingItemDevices::IsProcessDone +// --------------------------------------------------------------------------- +// +TBool CMSSettingItemDevices::IsProcessDone() const + { + LOG( _L( "[MSGSPlugin]\t CMSSettingItemDevices::IsProcessDone" ) ); + TBool ret( EFalse ); + if ( EPhaseNotActive == iCreateAvCState ) + { + // try to start avcontroller + } + else if ( EPhaseCompleted == iCreateAvCState ) + { + ret = ETrue; + } + else + { + LOG( _L( "[MSGSPlugin]\t CMSSettingItemDevices::IsProcessDone \ + other branch" ) ); + } + return ret; + } + +// --------------------------------------------------------------------------- +// CMSSettingItemDevices::CycleError +// handles the error +// --------------------------------------------------------------------------- +// +TInt CMSSettingItemDevices::CycleError( TInt aError ) + { + TRACE( Print( _L( " CMSSettingItemDevices::CycleError \ + aError = %d " ), aError ) ); + + return aError; + } + +// End of File