diff -r c742e1129640 -r aa33c2cb9a50 applicationmanagement/server/src/AMPreInstallApp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applicationmanagement/server/src/AMPreInstallApp.cpp Tue Jul 06 14:06:19 2010 +0300 @@ -0,0 +1,301 @@ +/* + * Copyright (c) 2000 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: Implementation of applicationmanagement components + * + */ + + +#include +#include +#include //for KMaxDataTypeLength +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AMPreInstallApp.h" +#include "debug.h" + +using namespace NApplicationManagement; +CAMPreInstallApp* CAMPreInstallApp::NewL() + { + CAMPreInstallApp* self = CAMPreInstallApp::NewLC(); + CleanupStack::Pop(self); + return self; + + } + + +CAMPreInstallApp* CAMPreInstallApp::NewLC() + { + CAMPreInstallApp *self = new (ELeave) CAMPreInstallApp(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + + } +CAMPreInstallApp::CAMPreInstallApp() + { + } +CAMPreInstallApp::~CAMPreInstallApp() + { + delete iStorage; + iFs.Close(); + #ifdef RD_MULTIPLE_DRIVE + delete iInstallDocPathArray; + #endif + iPreInstalledAppParams.ResetAndDestroy(); + } +void CAMPreInstallApp::ConstructL() + { + iStorage = CDeliveryComponentStorage::NewL(); + User::LeaveIfError(iFs.Connect() ); + TPtrC mmcDrive(TParsePtrC( PathInfo::MemoryCardRootPath() ).Drive()); + iPreInstallPath.Append(mmcDrive); + iPreInstallPath.Append(KPreInstallPath); + } +void CAMPreInstallApp::GetPreInstalledAppsL(RPointerArray< + TPreInstalledAppParams> &aPreInstalledAppParams) + { + + MakeAllInstallPathsL(); + ListPreInstalledAppL(); + aPreInstalledAppParams = iPreInstalledAppParams; + } + + +void CAMPreInstallApp::ListPreInstalledAppL(const TDesC& installDocPath) + { + + RDEBUG("Clist_PreInstallAppUi: ListPreInstalledApp: <<<<"); + CDir* dir= NULL; + TInt err = iFs.GetDir(installDocPath, KEntryAttNormal, ESortByName, dir); + // _LIT(KInstallpath,"C:\\private\\10202dce\\"); + //TInt err = iFs.GetDir(KInstallpath, KEntryAttNormal, ESortByName, dir); + RDEBUG_2("Clist_PreInstallAppUi: ListPreInstalledApp: err in getting dir list : %d",err); + + if (err==KErrNone) + { + CleanupStack::PushL(dir); + RDEBUG_2("Clist_PreInstallAppUi: ListPreInstalledApp: no of dir's : %d",dir->Count()); + for (TInt i(0); i < dir->Count(); i++) + { + + RDEBUG_2("Clist_PreInstallAppUi: ListPreInstalledApp: <<<< dir entry %d", i); + TEntry entry; + entry = (*dir)[i]; + HBufC* pathAndName = HBufC::NewLC(installDocPath.Length() + + entry.iName.Length() ); + TPtr ptrPathAndName = pathAndName->Des(); + ptrPathAndName.Append(installDocPath); + ptrPathAndName.Append(entry.iName); + + HBufC* mimeType = HBufC::NewLC(KMaxDataTypeLength); + //Recognize + if (!RecognizeL(*pathAndName, mimeType)) + { + CleanupStack::PopAndDestroy(mimeType); + CleanupStack::PopAndDestroy(pathAndName); + continue; + } + +#ifdef RD_MULTIPLE_DRIVE + if (TParsePtrC(installDocPath).Path().CompareF(KPreInstallPath) + == 0) +#else + if (installDocPath.CompareF(iPreInstallPath) == 0) +#endif + { + + RDEBUG("Clist_PreInstallAppUi: ListPreInstalledApp: <<<< Entered installDocPath.CompareF(iPreInstallPath)"); + Swi::RSisRegistrySession regSession; + CleanupClosePushL(regSession); + User::LeaveIfError(regSession.Connect() ); + + RArray uids; + CleanupClosePushL(uids); + + regSession.InstalledUidsL(uids); + + RFile temp; + User::LeaveIfError(temp.Open(iFs, *pathAndName, + EFileShareReadersOnly | EFileRead) ); + CleanupClosePushL(temp); + + TUid appUid; + TInt uidLen = sizeof(TInt32); + TInt seekLen = sizeof(TInt32) + sizeof(TInt32); + + User::LeaveIfError(temp.Seek(ESeekStart, seekLen)); + + TPckg uid1(appUid.iUid); + User::LeaveIfError(temp.Read(uid1, uidLen)); + if (uid1.Length() != uidLen) + { + User::Leave(KErrUnderflow); + } + + //checking whether this is installed or not + TBool installed = regSession.IsInstalledL(appUid); + Swi::RSisRegistryEntry registryEntry; + TInt regEntryError = registryEntry.Open(regSession, appUid); + RDEBUG_2("Clist_PreInstallAppUi: ListPreInstalledApp: RegEntryError : %d",regEntryError); + + //User::LeaveIfError(regEntryError); + if (regEntryError == KErrNone) + { + CleanupClosePushL(registryEntry); + TBool isPreInstalled = registryEntry.PreInstalledL(); + // TBool isPreInstalled = ETrue; + + RDEBUG_4("Clist_PreInstallAppUi: ListPreInstalledApp: UID is : '0x%X', installed:, preinstalled %d %d",appUid,installed,isPreInstalled); + + for (TInt i(0); isPreInstalled && i < uids.Count(); i++) + { + if (appUid == uids[i]) + { + + RDEBUG("Clist_PreInstallAppUi: appUid == uids[i]"); + Swi::CSisRegistryPackage* sisRegistry = NULL; + TRAPD( err, sisRegistry = regSession.SidToPackageL( uids[i] ) ) ; + //User::LeaveIfError(err); + if(err == KErrNone) + { + + RDEBUG("Clist_PreInstallAppUi: err == KErrNone"); + TPreInstalledAppParams *params = + new (ELeave) TPreInstalledAppParams; + params->iPreInstalledAppame.Copy(sisRegistry->Name()); + params->iPreInstalledAppVendorName.Copy( + sisRegistry->Vendor()); + params->iPreInstalledAppUid = sisRegistry->Uid(); + params->iMimeType.Copy(*mimeType); + //Get version + TVersion version = registryEntry.VersionL(); + TBuf8 pkgDes; + pkgDes.AppendNum(version.iMajor); + pkgDes.Append(KLiteralPeriod); + pkgDes.AppendNum(version.iMinor); + params->iVersion.Copy(pkgDes); + + iPreInstalledAppParams.Append(params); + + RDEBUG_2("Clist_PreInstallAppUi: ListPreInstalledApp: Installed App UID is : '0x%X'",appUid); + RDEBUG_2("Clist_PreInstallAppUi: ListPreInstalledApp: Installed App Name is: %S",&(sisRegistry->Name())); + RDEBUG_2("Clist_PreInstallAppUi: ListPreInstalledApp: Installed App Vendor is: %S",&(sisRegistry->Vendor())); + RDEBUG_2("Clist_PreInstallAppUi: ListPreInstalledApp: Installed App UID is : '0x%X'",sisRegistry->Uid()); + delete sisRegistry; + } + continue; + } + } + + CleanupStack::PopAndDestroy(®istryEntry); + } + CleanupStack::PopAndDestroy(&temp); + CleanupStack::PopAndDestroy(&uids); + CleanupStack::PopAndDestroy(®Session); + CleanupStack::PopAndDestroy(mimeType); + CleanupStack::PopAndDestroy(pathAndName); + } + } + CleanupStack::PopAndDestroy(dir); + } + } +void CAMPreInstallApp::ListPreInstalledAppL() + { + iPreInstalledAppParams.Reset(); +#ifdef RD_MULTIPLE_DRIVE + TInt count = iInstallDocPathArray->Count(); + for ( TInt index(0); index < count; index++ ) + { + if ( (*iInstallDocPathArray)[index].Length()> 0 ) + { + ListPreInstalledAppL( (*iInstallDocPathArray)[index] ); + } + } +#else + if (iPreInstallDocumentPath.Length() > 0) + { + ListPreInstalledAppL(iPreInstallDocumentPath); + //_LIT(KInstallpath,"C:\\private\\10202dce\\"); + //ListPreInstalledAppL(KInstallpath); + } +#endif + + } + +TBool CAMPreInstallApp::RecognizeL(TDesC& aPathAndName, HBufC* aMimeType) + { + TBool IsOK(ETrue); + ContentAccess::CContent* pkgContent = ContentAccess::CContent::NewLC( + aPathAndName, ContentAccess::EContentShareReadWrite); + + TPtr mimePtr(aMimeType->Des()); + pkgContent->GetStringAttribute(ContentAccess::EMimeType, mimePtr); + + HBufC8* tmpMime8 = HBufC8::NewLC(aMimeType->Length()); + tmpMime8->Des().Copy(*aMimeType); + TPtr8 mimePtr8(tmpMime8->Des()); + + if ((mimePtr8 != SwiUI::KSisxMimeType) && (mimePtr8 + != SwiUI::KSisMimeType) && (mimePtr8 != SwiUI::KPipMimeType)) + { + IsOK = EFalse; + } + CleanupStack::PopAndDestroy(tmpMime8); + CleanupStack::PopAndDestroy(pkgContent); + return IsOK; + + } +void CAMPreInstallApp::MakeAllInstallPathsL() + { +#ifdef RD_MULTIPLE_DRIVE + iInstallDocPathArray = new (ELeave) CDesCArrayFlat( 2 ); + TDriveList driveList; + TInt driveCount = 0; + //User::LeaveIfError(iFs.Connect() ); + User::LeaveIfError( DriveInfo::GetUserVisibleDrives(iFs, driveList,driveCount)); + TUint driveStatus = 0; + for (TInt index(0); index < KMaxDrives; index++) + { + if (driveList[index]) + { + User::LeaveIfError( DriveInfo::GetDriveStatus(iFs, index, + driveStatus)); + TFileName path; + TDriveUnit driveUnit(index); + if ( !(driveStatus & DriveInfo::EDriveRemote )) + { + if (driveStatus & DriveInfo::EDriveRemovable) + { + path.Zero(); + path.Append(driveUnit.Name() ); + path.Append(KPreInstallPath); + iInstallDocPathArray->AppendL(path); + } + } + } + } + //iFs.Close(); +#else + TPtrC mmcDrive(TParsePtrC( PathInfo::MemoryCardRootPath() ).Drive()); + iPreInstallDocumentPath.Append(mmcDrive); + iPreInstallDocumentPath.Append(KPreInstallPath); +#endif //RD_MULTIPLE_DRIVE + }