serviceproviders/sapi_applicationmanager/appmanagerservice/src/pkginfo.cpp
changeset 5 989d2f495d90
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/serviceproviders/sapi_applicationmanager/appmanagerservice/src/pkginfo.cpp	Fri Jul 03 15:51:24 2009 +0100
@@ -0,0 +1,599 @@
+/*
+* Copyright (c) 2007-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:  This Class provides information of Application installed on phone.
+*				 				 
+*
+*/
+
+
+#include <javaregistryentrytype.h>
+#include <e32cmn.h>
+#include "pkginfo.h"
+
+_LIT(KHEXAdd,"0x");
+
+_LIT(KSEPERATOR , ":");
+
+_LIT(KEDRIVE,"E");
+
+_LIT(KCDRIVE,"C");
+
+ //(8*8) + (2 * 8) = 64 + 16 = 80 , 10 bytes + 1 = 11 bytes
+const TInt KUidLength = 20;
+// (1* 8) + (1 * 8) + (1* 8) = 24 , 3 bytes + 1 = 4 bytes
+const TInt KVersionLength = 4;
+
+const TInt KdriveLen = 1 ;
+
+const TInt KDeriveE = 4;
+// -----------------------------------------------------------------------------
+// CAppInfo::NewL
+// Returns the instance of CPkgInfo class.
+// -----------------------------------------------------------------------------
+CPkgInfo* CPkgInfo::NewL( Swi::RSisRegistrySession* aSisRegSession)
+	{
+	CPkgInfo* self = new(ELeave) CPkgInfo(aSisRegSession);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+
+// -----------------------------------------------------------------------------
+// CAppInfo::CPkgInfo
+// C++ constructor
+// -----------------------------------------------------------------------------
+CPkgInfo::CPkgInfo( Swi::RSisRegistrySession* aSisRegSession):iSisRegSession(aSisRegSession)
+	{
+		
+	}
+
+
+// -----------------------------------------------------------------------------
+// CAppInfo::NewL
+// Returns the instance of CPkgInfo class.
+// -----------------------------------------------------------------------------
+CPkgInfo* CPkgInfo::NewL( Java::CJavaRegistry* aJavaReg)
+	{
+	CPkgInfo* self = new(ELeave) CPkgInfo(aJavaReg);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+// -----------------------------------------------------------------------------
+// CAppInfo::CPkgInfo
+// C++ constructor
+// -----------------------------------------------------------------------------
+CPkgInfo::CPkgInfo(Java::CJavaRegistry* aJavaReg):iJavaReg(aJavaReg)
+	{
+		
+	}
+
+// -----------------------------------------------------------------------------
+// CAppInfo::ConstructL
+// Two-Phase constructor
+// -----------------------------------------------------------------------------
+void CPkgInfo::ConstructL()
+	{
+	iKeyArray =  new(ELeave) CDesC8ArraySeg( KArrayGranularity );
+	//Inserting the Keys
+	iKeyArray->AppendL(KPkgName);
+	iKeyArray->AppendL(KUid);
+	iKeyArray->AppendL(KVersion);
+	iKeyArray->AppendL(KVendor);
+	iKeyArray->AppendL(KDrive);
+	
+	for(TInt index = 0 ; index < iKeyArray->Count() ;index++)
+		{
+		iKeyValArray.AppendL(NULL);
+		}
+	
+	}
+
+// -----------------------------------------------------------------------------
+// CAppInfo::~CPkgInfo
+// Destructor
+// -----------------------------------------------------------------------------
+CPkgInfo::~CPkgInfo()
+	{
+	
+	if(iKeyArray)
+		{
+		iKeyArray->Reset();
+		delete 	iKeyArray;
+		}	
+
+	iKeyValArray.ResetAndDestroy();
+
+	iSisRegEntry.Close();
+
+	if(iJavaRegEntry)	
+		{
+		delete iJavaRegEntry;	
+		}
+
+	iSisRegSession = NULL;
+
+	iJavaReg = NULL; 
+	}
+
+
+// -----------------------------------------------------------------------------
+// CAppInfo::AtL 
+// This function gives the key value at a given index
+// -----------------------------------------------------------------------------
+TBool  CPkgInfo::AtL(TInt aIndex, TDes8& aKeyVal)	 
+	{
+
+	 if(0<= aIndex < iKeyArray->Count() )
+		 {
+		 aKeyVal.Copy((*iKeyArray)[aIndex]);
+		 return ETrue;	
+		 }
+	 else
+		 {
+		 return EFalse;	
+		 }
+	}
+
+// -----------------------------------------------------------------------------
+// CAppInfo::Count 
+// This function gives the number of keys
+// -----------------------------------------------------------------------------
+TInt CPkgInfo::Count()	const
+	{
+	return iKeyArray->Count();
+	}
+
+// -----------------------------------------------------------------------------
+// CAppInfo::SetEntryL 
+// This function sets the appropriate entry as per uid 
+// -----------------------------------------------------------------------------
+void CPkgInfo::SetEntryL(TUid aUid,TBool& aErrflg) 
+	{
+    
+    //It will accept the UID and also validate (i.e if that application currently prsent or not)
+	if( iJavaReg )
+		{
+		iJavaRegEntry = iJavaReg->RegistryEntryL(aUid);
+	
+		if( iJavaRegEntry )
+			{
+						
+		    if( (Java::EGeneralPackage <= iJavaRegEntry->Type()) && (iJavaRegEntry->Type()< Java::EGeneralApplication) )		
+		       aErrflg = ETrue;
+		    else
+		       aErrflg = EFalse;		
+		
+			  if(aErrflg == EFalse)
+			    {
+			    delete iJavaRegEntry ;
+			    iJavaRegEntry = NULL ;				
+				  }
+			}
+		else
+			{
+			aErrflg = EFalse;
+			}	
+		}
+	else 
+		{
+
+		User::LeaveIfError(iSisRegEntry.Open(*iSisRegSession,aUid));
+
+		aErrflg = (iSisRegEntry.IsPresentL() && !iSisRegEntry.IsInRomL());
+		if( aErrflg == EFalse )
+			{
+			iSisRegEntry.Close();				 	
+			}
+			 
+		}
+		
+	}
+		
+
+// -----------------------------------------------------------------------------
+// CAppInfo::FindL 
+// This function finds the value as per key given in argument.
+// -----------------------------------------------------------------------------
+ TBool  CPkgInfo::FindL(const TDesC8& aKey, TPtrC& aVal)
+	{
+	TBool retValue = EFalse;
+	if(iJavaReg)
+		{
+		retValue = GetJavaInfoL(aKey,aVal);	
+	
+		} // for iJavaRegEntry
+	else 
+		{
+		
+		retValue = GetSisxInfoL(aKey,aVal);
+	}
+	return retValue;
+	}
+	
+// -----------------------------------------------------------------------------
+// CPkgInfo::GetJavaInfo 
+// Gives the value as per key input for java installed packages
+// -----------------------------------------------------------------------------
+TBool CPkgInfo::GetJavaInfoL(const TDesC8& aKey, TPtrC& aVal)	
+	{
+	TBool retVal = ETrue;
+	TInt index = -1 ;
+	
+	if(aKey.CompareF(KPkgName)==KErrNone)
+		{
+		
+		iKeyArray->Find(KPkgName,index);
+		
+		if(index >= 0)
+			{
+			if(NULL == iKeyValArray[index] ) 
+				{
+				// create heap object 
+				HBufC* keyval = HBufC::NewL(iJavaRegEntry->Name().Length());
+				
+				TPtr val(keyval->Des());
+				
+				val.Append(iJavaRegEntry->Name());
+			
+				iKeyValArray[index] = keyval; 
+			
+				}
+
+			aVal.Set(*iKeyValArray[index]); // Seting the TPtrC with the keyval in array
+
+			}
+		
+		}
+	else if(aKey.CompareF(KUid) == KErrNone)
+		{		
+
+		iKeyArray->Find(KUid,index);
+		
+		if(index >= 0)
+			{
+			if(NULL == iKeyValArray[index]) 
+				{
+				// Taking buffer for manipulation
+
+				HBufC* keyval = HBufC::NewL(KUidLength);
+				
+				TPtr val(keyval->Des());
+				val.Append(KHEXAdd);
+				val.AppendNum(iJavaRegEntry->Uid().iUid,EHex);
+
+				iKeyValArray[index] = keyval; 
+
+				}
+
+			aVal.Set(*iKeyValArray[index]); // Seting the TPtrC with the keyval in array
+				
+			}		
+		}
+	else if(aKey.CompareF(KVersion) == KErrNone)
+		{
+		
+		iKeyArray->Find(KVersion,index);
+		
+		if(index >= 0)
+			{
+			if(NULL == iKeyValArray[index]) 
+				{
+				// Taking buffer for manipulation
+
+				HBufC* keyval = HBufC::NewL(KVersionLength);
+				TAppVersion ver = ((Java::CJavaRegistryPackageEntry*)iJavaRegEntry)->Version();
+				
+				TPtr val(keyval->Des());
+				
+				val.AppendNum(ver.iMajor);
+				val.Append(KSEPERATOR);
+				val.AppendNum(ver.iMinor);
+				
+				iKeyValArray[index] = keyval; 
+
+				}
+
+			aVal.Set(*iKeyValArray[index]); // Seting the TPtrC with the keyval in array
+				
+			}
+
+		}
+	else if(aKey.CompareF(KVendor) == KErrNone)
+		{
+
+		iKeyArray->Find(KVendor,index);
+	
+		if(index >= 0)	
+			{
+			if(NULL == iKeyValArray[index]) 
+				{
+				// Taking buffer for manipulation
+				HBufC* keyval = HBufC::NewL(((Java::CJavaRegistryPackageEntry*)iJavaRegEntry)->Vendor().Length());
+				
+				TPtr val(keyval->Des());
+				
+				val.Append(((Java::CJavaRegistryPackageEntry*)iJavaRegEntry)->Vendor());
+				
+				iKeyValArray[index] = keyval; 
+
+				}
+
+			aVal.Set(*iKeyValArray[index]); // Seting the TPtrC with the keyval in array
+				
+			}
+		}
+	else if(aKey.CompareF(KDrive) == KErrNone)
+		{
+
+		iKeyArray->Find(KDrive,index);
+
+		if(index >= 0)
+			{
+			if(NULL == iKeyValArray[index]) // chk the condition depend on how we initialise the array in constructor
+				{
+		
+				HBufC* keyval = HBufC::NewL(KdriveLen);
+				TPtr val(keyval->Des());
+				
+				
+				TInt x = iJavaRegEntry->Drive();
+				
+				if(KDeriveE == x)
+					{
+					val.Append(KEDRIVE);	
+					
+					}
+				else
+					{
+					val.Append(KCDRIVE);
+					
+					}
+		
+				iKeyValArray[index] = keyval; 
+				}
+
+			aVal.Set(*iKeyValArray[index]); // Seting the TPtrC with the keyval in array
+				
+			}
+
+		}
+	else
+		{
+
+		retVal = EFalse;
+			
+		}	
+
+	return retVal; 
+	
+	}
+	
+// -----------------------------------------------------------------------------
+// CPkgInfo::GetSisxInfo
+// Gives the value as per key input for S60(Sisx) installed packages
+// -----------------------------------------------------------------------------
+TBool CPkgInfo::GetSisxInfoL(const TDesC8& aKey, TPtrC& aVal)	
+	{
+	TBool retVal= ETrue;
+	TInt index = -1;
+
+
+	if(aKey.CompareF(KPkgName)==KErrNone)
+		{
+
+		iKeyArray->Find(KPkgName,index);		
+		
+		if(index >= 0)
+			{
+			if(NULL == iKeyValArray[index]) 
+				{
+               			    
+			  HBufC* keyval = iSisRegEntry.PackageNameL();
+			                           
+				iKeyValArray[index] = keyval; 
+				
+				}
+			
+			aVal.Set(*iKeyValArray[index]);
+				
+			}
+		
+		}
+	else if(aKey.CompareF(KUid) == KErrNone)
+		{
+
+		iKeyArray->Find(KUid,index);		
+		
+		if(index >= 0)
+			{
+			if(NULL == iKeyValArray[index]) 
+				{
+
+				HBufC* keyval = HBufC::NewL(KUidLength);
+
+				TPtr val(keyval->Des());
+
+				val.Append(KHEXAdd);
+				val.AppendNum(iSisRegEntry.UidL().iUid,EHex);			
+				
+				iKeyValArray[index] = keyval; 		
+				
+				}
+			
+			aVal.Set(*iKeyValArray[index]);
+				
+			}
+
+		}
+	else if(aKey.CompareF(KVersion) == KErrNone)
+		{
+
+		iKeyArray->Find(KVersion,index);		
+		
+		if(index >= 0)
+			{
+			if(NULL == iKeyValArray[index]) 
+				{
+
+				HBufC* keyval = HBufC::NewL(KVersionLength);
+
+				TVersion ver = iSisRegEntry.VersionL();
+				
+				TPtr val(keyval->Des());
+
+				val.Num(ver.iMajor);
+
+				val.Append(KSEPERATOR);
+
+				val.AppendNum(ver.iMinor);
+				
+				iKeyValArray[index] = keyval; 		
+				
+				}
+			
+			aVal.Set(*iKeyValArray[index]);
+				
+			}
+
+		}
+	else if(aKey.CompareF(KVendor) == KErrNone)	
+		{
+
+		iKeyArray->Find(KVendor,index);		
+		
+		if(index >= 0)
+			{
+			if(NULL == iKeyValArray[index]) 
+				{
+				
+				HBufC* keyval = iSisRegEntry.UniqueVendorNameL();
+				
+				iKeyValArray[index] = keyval; 
+				
+				}
+			
+			aVal.Set(*iKeyValArray[index]);
+				
+			}
+
+		}
+	else if(aKey.CompareF(KDrive) == KErrNone)
+		{
+	
+		iKeyArray->Find(KDrive,index);		
+
+		if(index >= 0)
+			{
+			if(NULL == iKeyValArray[index]) 
+				{
+
+				HBufC* keyval = HBufC::NewL(KdriveLen);
+				TPtr val(keyval->Des());
+
+				if( iSisRegEntry.SelectedDriveL() == 'c' || iSisRegEntry.SelectedDriveL() == 'C' )
+					{
+					val.Append(KCDRIVE);
+					}
+				else 
+					{
+					RPointerArray<HBufC> files ;
+					iSisRegEntry.FilesL(files);
+					// Check the disk from files
+					// if all have C, the software is installed to phone
+					// else it is installed to memory card
+					TInt count = files.Count();
+
+					TInt allFilesInCZ = 0;
+					for ( TInt index = 0; index < count; index++ )
+						{
+						TPtrC firstChar = files[index]->Des().Left(1);
+						// Note here find the contents of file and see what we can get
+
+
+						if ( ( firstChar.Compare( KDriveC ) == KErrNone ) || 
+						     ( firstChar.Compare( KDrivec ) == KErrNone ) ||
+						     ( firstChar.Compare( KDrivez ) == KErrNone ) ||
+						     ( firstChar.Compare( KDriveZ ) == KErrNone ) )
+							    {
+							    allFilesInCZ++;
+							    }    		    
+						}  // for
+
+					if ( allFilesInCZ == count )
+						{
+						// Phone memory
+						val.Append(KCDRIVE);		   
+
+						}
+					else
+						{
+						// Memory card
+						val.Append(KEDRIVE);		
+						}
+					files.ResetAndDestroy();
+					}
+				
+				iKeyValArray[index] = keyval; 	
+				
+				}
+
+			aVal.Set(*iKeyValArray[index]);
+				
+			}
+
+		}
+	else
+		{
+
+		retVal = EFalse;				
+		}	
+			
+	return retVal;	
+
+		
+	}
+	
+	
+
+
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+