//static TUint32 WidgetUnzipUtilityS60::uncompressedSizeL(const QString& aZipFileName, const TChar& aDriveLetter) { RFs fs; User::LeaveIfError(fs.Connect()); // not possible to continue without RFs CleanupClosePushL(fs); TUint64 uncompressedSize(0); TInt allocUnitSize(8192); // use 8kb cluster size when no information is available TInt drive(0); TInt err = fs.CharToDrive(aDriveLetter, drive); // get cluster size to calculate uncompressed widget size more accurately if (!err) { TVolumeIOParamInfo ioInfo; err = fs.VolumeIOParam(drive, ioInfo); // VolumeIOParam.iClusterSize contains also possible error code if (!err && ioInfo.iClusterSize > 0) { allocUnitSize = ioInfo.iClusterSize; } } QString zipFileName = QDir::toNativeSeparators(aZipFileName); TPtrC16 zName(reinterpret_cast<const TUint16*>(zipFileName.utf16())); CZipFile *zipfile = CZipFile::NewL(fs, zName); CleanupStack::PushL(zipfile); CZipFileMemberIterator *members = zipfile->GetMembersL(); CleanupStack::PushL(members); CZipFileMember* member = members->NextL(); while (member != NULL) { TUint32 fileSize(member->UncompressedSize()); if(fileSize != UINT_MAX) fileSize = (fileSize + (allocUnitSize - (fileSize % allocUnitSize))); uncompressedSize += fileSize; delete member; member = members->NextL(); } CleanupStack::PopAndDestroy(3); // members, zipfile, fs.connect if(uncompressedSize > UINT_MAX) return UINT_MAX; return (TUint32)uncompressedSize; }
// static QString WidgetUnzipUtilityS60::fileContentsL(const QString& aZipFileName, const QString& aFileName, const Qt::CaseSensitivity& cs) { QString zipFileName = QDir::toNativeSeparators(aZipFileName); QString contents; TPtrC16 zName(reinterpret_cast<const TUint16*>(zipFileName.utf16())); RFs iFs; User::LeaveIfError(iFs.Connect()); CZipFile *zipfile = CZipFile::NewL(iFs, zName); CleanupStack::PushL(zipfile); CZipFileMemberIterator *members = zipfile->GetMembersL(); CZipFileMember* member; while ((member = members->NextL()) != 0) { QString filename = QString::fromUtf16(member->Name()->Ptr(), member->Name()->Length()); // If the member is the desired file, extract it if (!filename.compare(aFileName, cs)) { RZipFileMemberReaderStream *stream; zipfile->GetInputStreamL(member, stream); CleanupStack::PushL(stream); HBufC8 *buffer = HBufC8::NewLC(member->UncompressedSize()); TPtr8 bufferPtr(buffer->Des()); User::LeaveIfError(stream->Read(bufferPtr, member->UncompressedSize())); QByteArray data(reinterpret_cast<const char*>(buffer->Ptr()), buffer->Length()); QString ret(data); CleanupStack::PopAndDestroy(3); // zipfile, stream, buffer return ret; } } CleanupStack::PopAndDestroy(); return contents; }
void PosLmUnzipUtil::UnzipFileL(RFs& aFs, TFileName* aFileName) { CZipFile* zipFile = NULL; CZipFileMember* member = NULL; CZipFileMemberIterator* fileMembers = NULL; zipFile = CZipFile::NewL(aFs,*aFileName); CleanupStack::PushL(zipFile); User::LeaveIfError(zipFile->OpenL()); fileMembers = zipFile->GetMembersL(); CleanupStack::PushL(fileMembers); member = fileMembers->NextL(); while (member) { //You must take ownership of the member object created for you by NextL()! CleanupStack::PushL(member); ExtractFileL(aFs, member, zipFile, aFileName); CleanupStack::PopAndDestroy(); //member member = fileMembers->NextL(); } zipFile->Close(); CleanupStack::PopAndDestroy(2); //fileMembers, zipFile }