phonebookui/Phonebook2/xSPExtensionManager/src/xSPOrderOrganizer.cpp
changeset 0 e686773b3f54
equal deleted inserted replaced
-1:000000000000 0:e686773b3f54
       
     1 /*
       
     2 * Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 *       xSP order organizer
       
    16 *
       
    17 */
       
    18 
       
    19 
       
    20 // INCLUDE FILES
       
    21 #include <coemain.h>
       
    22 #include <s32file.h>
       
    23 #include "xSPOrderOrganizer.h"
       
    24 #include "CxSPViewInfo.h"
       
    25 #include "MxSPFactory.h"
       
    26 
       
    27 // CONSTANTS
       
    28 namespace
       
    29 	{
       
    30 	_LIT( KExtOrderFile, "xSPorder.dat" );
       
    31 	}
       
    32 
       
    33 // ==================== MEMBER FUNCTIONS ====================
       
    34 
       
    35 void TxSPOrderUnit::ExternalizeL( RWriteStream& aStream ) const
       
    36 	{
       
    37 	aStream.WriteUint32L( iId );
       
    38 	aStream.WriteUint32L( iViewId );
       
    39 	}
       
    40 
       
    41 void TxSPOrderUnit::InternalizeL( RReadStream& aStream )
       
    42 	{
       
    43 	iId = aStream.ReadUint32L();
       
    44 	iViewId = aStream.ReadUint32L();
       
    45 	}	
       
    46 
       
    47 TInt xSPOrderOrganizer::CreatePrivateFolder( RFs& aSession, 
       
    48 												TDes& aPath, 
       
    49 												TDriveNumber aDrive )
       
    50 	{
       
    51 	_LIT( KColon, ":" );
       
    52 	TChar drive;
       
    53 	TInt err = aSession.DriveToChar( aDrive, drive );							
       
    54 	if( !err )
       
    55 		{
       
    56 		err = aSession.CreatePrivatePath( aDrive );
       
    57 		if( !err )
       
    58 			{
       
    59 			TFileName path;			
       
    60 			aSession.PrivatePath( path );
       
    61 			aPath.Zero();
       
    62 			aPath.Append( drive );
       
    63 			aPath.Append( KColon );
       
    64 			aPath.Append( path );														
       
    65 			}		
       
    66 		}	
       
    67 	return err;
       
    68 	}
       
    69 	
       
    70 TInt xSPOrderOrganizer::OrderCheck( RPointerArray<CxSPViewInfo>& aViewIdMap )
       
    71 	{
       
    72 	TInt result( KErrNone );		
       
    73 	TRAP( result, OrderCheckL( aViewIdMap ) );
       
    74 	if( result )
       
    75 		{
       
    76 		// error occured, as a preventive procedure delete the
       
    77 		// order file, deletion error code is ignored
       
    78 		DeleteOrderFile();
       
    79 		}				
       
    80 	return result;	
       
    81 	}
       
    82 	
       
    83 TInt xSPOrderOrganizer::Reorganize( const RArray<TxSPOrderUnit>& aNewOrder )
       
    84 	{
       
    85 	TInt result( KErrNone );
       
    86 	TRAP( result, WriteOrderL( aNewOrder ) );
       
    87 	if( result )
       
    88 		{
       
    89 		// error occured, as a preventive procedure delete the
       
    90 		// order file, deletion error code is ignored
       
    91 		DeleteOrderFile();
       
    92 		}
       
    93 	return result;
       
    94 	}
       
    95 	
       
    96 void xSPOrderOrganizer::OrderCheckL( RPointerArray<CxSPViewInfo>& aViewIdMap )
       
    97 	{
       
    98 	RArray<TxSPOrderUnit> newOrder;
       
    99 	CleanupClosePushL( newOrder );
       
   100 	MakeNewOrderL( aViewIdMap, newOrder );
       
   101 	WriteOrderL( newOrder );
       
   102 	RearrangeExtensionsL( aViewIdMap, newOrder );
       
   103 	CleanupStack::PopAndDestroy(); // newOrder
       
   104 	}	
       
   105 
       
   106 void xSPOrderOrganizer::MakeNewOrderL( RPointerArray<CxSPViewInfo>& aViewIdMap, 
       
   107 											RArray<TxSPOrderUnit>& aNewOrder )
       
   108 	{
       
   109 	// read extOrder array from file
       
   110 	RFs& fs = CCoeEnv::Static()->FsSession();
       
   111 	TFileName orderFile;
       
   112 	User::LeaveIfError( CreatePrivateFolder( fs, orderFile, EDriveC ) );
       
   113 	orderFile.Append( KExtOrderFile );	
       
   114 	RFileReadStream readStream;
       
   115 	TInt err = readStream.Open( fs, orderFile, EFileRead );
       
   116 	if( !err )
       
   117 		{
       
   118 		CleanupClosePushL( readStream );
       
   119 		TUint32 count = readStream.ReadUint32L();
       
   120 		for( TUint32 i = 0; i < count; i++ )
       
   121 			{
       
   122 			TxSPOrderUnit next;
       
   123 			readStream >> next;
       
   124 			User::LeaveIfError( aNewOrder.Append( next ));
       
   125 			}
       
   126 		CleanupStack::PopAndDestroy(); // readStream
       
   127 		}
       
   128 			
       
   129 	// add new installed extensions to aNewOrder array
       
   130 	for( TInt i = 0; i < aViewIdMap.Count(); i++ )
       
   131 		{
       
   132 		const CxSPViewInfo& viewInfo = *aViewIdMap[i];
       
   133 		if( viewInfo.TabView() )
       
   134 			{
       
   135 			TBool found( EFalse );
       
   136 			for( TInt j = 0; j < aNewOrder.Count() && !found; j++ )
       
   137 				{
       
   138 				if( viewInfo.Id() == aNewOrder[j].iId &&
       
   139 					viewInfo.OldViewId() == aNewOrder[j].iViewId )
       
   140 					{					
       
   141 					found = ETrue;
       
   142 					}
       
   143 				}
       
   144 			if( !found )
       
   145 				{
       
   146 				TxSPOrderUnit next;
       
   147 				next.iId = viewInfo.Id();
       
   148 				next.iViewId = viewInfo.OldViewId();
       
   149 				User::LeaveIfError( aNewOrder.Append( next ) );
       
   150 				}
       
   151 			}		
       
   152 		}
       
   153 		
       
   154 	// remove uninstalled extensions from aNewOrder array
       
   155 	for( TInt i = 0; i < aNewOrder.Count();  )
       
   156 		{
       
   157 		TxSPOrderUnit next = aNewOrder[i];
       
   158 		TBool found( EFalse );
       
   159 		for( TInt j = 0; j < aViewIdMap.Count() && !found; j++ )
       
   160 			{
       
   161 			const CxSPViewInfo& viewInfo = *aViewIdMap[j];
       
   162 			if( viewInfo.Id() == next.iId && viewInfo.OldViewId() == next.iViewId )
       
   163 				{
       
   164 				found = ETrue;
       
   165 				}			
       
   166 			}
       
   167 		if( found )
       
   168 			{
       
   169 			i++;
       
   170 			}
       
   171 		else
       
   172 			{
       
   173 			aNewOrder.Remove( i );
       
   174 			}
       
   175 		}								
       
   176 	}
       
   177 	
       
   178 void xSPOrderOrganizer::WriteOrderL( const RArray<TxSPOrderUnit>& aNewOrder )
       
   179 	{	
       
   180 	RFs& fs = CCoeEnv::Static()->FsSession();
       
   181 	TFileName orderFile;
       
   182 	User::LeaveIfError( CreatePrivateFolder( fs, orderFile, EDriveC ) );
       
   183 	orderFile.Append( KExtOrderFile );	
       
   184 	// write aNewOrder array to file
       
   185 	RFileWriteStream writeStream;
       
   186 	TInt err = writeStream.Replace( fs, orderFile, EFileWrite );
       
   187 	if( !err )
       
   188 		{
       
   189 		CleanupClosePushL( writeStream );
       
   190 		TUint32 count = aNewOrder.Count();
       
   191 		writeStream.WriteUint32L( count );
       
   192 		for( TUint32 i = 0; i < count; i++ )
       
   193 			{
       
   194 			writeStream << aNewOrder[i]; 
       
   195 			}		
       
   196 		CleanupStack::PopAndDestroy(); // writeStream
       
   197 		}		
       
   198 	}
       
   199 	
       
   200 void xSPOrderOrganizer::RearrangeExtensionsL( RPointerArray<CxSPViewInfo>& aViewIdMap,
       
   201     											const RArray<TxSPOrderUnit>& aNewOrder )
       
   202 	{
       
   203 	// organize extension order
       
   204 	for( TInt i = 0; i < aNewOrder.Count(); i++ )
       
   205 		{
       
   206 		TxSPOrderUnit next = aNewOrder[i];
       
   207 		for( TInt j = 0; j < aViewIdMap.Count(); j++ )
       
   208 			{
       
   209 			const CxSPViewInfo* viewInfo = aViewIdMap[j];
       
   210 			if( next.iId == viewInfo->Id() &&
       
   211 				next.iViewId == viewInfo->OldViewId() )
       
   212 				{
       
   213 				aViewIdMap.Remove( j );
       
   214 				aViewIdMap.Compress();
       
   215 				aViewIdMap.InsertL( viewInfo, i );
       
   216 				}							
       
   217 			}
       
   218 		}
       
   219 	}
       
   220 	
       
   221 TInt xSPOrderOrganizer::DeleteOrderFile()
       
   222 	{
       
   223 	TInt result( KErrNone );
       
   224 	TFileName orderFile;
       
   225 	RFs& fs = CCoeEnv::Static()->FsSession();
       
   226 	TInt err = CreatePrivateFolder( fs, orderFile, EDriveC );
       
   227 	if( !err )
       
   228 		{
       
   229 		orderFile.Append( KExtOrderFile );
       
   230 		result = fs.Delete( orderFile );							
       
   231 		}
       
   232 	else
       
   233 		{
       
   234 		result = err;
       
   235 		}			
       
   236 	return result;
       
   237 	}
       
   238 
       
   239 // end of file