diff -r 127731b7107d -r 3eebb1e54d3a installationservices/swi/source/sisregistry/server_legacy/sisregistryserversession.cpp --- a/installationservices/swi/source/sisregistry/server_legacy/sisregistryserversession.cpp Fri Jan 22 09:56:12 2010 +0200 +++ b/installationservices/swi/source/sisregistry/server_legacy/sisregistryserversession.cpp Tue Jan 26 12:06:03 2010 +0200 @@ -326,7 +326,10 @@ break; case EGetMatchingSupportedLanguages: RequestMatchingSupportedLanguagesL(aMessage); - break; + break; + case ERegistryFiles: + RequestInternalRegistryFilesL(aMessage); + break; default: PanicClient(aMessage,EPanicIllegalFunction); break; @@ -1896,7 +1899,7 @@ if (aMessage.GetDesMaxLengthL(aIpcIndx) < buffer->Size()) { - TInt bufferSize = buffer->Size(); + TInt bufferSize = buffer->Size(); TPckgC bufferSizePackage(bufferSize); aMessage.WriteL(aIpcIndx, bufferSizePackage); aMessage.Complete(KErrOverflow); @@ -2090,14 +2093,14 @@ } void CSisRegistrySession::RequestRemovablePackagesL(const RMessage2& aMessage) - { + { RPointerArray packages; CleanupResetAndDestroy >::PushL(packages); Server().Cache().RemovablePackageListL(packages); SendDataPointerArrayL(aMessage, packages, EIpcArgument0); CleanupStack::PopAndDestroy(&packages); - } - + } + void CSisRegistrySession::IsRemovableL(const RMessage2& aMessage) { CSisRegistryObject& object = Server().Cache().EntryObjectL(aMessage.Int3()); @@ -2172,3 +2175,83 @@ RArray& supportedLanguageIds = object.GetSupportedLanguageIdsArray(); SendDataArrayL(aMessage, supportedLanguageIds, EIpcArgument0); } + +void CSisRegistrySession::RequestInternalRegistryFilesL(const RMessage2& aMessage) + { + DEBUG_PRINTF(_L8("Sis Registry Server - Generate the list of registry files")); + + TEntry entry; + TInt err = 0; + RPointerArray files; + CleanupResetAndDestroyPushL(files); + + // Get the registry object for the package + CSisRegistryObject& regObject = Server().Cache().EntryObjectL(aMessage.Int3()); + + // Form the corresponding registry file name + HBufC* regFilename = SisRegistryUtil::BuildEntryFileNameLC(regObject.Uid(), regObject.Index()); + DEBUG_PRINTF3(_L("Sis Registry Server - Reg file not to be removed : %S : %d"), regFilename, regFilename->Length()); + // Check if the registry file is present on the device + err = iFs.Entry(*regFilename, entry); + if (err==KErrNone) + { + files.AppendL(regFilename); + CleanupStack::Pop(regFilename); + } + else + { + CleanupStack::PopAndDestroy(regFilename); + } + + const RPointerArray& regControllerInfo = regObject.ControllerInfo(); + TInt ctlCount = regControllerInfo.Count(); + for (TInt j = 0; j < ctlCount; j++) + { + // Form the ctl file name for the index + HBufC* ctlFilename = SisRegistryUtil::BuildControllerFileNameLC(regObject.Uid(), regObject.Index(), regControllerInfo[j]->Offset()); + DEBUG_PRINTF3(_L("Sis Registry Server - Ctl file not to be removed : %S : %d"), ctlFilename, ctlFilename->Length()); + // Check if the ctl file is present + err = iFs.Entry(*ctlFilename, entry); + if (err==KErrNone) + { + files.AppendL(ctlFilename); + CleanupStack::Pop(ctlFilename); + } + else + { + CleanupStack::PopAndDestroy(ctlFilename); + } + } + + _LIT(KSysBinPath, "\\sys\\bin\\"); + _LIT(KSysHashPath, ":\\sys\\hash\\"); + const RPointerArray& fileDescriptions = regObject.FileDescriptions(); + TInt fileCount = fileDescriptions.Count(); + for (TInt k = 0; k < fileCount; k++) + { + const TDesC& targetPath = fileDescriptions[k]->Target(); + // Check if the target is a binary file + if (KErrNotFound != targetPath.FindF(KSysBinPath)) + { + // Create the hash file name for the binary + TFileName targetHashPath; + targetHashPath.Append(RFs::GetSystemDriveChar()); + targetHashPath.Append(KSysHashPath); + targetHashPath.Append(TParsePtrC(targetPath).NameAndExt()); + DEBUG_PRINTF3(_L("Sis Registry Server - Hash file not to be removed : %S : %d"), &targetHashPath, targetHashPath.Length()); + + // Check if the hash file is present + err = iFs.Entry(targetHashPath, entry); + if (err==KErrNone) + { + HBufC* hashPtr = targetHashPath.AllocLC(); + files.AppendL(hashPtr); + CleanupStack::Pop(hashPtr); + } + } + } + + SendDataPointerArrayL(aMessage, files, EIpcArgument0); + + CleanupStack::PopAndDestroy(&files); + }