diff -r 000000000000 -r dd21522fd290 webengine/widgetbackuprestore/Src/WidgetActiveCallback.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/widgetbackuprestore/Src/WidgetActiveCallback.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,349 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Widget's active callback in WidgetBackupRestore. +* +*/ + + +// INCLUDE FILES +#include +#include + +#include "WidgetActiveCallback.h" +#include "WidgetInstaller.h" + +// CONSTANTS +_LIT(KWidgetUiPath, "\\private\\10282822\\"); +_LIT(KWidgetBURTempPath, "WidgetBURTemp\\"); +_LIT(KWidgetBURDummy, "dummy data for backup"); + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CWidgetActiveCallback* CWidgetActiveCallback::NewL() + { + CWidgetActiveCallback* self = + new( ELeave ) CWidgetActiveCallback(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CWidgetActiveCallback::~CWidgetActiveCallback() + { + delete iPathBUR; + iFs.Close(); +#ifdef _DEBUG + iFileLogger.Close(); +#endif + } + +// --------------------------------------------------------- +// CWidgetActiveCallback::CleanupBackupDataL +// +// Cleaning for passive backup: move private area from widgetBackupRestore back to widgetUI. +// --------------------------------------------------------- +// +void CWidgetActiveCallback::CleanupBackupDataL() + { + CFileMan* fileManager = CFileMan::NewL( iFs ); + CleanupStack::PushL( fileManager ); + + // Move widget data from BUR path back to widgetUI + User::LeaveIfError( fileManager->Move( *iPathBUR, KWidgetUiPath, CFileMan::ERecurse ) ); + // Remove the temp folder for BUR + User::LeaveIfError( fileManager->RmDir( *iPathBUR ) ); + + CleanupStack::PopAndDestroy(); // fileMananger + } + +// --------------------------------------------------------------------------- +// Inform that all data has been backed up or restored. +// --------------------------------------------------------------------------- +// +void CWidgetActiveCallback::AllSnapshotsSuppliedL() + { + // Finalize and cleanup. + return; + } + +// --------------------------------------------------------------------------- +// Not supported. +// --------------------------------------------------------------------------- +// +void CWidgetActiveCallback::ReceiveSnapshotDataL( + TDriveNumber /*aDrive*/, TDesC8& /*aBuffer*/, TBool /*aLastSection*/) + { + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// Make a guess about data size. +// --------------------------------------------------------------------------- +// +TUint CWidgetActiveCallback::GetExpectedDataSize( + TDriveNumber /*aDrive*/) + { + // we have no idea at this point - we even don't know what is to be + // backed up yet + return 0; + } + +// --------------------------------------------------------------------------- +// Not supported. +// --------------------------------------------------------------------------- +// +void CWidgetActiveCallback::GetSnapshotDataL( + TDriveNumber /*aDrive*/, TPtr8& /*aBuffer*/, TBool& /*aFinished*/) + { + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// Initialize for backup. +// --------------------------------------------------------------------------- +// +void CWidgetActiveCallback::InitialiseGetBackupDataL( + TDriveNumber /*aDrive*/) + { + // create pathBUR and put data for passive backup in it + PrepareBackupDataL(); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CWidgetActiveCallback::GetBackupDataSectionL( + TPtr8& aBuffer, TBool& aFinished) + { + // Make sure that the buffer is empty and starts from the beginning + aBuffer.SetLength(0); + // Set dummy data + aBuffer.Append( KWidgetBURDummy ); + + aFinished = ETrue; + } + +// --------------------------------------------------------------------------- +// Initialize restore. +// --------------------------------------------------------------------------- +// +void CWidgetActiveCallback::InitialiseRestoreBaseDataL( + TDriveNumber /*aDrive*/ ) + { + return; + } + +// --------------------------------------------------------------------------- +// Run state machine for restore. Receive stream from BUR engine and turn it +// to file(s). +// --------------------------------------------------------------------------- +// +void CWidgetActiveCallback::RestoreBaseDataSectionL( + TDesC8& /*aBuffer*/, TBool aFinished ) + { + if( aFinished ) + { + // If the temp folder for BUR exists, install widgets + if ( BaflUtils::FolderExists( iFs, *iPathBUR ) ) + { + InstallL(); + } + } + } + +// --------------------------------------------------------------------------- +// Incremental restoration is not supported. +// --------------------------------------------------------------------------- +// +void CWidgetActiveCallback::InitialiseRestoreIncrementDataL( + TDriveNumber /*aDrive*/) + { + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// Incremental restoration is not supported. +// --------------------------------------------------------------------------- +// +void CWidgetActiveCallback::RestoreIncrementDataSectionL( + TDesC8& /*aBuffer*/, TBool /*aFinished*/) + { + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// Called when restore is complete - sets data back to initial state. +// --------------------------------------------------------------------------- +// +void CWidgetActiveCallback::RestoreComplete(TDriveNumber /*aDrive*/) + { + return; + } + +// --------------------------------------------------------------------------- +// Tidy up when operation is over. +// --------------------------------------------------------------------------- +// +void CWidgetActiveCallback::TerminateMultiStageOperation() + { + return; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TUint CWidgetActiveCallback::GetDataChecksum(TDriveNumber /*aDrive*/) + { + // not required - not implemented + return 0; + } + +// --------------------------------------------------------------------------- +// C++ constructor. +// --------------------------------------------------------------------------- +// +CWidgetActiveCallback::CWidgetActiveCallback() + { + } + +// --------------------------------------------------------------------------- +// 2nd phase constructor. +// --------------------------------------------------------------------------- +// +void CWidgetActiveCallback::ConstructL() + { +#ifdef _DEBUG + _LIT(KDir, "WidgetBUR"); + _LIT(KFile, "WidgetBURCallback.log"); + TInt err( 0 ); + + err = iFileLogger.Connect(); + if ( err == KErrNone ) + { + iFileLogger.CreateLog( KDir(), KFile(), EFileLoggingModeOverwrite ); + iCanLog = ETrue; + } +#endif + // Get the path to the default folder. + TFileName path; + User::LeaveIfError( iFs.Connect() ); + iFs.PrivatePath( path ); + + // Test whether or not the private area is present on C:. + // If it is missing, create it. + if ( !BaflUtils::FolderExists( iFs, path ) ) + { + User::LeaveIfError( iFs.CreatePrivatePath(EDriveC) ); + } + + // The temp path for BUR + iPathBUR = HBufC16::NewL( path.Length() + KWidgetBURTempPath().Length() ); + iPathBUR->Des().Copy( path ); + iPathBUR->Des().Append( KWidgetBURTempPath ); + } + +// --------------------------------------------------------------------------- +// CWidgetActiveCallback::PrepareBackupDataL() +// +// Preparing for passive backup: move private area from widgetUI to widgetBackupRestore. +// --------------------------------------------------------------------------- +// +void CWidgetActiveCallback::PrepareBackupDataL() + { + User::LeaveIfError( iFs.MkDir( *iPathBUR ) ); + + // Move widget data to BUR path + CFileMan* fileManager = CFileMan::NewL( iFs ); + CleanupStack::PushL( fileManager ); + User::LeaveIfError( fileManager->Move( KWidgetUiPath, *iPathBUR, CFileMan::ERecurse ) ); + CleanupStack::PopAndDestroy(); // fileMananger + } + +// ============================================================================ +// CWidgetActiveCallback::InstallL +// Perform installation. +// (other items were commented in a header). +// +// @since 3.2 +// ============================================================================ +// +void CWidgetActiveCallback::InstallL() + { + CDir* dir = NULL; + + if ( iFs.GetDir( *iPathBUR, KEntryAttMatchMask, EDirsFirst, dir ) == KErrNone ) + { + CleanupStack::PushL(dir); + + CWidgetInstaller* installer = NULL; + TRAPD( err , installer = CWidgetInstaller::NewL() ); + User::LeaveIfError( err ); + if ( !installer ) + { + User::Leave( KErrGeneral ); + } + + for (TInt i=0; iCount(); i++) + { + const TEntry& fileEntry = (*dir)[i]; + + // check for directory entries, i.e. "com.yahoo.local.widget.traffic" + if (fileEntry.IsDir()) + { + // e.g. restorePath = "\private\[WidgetBackupRestoreUid]\WidgetBURTemp\com.yahoo.local.widget.traffic" + TFileName restorePath( *iPathBUR ); + restorePath.Append(fileEntry.iName); + + // installer will move the restorePath to widgetUI private area + TRAPD( err, installer->InstallL( restorePath ) ); + if ( err ) + { + installer->RunError( err ); + if ( err == KErrNoMemory || err == KErrDiskFull ) + { + User::Leave( err ); + } + } + } // end of if (fileEntry + else + { + // only care about dir + break; + } + } // end of for ( + + delete installer; + + CleanupStack::PopAndDestroy(); // dir + + // Remove the temp folder for BUR + CFileMan* fileManager = CFileMan::NewL( iFs ); + CleanupStack::PushL( fileManager ); + User::LeaveIfError( fileManager->RmDir( *iPathBUR ) ); + CleanupStack::PopAndDestroy(); // fileManager + } // end of if ( iFs.GetDir + } + +// End of file