voipplugins/voipadapters/voipxmlprovisioning/provisioningappui/Src/VoIPProvisioningAppUi.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/voipplugins/voipadapters/voipxmlprovisioning/provisioningappui/Src/VoIPProvisioningAppUi.cpp Tue Feb 02 00:05:57 2010 +0200
@@ -0,0 +1,375 @@
+/*
+* Copyright (c) 2009-2010 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: Application UI implementation.
+*
+*/
+
+
+// INCLUDES
+#include <EIKDOC.H>
+#include <stringloader.h>
+#include <AknQueryDialog.h>
+#include <VoIPProvisioningApp.rsg>
+#include <aknnotewrappers.h>
+#include <apgcli.h> // RApaLsSession
+#include <bautils.h>
+#include <xspviewservices.h>
+#include <BrowserUiSDKCRKeys.h>
+#include <pathinfo.h>
+#include <DriveInfo.h>
+#include <zipfile.h>
+#include <zipfilememberinputstream.h>
+#include <aknwaitdialog.h>
+
+#include "voipxmlparser.h"
+#include "VoIPProvisioningAppUi.h"
+#include "VoIPProvisioningApp.h"
+#include "VoIPProvisioningDocument.h"
+
+const TInt KOneSecond( 1000000 );
+const TUid KMecoServiceTabUid = {0x20012423};
+const TInt KFiveTimes( 5 );
+_LIT( KDownloadFileName, "tempbranddatapackage.zip" );
+_LIT( KBrandMifPath, ":\\private\\102828DD\\import\\" );
+_LIT( KBrandInstallPath, ":\\private\\102828DD\\import\\install\\" );
+_LIT( KBrandXmlPath, ":\\private\\102828E1\\import\\" );
+_LIT( KXmlExtension, ".xml" );
+_LIT( KMifExtension, ".mif" );
+_LIT( KInstallExtension, ".install" );
+_LIT8( KZipExtension, ".zip" );
+
+// ----------------------------------------------------------------------------
+// CVoIPProvisioningAppUi::CVoIPProvisioningAppUi
+// ----------------------------------------------------------------------------
+//
+CVoIPProvisioningAppUi::CVoIPProvisioningAppUi()
+ {
+ }
+
+// ----------------------------------------------------------------------------
+// CVoIPProvisioningAppUi::ConstructL
+// ----------------------------------------------------------------------------
+
+void CVoIPProvisioningAppUi::ConstructL()
+ {
+ // Call base classes ConstructL method.
+ BaseConstructL( ENoScreenFurniture | EAknEnableMSK );
+
+ StatusPane()->MakeVisible( EFalse );
+ HideApplicationFromFSW( ETrue );
+
+ iBrandPackageName.Copy( PathInfo::PhoneMemoryRootPath() );
+ iBrandPackageName.Append( PathInfo::OthersPath() );
+ iBrandPackageName.Append( KDownloadFileName );
+ }
+
+// ----------------------------------------------------------------------------
+// CVoIPProvisioningAppUi::~CVoIPProvisioningAppUi
+// ----------------------------------------------------------------------------
+//
+CVoIPProvisioningAppUi::~CVoIPProvisioningAppUi()
+ {
+ iDownloadMgr.Close();
+ if ( iWaitDialog )
+ {
+ TRAP_IGNORE( iWaitDialog->ProcessFinishedL() );
+ iWaitDialog = NULL;
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CVoIPProvisioningAppUi::ProcessCommandParametersL
+// ----------------------------------------------------------------------------
+//
+TBool CVoIPProvisioningAppUi::ProcessCommandParametersL(
+ TApaCommand /*aCommand*/, TFileName& /*aDocumentName*/,
+ const TDesC8& /*aTail*/ )
+ {
+ // Always return ETrue to make CVoIPProvisioningDocument's
+ // OpenFileL to be called.
+ return ETrue;
+ }
+
+// ----------------------------------------------------------------------------
+// CVoIPProvisioningAppUi::HandleFileL
+// ----------------------------------------------------------------------------
+//
+void CVoIPProvisioningAppUi::HandleFileL( RFile& aFile )
+ {
+ RFile file;
+ User::LeaveIfError( file.Duplicate( aFile ) );
+ CVoipXmlParser* parser = CVoipXmlParser::NewLC(); // CS:1
+ TBuf8<KMaxFileName> brandUrl( KNullDesC8 );
+ HBufC* queryText = parser->ReadDescriptionLC( aFile, brandUrl ); // CS:2
+ if ( !queryText->Des().Length() )
+ {
+ CleanupStack::PopAndDestroy( queryText );
+ queryText = NULL;
+ queryText = StringLoader::LoadLC( R_VOIP_DEFAULT_SAVE_QUERY );
+ }
+ CAknQueryDialog* query = CAknQueryDialog::NewL();
+ CleanupStack::PushL( query ); // CS:3
+ query->SetPromptL( queryText->Des() );
+ TBool launchTab( EFalse );
+ TUint32 serviceTabId;
+ if ( query->ExecuteLD( R_VOIP_PROVISIONING_QUERY_INSTALL_SERVICE ) )
+ {
+ iWaitDialog = new( ELeave ) CAknWaitDialog(
+ REINTERPRET_CAST( CEikDialog**, &iWaitDialog ) );
+ iWaitDialog->SetTone( CAknNoteDialog::ENoTone );
+ iWaitDialog->ExecuteLD( R_WAITNOTE_CONFIGURE );
+
+ FetchBrandingDataL( brandUrl );
+
+ // Start phonebook into backgound.
+ RxSPViewServices viewServices;
+ CleanupClosePushL( viewServices ); // CS:4
+ TInt viewSrvErr = viewServices.Open();
+ if ( KErrServerTerminated == viewSrvErr || KErrNotFound == viewSrvErr )
+ {
+ viewServices.Close();
+ viewSrvErr = viewServices.Open();
+ }
+ if ( KErrNone == viewSrvErr )
+ {
+ viewServices.Close();
+ }
+
+ // Ownership of file is trasferred.
+ TInt error = parser->ImportDocument( file, serviceTabId );
+ if ( KErrNone == error )
+ {
+ iWaitDialog->ProcessFinishedL();
+ iWaitDialog = NULL;
+ ShowDoneNoteL();
+ launchTab = ETrue;
+ }
+ else
+ {
+ iWaitDialog->ProcessFinishedL();
+ iWaitDialog = NULL;
+ ShowFailNoteL();
+ }
+ CleanupStack::PopAndDestroy( &viewServices ); // CS:3
+ }
+ CleanupStack::Pop( query ); // CS:2
+ // queryText, parser
+ CleanupStack::PopAndDestroy( 2, parser ); // CS:0
+
+ // Launch service tab.
+ if ( launchTab )
+ {
+ TInt err = KErrNotFound;
+ TInt counter( 0 );
+ RxSPViewServices viewServices;
+ CleanupClosePushL( viewServices ); // CS:1
+ while ( KErrNone != err && KFiveTimes > counter )
+ {
+ err = viewServices.Activate(
+ KMecoServiceTabUid.iUid, (TInt32)serviceTabId );
+ if ( KErrServerTerminated == err || KErrNotFound == err )
+ {
+ err = viewServices.Activate(
+ KMecoServiceTabUid.iUid, (TInt32)serviceTabId );
+ }
+ // Wait...
+ User::After( KOneSecond );
+ counter++;
+ }
+
+ CleanupStack::PopAndDestroy( &viewServices ); // CS:0
+ TApaTaskList taskList( CEikonEnv::Static()->WsSession() );
+ TApaTask browserTask = taskList.FindApp( KCRUidBrowser );
+ if ( browserTask.Exists() )
+ {
+ browserTask.EndTask();
+ }
+ }
+
+ if ( iWaitDialog )
+ {
+ iWaitDialog->ProcessFinishedL();
+ iWaitDialog = NULL;
+ }
+
+ iDownloadMgr.Close();
+#ifndef __EUNIT_TESTING
+ User::Exit( KErrNone );
+#endif
+ }
+
+// ----------------------------------------------------------------------------
+// CVoIPProvisioningAppUi::ShowFailNoteL
+// ----------------------------------------------------------------------------
+//
+void CVoIPProvisioningAppUi::ShowFailNoteL() const
+ {
+ HBufC* text = StringLoader::LoadLC( R_VOIP_INVALID_DATA );
+ CAknErrorNote* note = new (ELeave) CAknErrorNote( R_AKN_ERROR_NOTE );
+ note->ExecuteLD( *text );
+ CleanupStack::PopAndDestroy( text );
+ }
+
+// ----------------------------------------------------------------------------
+// CVoIPProvisioningAppUi::ShowDoneNoteL
+// ----------------------------------------------------------------------------
+//
+void CVoIPProvisioningAppUi::ShowDoneNoteL() const
+ {
+ HBufC* text = StringLoader::LoadLC( R_VOIP_INSTALLED );
+ CAknInformationNote* note =
+ new (ELeave) CAknInformationNote( R_AKN_INFORMATION_NOTE );
+ note->ExecuteLD( *text );
+ CleanupStack::PopAndDestroy( text );
+ }
+
+// ---------------------------------------------------------------------------
+// From base class MHttpDownloadMgrObserver.
+// Handles download manager events.
+// ---------------------------------------------------------------------------
+//
+void CVoIPProvisioningAppUi::HandleDMgrEventL( RHttpDownload& aDownload,
+ THttpDownloadEvent aEvent )
+ {
+ if ( EHttpDlPaused == aEvent.iDownloadState &&
+ EHttpContentTypeReceived == aEvent.iProgressState )
+ {
+ TInt32 length;
+ TInt err = aDownload.GetIntAttribute( EDlAttrLength, length );
+ if ( KDefaultContentLength != length && 0 < length )
+ {
+ // Continue.
+ aDownload.Start();
+ }
+ else
+ {
+ CActiveScheduler::Stop();
+ aDownload.Delete();
+ }
+ }
+ else if ( EHttpDlCompleted == aEvent.iDownloadState )
+ {
+ CActiveScheduler::Stop();
+ // We don't need the leave code; un-branded service is OK.
+ TRAP_IGNORE( UncompressFilesL() );
+ aDownload.Delete();
+ }
+ else if ( EHttpDlFailed == aEvent.iDownloadState )
+ {
+ CActiveScheduler::Stop();
+ aDownload.Delete();
+ }
+ else if ( EHttpDlInprogress == aEvent.iDownloadState &&
+ EHttpProgDisconnected == aEvent.iProgressState )
+ {
+ CActiveScheduler::Stop();
+ aDownload.Delete();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Starts branding data download.
+// ---------------------------------------------------------------------------
+//
+TInt CVoIPProvisioningAppUi::FetchBrandingDataL( const TDesC8& aUrl )
+ {
+ if ( !aUrl.Length() || KErrNotFound == aUrl.Find( KZipExtension ) )
+ {
+ return KErrNotFound;
+ }
+ iDownloadMgr.ConnectL( KUidVoIPProvisioningAppUid, *this, EFalse );
+ RHttpDownload& download = iDownloadMgr.CreateDownloadL( aUrl );
+ download.SetStringAttribute( EDlAttrDestFilename, iBrandPackageName );
+ TInt err = download.Start();
+ CActiveScheduler::Start();
+ return err;
+ }
+
+// ---------------------------------------------------------------------------
+// Uncompresses files from a zip file.
+// ---------------------------------------------------------------------------
+//
+void CVoIPProvisioningAppUi::UncompressFilesL()
+ {
+ RFs fs;
+ User::LeaveIfError( fs.Connect() );
+ CleanupClosePushL( fs ); // CS:1
+ CZipFile* zipfile = CZipFile::NewL( fs, iBrandPackageName );
+ CleanupStack::PushL( zipfile ); // CS:2
+ CZipFileMemberIterator* iterator = zipfile->GetMembersL();
+ CleanupStack::PushL( iterator ); // CS:3
+ CZipFileMember* fileMember = iterator->NextL();
+ TChar drive;
+ DriveInfo::GetDefaultDrive( DriveInfo::EDefaultPhoneMemory, drive );
+
+ RFile output;
+ CleanupClosePushL( output ); // CS:4
+
+ while ( fileMember )
+ {
+ TFileName memberFileName = *fileMember->Name();
+ TFileName outputPath;
+ outputPath.Append( drive );
+ if ( KErrNotFound != memberFileName.Find( KXmlExtension ) )
+ {
+ outputPath.Append( KBrandXmlPath );
+ outputPath.Append( memberFileName );
+ }
+ else if ( KErrNotFound != memberFileName.Find( KInstallExtension ))
+ {
+ outputPath.Append( KBrandInstallPath );
+ outputPath.Append( memberFileName );
+ }
+ else if ( KErrNotFound != memberFileName.Find( KMifExtension ))
+ {
+ outputPath.Append( KBrandMifPath );
+ outputPath.Append( memberFileName );
+ }
+ else
+ {
+ // Ignore this file and get next file from zip.
+ fileMember = iterator->NextL();
+ break;
+ }
+
+ TInt err = fs.MkDirAll( outputPath );
+ err = output.Replace( fs, outputPath, EFileShareAny|EFileWrite );
+
+ TUint32 size = fileMember->UncompressedSize();
+ RBuf8 outputData;
+ outputData.CreateL( size );
+ CleanupClosePushL( outputData ); // CS:5
+ RZipFileMemberReaderStream* stream;
+ zipfile->GetInputStreamL( fileMember, stream );
+ CleanupStack::PushL( stream ); // CS:6
+
+ err = stream->Read( outputData, size );
+ err = output.Write( outputData );
+
+ output.Flush();
+
+ // stream, &outputData
+ CleanupStack::PopAndDestroy( 2, &outputData ); // CS:4
+
+ fileMember = iterator->NextL();
+ }
+ // &output, iterator, zipfile, &fs
+ CleanupStack::PopAndDestroy( 3, zipfile ); // CS:1
+
+ // Finally, delete temp zip file.
+ fs.Delete( iBrandPackageName );
+ CleanupStack::PopAndDestroy( &fs ); // CS:0
+ }
+
+// End of file.