brandingserver/tools/bsimport/src/installer.cpp
changeset 0 e6b17d312c8b
child 21 cfd5c2994f10
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/brandingserver/tools/bsimport/src/installer.cpp	Thu Dec 17 08:54:49 2009 +0200
@@ -0,0 +1,259 @@
+/*
+* Copyright (c) 2006-2006 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:  Global methods for brandinstaller
+*
+*/
+
+
+#include <e32base.h>
+#include <eikenv.h>
+#include <f32file.h>
+#include <e32property.h>
+
+#include "cbsimportmanager.h"
+#include "importlogwriter.h"
+#include "bsbrandremover.h"
+
+namespace
+{
+
+// CONSTANTS
+//
+_LIT( KProcessName,         "BSInstall" );
+
+// Search these files for processing
+_LIT( KInstallFiles,        "*.xml" );
+
+// Path to installed xml files inside own private folder. 
+_LIT( KInstallPath,         "import\\" );
+_LIT( KInstallDrive,        "C:" );
+
+// separators for uninstalled brands
+_LIT( KLineFeed,            "\n" );
+_LIT( KBrandSeparator,      "$" );
+
+// Pub & sub keys for uninstall buffer
+const TInt  KBrandingServerUid  = 0x102828DD;
+const TUint KUninstallKey       = 0x01;
+}
+
+// ======== GLOBAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// DeleteRPtrArray
+// ---------------------------------------------------------------------------
+//
+LOCAL_C void DeleteRPtrArray( TAny* aArray )
+    {
+    RPointerArray<HBufC>* array = static_cast< RPointerArray<HBufC>* >(aArray);
+    TInt count = array->Count();
+    for( TInt i = 0; i < count; i++ )
+        {
+        delete (*array)[i];
+        }
+    array->Reset();
+    }
+    
+// ---------------------------------------------------------------------------
+// ParseInstallableBrandsL
+// ---------------------------------------------------------------------------
+//
+LOCAL_C void ParseInstallableBrandsL( RFs& aFs, RPointerArray<HBufC>& aFiles )
+    {
+    IMPORT_DP_TXT("ParseInstallableBrandsL begin");
+    // list import content
+    CDir* dir = NULL;
+    TPath privatePath;
+    aFs.PrivatePath( privatePath );
+    privatePath.Insert( 0, KInstallDrive );
+    privatePath.Append( KInstallPath );
+
+    TFileName find( privatePath );
+    find.Append( KInstallFiles );
+    User::LeaveIfError( 
+        aFs.GetDir( find, KEntryAttNormal, ESortNone, dir ) );
+    CleanupStack::PushL( dir );
+    
+    // create array of files (as text)
+    TInt count = dir->Count();
+    for( TInt i = 0; i < count; i++ )
+        {
+        TFileName file( privatePath );
+        file.Append( (*dir)[i].iName );
+        aFiles.Append( file.AllocL() );
+        }
+
+    CleanupStack::PopAndDestroy( dir );
+    IMPORT_DP_TXT("ParseInstallableBrandsL end");
+    }
+
+// ---------------------------------------------------------------------------
+// Uninstall
+// ---------------------------------------------------------------------------
+//
+LOCAL_C void UninstallL()
+    {
+    
+    // Get uninstalled brands
+    HBufC* dataBuf = HBufC::NewLC( RProperty::KMaxPropertySize );
+    
+    HBufC* newDataBuf = HBufC::NewLC( RProperty::KMaxPropertySize );
+    TPtr newData( newDataBuf->Des() );
+    TBool error( EFalse );
+    
+    TPtr data( dataBuf->Des() );
+    RProperty::Get( TUid::Uid( KBrandingServerUid ), KUninstallKey, data );
+    
+    //IMPORT_DP( D_IMPORT_LIT( "Property data='%S'" ), &data );
+    
+    TPtrC processing( data );
+    while( processing.Length() > 0 )
+        {
+        // get first brand from buffer
+        TInt pos = processing.Find( KLineFeed );
+        TPtrC brand( (pos >= 0) ? processing.Left( pos ) : processing );
+        if( pos == KErrNotFound )
+            {
+            // this was last item. reset process.
+            processing.Set( KNullDesC );
+            }
+        else
+            {
+            // cut out the brand part from processing
+            processing.Set( processing.Mid( brand.Length() + 1 ) );
+            }
+        
+        // divide brand
+        TInt sepPos = brand.Find( KBrandSeparator );
+        if( sepPos != KErrNotFound )
+            {
+            // remove brand
+            TRAPD( err, BSBrandRemover::RemoveBrandL( 
+                brand.Left( sepPos ), brand.Mid( sepPos + 1 ) ) );
+            //If the brand removal failed and due to a KErrInUse errorcode, 
+            //it must not be deleted from the property-->try to delete next
+            //time again! in any other case, we simply delete the un-
+            //uninstallation string from the RProperty.
+            //NOTE also: Since we check here for an errorcode that is (probably)
+            //raised in CBSSession.cpp by calling User::Leave, it has to be 
+            //considered whether the condition of the following if statement 
+            //has to be updated or not, if the errorcode of that User::Leave
+            //in CBSSession.cpp is modified.
+            if ( KErrInUse == err )
+                {
+                error = ETrue;
+                if( newData.Length() > 0 )
+                    {
+                    newData.Append( KLineFeed );
+                    }
+                newData.Append( brand );                
+                }
+            }
+        }
+    
+    // Reset uninstall buffer
+    if ( error )
+        {
+        if( newData.Length() <= RProperty::KMaxPropertySize )
+            {
+            User::LeaveIfError( RProperty::Set( TUid::Uid( KBrandingServerUid ), 
+                                                KUninstallKey, 
+                                                newData ) );            
+            }
+        }
+    else
+        {
+    	RProperty::Set( TUid::Uid( KBrandingServerUid ), 
+                        KUninstallKey, 
+                        KNullDesC );        
+        }    
+    CleanupStack::PopAndDestroy( newDataBuf );
+    CleanupStack::PopAndDestroy( dataBuf );    
+    
+    IMPORT_DP_TXT("UninstallL end");
+    }
+
+// ---------------------------------------------------------------------------
+// MainL
+// ---------------------------------------------------------------------------
+//
+LOCAL_C void MainL()
+    {
+	IMPORT_DP_TXT("MainL begin");
+	// Codescanner warning: User of non-pointer/refer3ence RFs (Id:76)
+	// this code cannot get file server handle from anywhere, so it has to be
+	// created here
+    RFs fs; // CSI: 76 # See above
+    User::LeaveIfError( fs.Connect() );
+    CleanupClosePushL( fs );
+    
+    // Uninstall removed brands
+    TRAP_IGNORE( UninstallL() );
+    
+    // find new xml files
+    RPointerArray<HBufC> files;
+    CleanupStack::PushL( TCleanupItem( DeleteRPtrArray, &files ) );
+    ParseInstallableBrandsL( fs, files);
+    
+    // convert PointerArray to MDesCArray
+	
+    TInt count = files.Count();
+    if(count)
+    	{
+    
+	    // Do install
+	    CBSImportManager* installer = CBSImportManager::NewLC();
+	    
+	    for( TInt i = 0; i < count; i++ )
+	        {
+	        TRAPD( err, installer->ImportFileL( *(files[i]) ) );
+	        // only delete the xml file if the installation succeeded; ignore errors.
+	        // If there is a reason to save these files, then change this to 
+	        // move operation.
+	        if ( KErrNone == err )
+	            {
+	            fs.Delete( *(files[i]) );
+	            }	        
+	        }
+    
+	    //User::LeaveIfError( err ); //TODO: should we still leave at this point? 
+	    CleanupStack::PopAndDestroy( installer ); 
+	    
+		} 
+	CleanupStack::PopAndDestroy( 2 ); // files,  fs
+    IMPORT_DP_TXT("MainL end");
+    }
+
+// ---------------------------------------------------------------------------
+// Main function of the application executable.
+// ---------------------------------------------------------------------------
+//
+GLDEF_C TInt E32Main()
+    {
+	__UHEAP_MARK;
+	CTrapCleanup* cleanup = CTrapCleanup::New();
+	TInt returnCode( KErrNone );
+    IMPORT_DP_TXT("----- NEW IMPORT SESSION ------( INSTALLER )---");
+    User::RenameThread( KProcessName );
+	TRAPD( error, MainL() );
+	if( error )
+	    {
+	    IMPORT_DP( D_IMPORT_LIT( "ERROR installing brand: %d" ), error );
+	    }
+    IMPORT_DP_TXT("-----------------------------------------------");
+	__ASSERT_ALWAYS( !error, User::Panic( KProcessName, error ) );
+	delete cleanup;
+	__UHEAP_MARKEND;
+	return returnCode;
+    }