UInt64 C7ZipArchiveItemImpl::GetSize() const { // Get uncompressed size NWindows::NCOM::CPropVariant prop; if (m_pInArchive->GetProperty(m_nIndex, kpidSize, &prop) != 0) return 0; UInt64 size = 0; if (prop.vt == VT_UI8 || prop.vt == VT_UI4) size = ConvertPropVariantToUInt64(prop); return size; }
bool C7ZipArchiveItemImpl::GetUInt64Property(lib7zip::PropertyIndexEnum propertyIndex, unsigned __int64 & val) const { int p7zip_index = 0; switch(propertyIndex) { case lib7zip::kpidSize: p7zip_index = kpidSize; break; case lib7zip::kpidPackSize: //(Packed Size) p7zip_index = kpidPackSize; break; case lib7zip::kpidAttrib: //(Attributes) p7zip_index = kpidAttrib; break; case lib7zip::kpidPhySize: //(Physical Size) p7zip_index = kpidPhySize; break; case lib7zip::kpidHeadersSize: //(Headers Size) p7zip_index = kpidHeadersSize; break; case lib7zip::kpidChecksum: //(Checksum) p7zip_index = kpidChecksum; break; case lib7zip::kpidTotalSize: //(Total Size) p7zip_index = kpidTotalSize; break; case lib7zip::kpidFreeSpace: //(Free Space) p7zip_index = kpidFreeSpace; break; case lib7zip::kpidClusterSize: //(Cluster Size) p7zip_index = kpidClusterSize; break; default: return false; } NWindows::NCOM::CPropVariant prop; if (m_pInArchive->GetProperty(m_nIndex, p7zip_index, &prop) != 0) return false; if (prop.vt == VT_UI8 || prop.vt == VT_UI4) { val = ConvertPropVariantToUInt64(prop); return true; } return false; }
STDMETHODIMP P7ZipArchiveExtractCallback::GetStream(UInt32 index, ISequentialOutStream **outStream, Int32 askExtractMode) { *outStream = 0; _outFileStream.Release(); { // Get Name NCOM::CPropVariant prop; RINOK(_archiveHandler->GetProperty(index, kpidPath, &prop)); UString fullPath; if (prop.vt == VT_EMPTY) fullPath = kEmptyFileAlias; else { if (prop.vt != VT_BSTR) return E_FAIL; fullPath = prop.bstrVal; } _filePath = fullPath; } if (askExtractMode != NArchive::NExtract::NAskMode::kExtract) return S_OK; { // Get Attrib NCOM::CPropVariant prop; RINOK(_archiveHandler->GetProperty(index, kpidAttrib, &prop)); if (prop.vt == VT_EMPTY) { _processedFileInfo.Attrib = 0; _processedFileInfo.AttribDefined = false; } else { if (prop.vt != VT_UI4) return E_FAIL; _processedFileInfo.Attrib = prop.ulVal; _processedFileInfo.AttribDefined = true; } } RINOK(IsArchiveItemFolder(_archiveHandler, index, _processedFileInfo.isDir)); { // Get Modified Time NCOM::CPropVariant prop; RINOK(_archiveHandler->GetProperty(index, kpidMTime, &prop)); _processedFileInfo.MTimeDefined = false; switch(prop.vt) { case VT_EMPTY: // _processedFileInfo.MTime = _utcMTimeDefault; break; case VT_FILETIME: _processedFileInfo.MTime = prop.filetime; _processedFileInfo.MTimeDefined = true; break; default: return E_FAIL; } } { // Get Size NCOM::CPropVariant prop; RINOK(_archiveHandler->GetProperty(index, kpidSize, &prop)); bool newFileSizeDefined = (prop.vt != VT_EMPTY); UInt64 newFileSize; if (newFileSizeDefined) newFileSize = ConvertPropVariantToUInt64(prop); } { // Create folders for file int slashPos = _filePath.ReverseFind(WCHAR_PATH_SEPARATOR); if (slashPos >= 0) NFile::NDirectory::CreateComplexDirectory(_directoryPath + _filePath.Left(slashPos)); } UString fullProcessedPath = _directoryPath + _filePath; _diskFilePath = fullProcessedPath; if (_processedFileInfo.isDir) { NFile::NDirectory::CreateComplexDirectory(fullProcessedPath); } else { NFile::NFind::CFileInfoW fi; if (fi.Find(fullProcessedPath)) { if (!NFile::NDirectory::DeleteFileAlways(fullProcessedPath)) { PrintString(UString(kCantDeleteOutputFile) + fullProcessedPath); return E_ABORT; } } _outFileStreamSpec = new COutFileStream; CMyComPtr<ISequentialOutStream> outStreamLoc(_outFileStreamSpec); if (!_outFileStreamSpec->Open(fullProcessedPath, CREATE_ALWAYS)) { PrintString((UString)L"can not open output file " + fullProcessedPath); return E_ABORT; } _outFileStream = outStreamLoc; *outStream = outStreamLoc.Detach(); } return S_OK; }