HRESULT CCodecs::LoadFormats() { const NDLL::CLibrary &lib = Libs.Back().Lib; GetHandlerPropertyFunc getProp = 0; GetHandlerPropertyFunc2 getProp2 = (GetHandlerPropertyFunc2) lib.GetProcAddress("GetHandlerProperty2"); if (getProp2 == NULL) { getProp = (GetHandlerPropertyFunc) lib.GetProcAddress("GetHandlerProperty"); if (getProp == NULL) return S_OK; } UInt32 numFormats = 1; GetNumberOfFormatsFunc getNumberOfFormats = (GetNumberOfFormatsFunc) lib.GetProcAddress("GetNumberOfFormats"); if (getNumberOfFormats != NULL) { RINOK(getNumberOfFormats(&numFormats)); } if (getProp2 == NULL) numFormats = 1; for(UInt32 i = 0; i < numFormats; i++) { CArcInfoEx item; item.LibIndex = Libs.Size() - 1; item.FormatIndex = i; RINOK(ReadStringProp(getProp, getProp2, i, NArchive::kName, item.Name)); NCOM::CPropVariant prop; if (ReadProp(getProp, getProp2, i, NArchive::kClassID, prop) != S_OK) continue; if (prop.vt != VT_BSTR) continue; item.ClassID = *(const GUID *)prop.bstrVal; prop.Clear(); UString ext, addExt; RINOK(ReadStringProp(getProp, getProp2, i, NArchive::kExtension, ext)); RINOK(ReadStringProp(getProp, getProp2, i, NArchive::kAddExtension, addExt)); item.AddExts(ext, addExt); ReadBoolProp(getProp, getProp2, i, NArchive::kUpdate, item.UpdateEnabled); if (item.UpdateEnabled) ReadBoolProp(getProp, getProp2, i, NArchive::kKeepName, item.KeepName); if (ReadProp(getProp, getProp2, i, NArchive::kStartSignature, prop) == S_OK) if (prop.vt == VT_BSTR) { UINT len = ::SysStringByteLen(prop.bstrVal); item.StartSignature.SetCapacity(len); memmove(item.StartSignature, prop.bstrVal, len); } Formats.Add(item); } return S_OK; }
STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) { COM_TRY_BEGIN NCOM::CPropVariant prop; const CSegment &item = _sections[index]; switch(propID) { case kpidPath: { wchar_t sz[32]; ConvertUInt64ToString(index, sz); prop = sz; break; } case kpidSize: prop = (UInt64)item.VSize; break; case kpidPackSize: prop = (UInt64)item.PSize; break; case kpidOffset: prop = item.Offset; break; case kpidVa: prop = item.Va; break; case kpidType: TYPE_TO_PROP(g_SegnmentTypes, item.Type, prop); break; case kpidCharacts: FLAGS_TO_PROP(g_SegmentFlags, item.Flags, prop); break; } prop.Detach(value); return S_OK; COM_TRY_END }
STDMETHODIMP CAltStreamsFolder::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) { NCOM::CPropVariant prop; { CAltStream &ss = Streams[index]; switch (propID) { case kpidIsDir: prop = false; break; case kpidIsAltStream: prop = true; break; case kpidName: prop = ss.Name; break; case kpidSize: prop = ss.Size; break; case kpidPackSize: #ifdef UNDER_CE prop = ss.Size; #else if (!ss.PackSize_Defined) { ss.PackSize_Defined = true; if (!NFsFolder::MyGetCompressedFileSizeW(_pathPrefix + us2fs(ss.Name), ss.PackSize)) ss.PackSize = ss.Size; } prop = ss.PackSize; #endif break; } } prop.Detach(value); return S_OK; }
IMP_IInArchive_Props IMP_IInArchive_ArcProps STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) { NCOM::CPropVariant prop; switch (propID) { case kpidPhySize: if (_packSize_Defined) prop = _packSize; break; case kpidNumStreams: if (_numStreams_Defined) prop = _numStreams; break; case kpidUnpackSize: if (_unpackSize_Defined) prop = _unpackSize; break; case kpidErrorFlags: { UInt32 v = 0; if (!_isArc) v |= kpv_ErrorFlags_IsNotArc;; if (_needMoreInput) v |= kpv_ErrorFlags_UnexpectedEnd; if (_dataAfterEnd) v |= kpv_ErrorFlags_DataAfterEnd; if (_unsupported) v |= kpv_ErrorFlags_UnsupportedMethod; if (_dataError) v |= kpv_ErrorFlags_DataError; prop = v; } } prop.Detach(value); return S_OK; }
STDMETHODIMP COpenArchiveCallback::GetProperty(PROPID propID, PROPVARIANT *value) { NCOM::CPropVariant prop; if (_subArchiveMode) { switch(propID) { case kpidName: prop = _subArchiveName; break; } } else { switch(propID) { case kpidName: prop = _fileInfo.Name; break; case kpidIsDir: prop = _fileInfo.IsDir(); break; case kpidSize: prop = _fileInfo.Size; break; case kpidAttrib: prop = (UInt32)_fileInfo.Attrib; break; case kpidCTime: prop = _fileInfo.CTime; break; case kpidATime: prop = _fileInfo.ATime; break; case kpidMTime: prop = _fileInfo.MTime; break; } } prop.Detach(value); return S_OK; }
STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) { COM_TRY_BEGIN NCOM::CPropVariant prop; if (_stream) { const CVolumeDescriptor &vol = _archive.VolDescs[_archive.MainVolDescIndex]; switch (propID) { case kpidComment: { AString s; ADD_STRING("System", SystemId); ADD_STRING("Volume", VolumeId); ADD_STRING("VolumeSet", VolumeSetId); ADD_STRING("Publisher", PublisherId); ADD_STRING("Preparer", DataPreparerId); ADD_STRING("Application", ApplicationId); ADD_STRING("Copyright", CopyrightFileId); ADD_STRING("Abstract", AbstractFileId); ADD_STRING("Bib", BibFileId); prop = s; break; } case kpidCTime: { FILETIME utc; if (vol.CTime.GetFileTime(utc)) prop = utc; break; } case kpidMTime: { FILETIME utc; if (vol.MTime.GetFileTime(utc)) prop = utc; break; } } } switch (propID) { case kpidPhySize: prop = _archive.PhySize; break; case kpidErrorFlags: { UInt32 v = 0; if (!_archive.IsArc) v |= kpv_ErrorFlags_IsNotArc; if (_archive.UnexpectedEnd) v |= kpv_ErrorFlags_UnexpectedEnd; if (_archive.HeadersError) v |= kpv_ErrorFlags_HeadersError; prop = v; break; } case kpidError: { AString s; if (_archive.IncorrectBigEndian) AddErrorMessage(s, "Incorrect big-endian headers"); if (_archive.SelfLinkedDirs) AddErrorMessage(s, "Self-linked directory"); if (_archive.TooDeepDirs) AddErrorMessage(s, "Too deep directory levels"); if (!s.IsEmpty()) prop = s; break; } } prop.Detach(value); return S_OK; COM_TRY_END }
STDMETHODIMP CHandler::GetRootProp(PROPID propID, PROPVARIANT *value) { // COM_TRY_BEGIN NCOM::CPropVariant prop; if (_db.Images.Size() != 0 && _db.NumExludededItems != 0) { const CImage &image = _db.Images[_db.IndexOfUserImage]; const CItem &item = _db.Items[image.StartItem]; if (!item.IsDir || item.ImageIndex != _db.IndexOfUserImage) return E_FAIL; const Byte *metadata = image.Meta + item.Offset; switch (propID) { case kpidIsDir: prop = true; break; case kpidAttrib: prop = (UInt32)Get32(metadata + 8); break; case kpidCTime: GetFileTime(metadata + (_db.IsOldVersion ? 0x18: 0x28), prop); break; case kpidATime: GetFileTime(metadata + (_db.IsOldVersion ? 0x20: 0x30), prop); break; case kpidMTime: GetFileTime(metadata + (_db.IsOldVersion ? 0x28: 0x38), prop); break; } } prop.Detach(value); return S_OK; // COM_TRY_END }
static bool ReadPluginInfo(CPluginInfo &pluginInfo, bool needCheckDll) { if (needCheckDll) { NDLL::CLibrary lib; if (!lib.LoadEx(pluginInfo.FilePath, LOAD_LIBRARY_AS_DATAFILE)) return false; } NDLL::CLibrary lib; if (!lib.Load(pluginInfo.FilePath)) return false; GetPluginPropertyFunc getPluginProperty = (GetPluginPropertyFunc)lib.GetProc("GetPluginProperty"); if (getPluginProperty == NULL) return false; NCOM::CPropVariant prop; if (getPluginProperty(NPlugin::kName, &prop) != S_OK) return false; if (prop.vt != VT_BSTR) return false; pluginInfo.Name = prop.bstrVal; prop.Clear(); if (getPluginProperty(NPlugin::kClassID, &prop) != S_OK) return false; if (prop.vt == VT_EMPTY) pluginInfo.ClassIDDefined = false; else if (prop.vt != VT_BSTR) return false; else { pluginInfo.ClassIDDefined = true; pluginInfo.ClassID = *(const GUID *)prop.bstrVal; } prop.Clear(); if (getPluginProperty(NPlugin::kOptionsClassID, &prop) != S_OK) return false; if (prop.vt == VT_EMPTY) pluginInfo.OptionsClassIDDefined = false; else if (prop.vt != VT_BSTR) return false; else { pluginInfo.OptionsClassIDDefined = true; pluginInfo.OptionsClassID = *(const GUID *)prop.bstrVal; } prop.Clear(); if (getPluginProperty(NPlugin::kType, &prop) != S_OK) return false; if (prop.vt == VT_EMPTY) pluginInfo.Type = kPluginTypeFF; else if (prop.vt == VT_UI4) pluginInfo.Type = (EPluginType)prop.ulVal; else return false; return true; }
STDMETHODIMP CRootFolder::GetProperty(UInt32 itemIndex, PROPID propID, PROPVARIANT *value) { NCOM::CPropVariant prop; switch(propID) { case kpidIsDir: prop = true; break; case kpidName: prop = _names[itemIndex]; break; } prop.Detach(value); return S_OK; }
STDMETHODIMP CPhysDriveFolder::GetItemFullSize(UInt32 index, PROPVARIANT *value, IProgress * /* progress */) { NCOM::CPropVariant prop; if (index >= 1) return E_INVALIDARG; UInt64 size = 0; HRESULT result = GetLength(size); prop = size; prop.Detach(value); return result; }
STDMETHODIMP CRootFolder::GetFolderProperty(PROPID propID, PROPVARIANT *value) { NCOM::CPropVariant prop; switch (propID) { case kpidType: prop = "RootFolder"; break; case kpidPath: prop = ""; break; } prop.Detach(value); return S_OK; }
STDMETHODIMP CFSFolder::GetItemFullSize(UInt32 index, PROPVARIANT *value, IProgress *progress) { NCOM::CPropVariant prop; if (index >= (UInt32)_refs.Size()) return E_INVALIDARG; UInt64 size = 0; HRESULT result = GetItemFullSize(index, size, progress); prop = size; prop.Detach(value); return result; }
IMP_IInArchive_Props IMP_IInArchive_ArcProps_NO_Table STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) { NCOM::CPropVariant prop; switch(propID) { case kpidPhySize: if (_packSizeDefined) prop = _packSize; break; } prop.Detach(value); return S_OK; }
STDMETHODIMP CArchiveUpdateCallback::GetRootProp(PROPID propID, PROPVARIANT *value) { NCOM::CPropVariant prop; switch (propID) { case kpidIsDir: prop = true; break; case kpidAttrib: if (ParentDirItem) prop = ParentDirItem->Attrib; break; case kpidCTime: if (ParentDirItem) prop = ParentDirItem->CTime; break; case kpidATime: if (ParentDirItem) prop = ParentDirItem->ATime; break; case kpidMTime: if (ParentDirItem) prop = ParentDirItem->MTime; break; } prop.Detach(value); return S_OK; }
STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value) { NCOM::CPropVariant prop; switch (propID) { case kpidPath: prop = _subName; break; case kpidSize: case kpidPackSize: prop = _totalSize; break; } prop.Detach(value); return S_OK; }
STDMETHODIMP CPhysDriveFolder::GetProperty(UInt32 itemIndex, PROPID propID, PROPVARIANT *value) { NCOM::CPropVariant prop; if (itemIndex >= 1) return E_INVALIDARG; switch(propID) { case kpidIsDir: prop = false; break; case kpidName: prop = _name; break; case kpidSize: prop = _length; break; } prop.Detach(value); return S_OK; }
IMP_IInArchive_Props IMP_IInArchive_ArcProps STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) { NCOM::CPropVariant prop; switch (propID) { case kpidMainSubfile: prop = (UInt32)0; break; case kpidPhySize: if (!_sizes.IsEmpty()) prop = _sizes[0]; break; case kpidTotalPhySize: prop = _totalSize; break; case kpidNumVolumes: prop = (UInt32)_streams.Size(); break; } prop.Detach(value); return S_OK; }
STDMETHODIMP CFSFolder::GetProperty(UInt32 itemIndex, PROPID propID, PROPVARIANT *value) { NCOM::CPropVariant prop; if (itemIndex >= (UInt32)_refs.Size()) return E_INVALIDARG; CDirItem &fi = *_refs[itemIndex]; switch(propID) { case kpidIsDir: prop = fi.IsDir(); break; case kpidName: prop = fi.Name; break; case kpidSize: if (!fi.IsDir()) prop = fi.Size; break; case kpidPackSize: #ifdef UNDER_CE prop = fi.Size; #else if (!fi.CompressedSizeIsDefined) { fi.CompressedSizeIsDefined = true; if (fi.IsDir () || !MyGetCompressedFileSizeW(_path + GetRelPath(fi), fi.CompressedSize)) fi.CompressedSize = fi.Size; } prop = fi.CompressedSize; #endif break; case kpidAttrib: prop = (UInt32)fi.Attrib; break; case kpidCTime: prop = fi.CTime; break; case kpidATime: prop = fi.ATime; break; case kpidMTime: prop = fi.MTime; break; case kpidComment: { LoadComments(); UString comment; if (_comments.GetValue(GetRelPath(fi), comment)) prop = comment; break; } case kpidPrefix: { if (_flatMode) prop = GetPrefix(fi); break; } } prop.Detach(value); return S_OK; }
STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) { COM_TRY_BEGIN NCOM::CPropVariant prop; const CSection &item = _sections[index]; switch(propID) { case kpidPath: StringToProp(GetName(_segments[item.SegmentIndex].Name) + GetName(item.Name), prop); break; case kpidSize: prop = (UInt64)item.Size; break; case kpidPackSize: prop = (UInt64)item.GetPackSize(); break; case kpidCharacts: StringToProp(SectFlagsToString(item.Flags), prop); break; case kpidOffset: prop = item.Pa; break; case kpidVa: prop = item.Va; break; } prop.Detach(value); return S_OK; COM_TRY_END }
STDMETHODIMP CNetFolder::GetProperty(UInt32 itemIndex, PROPID propID, PROPVARIANT *value) { NCOM::CPropVariant prop; const CResourceEx &item = _items[itemIndex]; switch(propID) { case kpidIsDir: prop = true; break; case kpidName: // if (item.RemoteNameIsDefined) prop = item.Name; break; case kpidLocalName: if (item.LocalNameIsDefined) prop = item.LocalName; break; case kpidComment: if (item.CommentIsDefined) prop = item.Comment; break; case kpidProvider: if (item.ProviderIsDefined) prop = item.Provider; break; } prop.Detach(value); return S_OK; }
STDMETHODIMP COpenCallbackImp::GetProperty(PROPID propID, PROPVARIANT *value) { COM_TRY_BEGIN NCOM::CPropVariant propVariant; if (_subArchiveMode) { switch(propID) { case kpidName: propVariant = _subArchiveName; break; } propVariant.Detach(value); return S_OK; } switch(propID) { case kpidName: propVariant = _fileInfo.getFileName(); break; case kpidIsFolder: propVariant = _fileInfo.IsDirectory(); break; case kpidSize: propVariant = _fileInfo.getSize(); break; case kpidAttributes: propVariant = (UInt32)_fileInfo.getAttributes(); break; case kpidLastAccessTime: propVariant = _fileInfo.getLastAccessTime(); break; case kpidCreationTime: propVariant = _fileInfo.getCreationTime(); break; case kpidLastWriteTime: propVariant = _fileInfo.getLastWriteTime(); break; } propVariant.Detach(value); return S_OK; COM_TRY_END }
STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) { COM_TRY_BEGIN NCOM::CPropVariant prop; switch(propID) { case kpidMethod: { UString resString; CRecordVector<UInt64> ids; int i; for (i = 0; i < _db.Folders.Size(); i++) { const CFolder &f = _db.Folders[i]; for (int j = f.Coders.Size() - 1; j >= 0; j--) ids.AddToUniqueSorted(f.Coders[j].MethodID); } for (i = 0; i < ids.Size(); i++) { UInt64 id = ids[i]; UString methodName; /* bool methodIsKnown = */ FindMethod(EXTERNAL_CODECS_VARS id, methodName); if (methodName.IsEmpty()) methodName = ConvertMethodIdToString(id); if (!resString.IsEmpty()) resString += L' '; resString += methodName; } prop = resString; break; } case kpidSolid: prop = _db.IsSolid(); break; case kpidNumBlocks: prop = (UInt32)_db.Folders.Size(); break; case kpidHeadersSize: prop = _db.HeadersSize; break; case kpidPhySize: prop = _db.PhySize; break; case kpidOffset: if (_db.ArchiveInfo.StartPosition != 0) prop = _db.ArchiveInfo.StartPosition; break; } prop.Detach(value); return S_OK; COM_TRY_END }
IMP_IInArchive_Props IMP_IInArchive_ArcProps STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) { COM_TRY_BEGIN NCOM::CPropVariant prop; switch(propID) { case kpidCpu: PAIR_TO_PROP(g_MachinePairs, _machine, prop); break; case kpidCharacts: TYPE_TO_PROP(g_FileTypes, _type, prop); break; case kpidPhySize: prop = _totalSize; break; case kpidHeadersSize: prop = _headersSize; break; case kpidBit64: if (_mode64) prop = _mode64; break; case kpidBigEndian: if (_be) prop = _be; break; } prop.Detach(value); return S_OK; COM_TRY_END }
STDMETHODIMP CFSDrives::GetProperty(UInt32 itemIndex, PROPID propID, PROPVARIANT *value) { if (itemIndex >= (UInt32)_drives.Size()) return E_INVALIDARG; NCOM::CPropVariant prop; const CDriveInfo &di = _drives[itemIndex]; switch(propID) { case kpidIsDir: prop = !_volumeMode; break; case kpidName: prop = di.Name; break; case kpidTotalSize: if (di.KnownSizes) prop = di.DriveSize; break; case kpidFreeSpace: if (di.KnownSizes) prop = di.FreeSpace; break; case kpidClusterSize: if (di.KnownSizes) prop = di.ClusterSize; break; case kpidType: if (di.DriveType < sizeof(kDriveTypes) / sizeof(kDriveTypes[0])) prop = kDriveTypes[di.DriveType]; break; case kpidVolumeName: prop = di.VolumeName; break; case kpidFileSystem: prop = di.FileSystemName; break; } prop.Detach(value); return S_OK; }
STDMETHODIMP CAgentFolder::GetProperty(UInt32 itemIndex, PROPID propID, PROPVARIANT *value) { NCOM::CPropVariant prop; const CProxyFolder *folder; UInt32 realIndex; if (_flatMode) { const CProxyItem &item = _items[itemIndex]; folder = item.Folder; realIndex = item.Index; } else { folder = _proxyFolderItem; realIndex = itemIndex; } if (realIndex < (UInt32)folder->Folders.Size()) { const CProxyFolder &item = folder->Folders[realIndex]; if (!_flatMode && propID == kpidSize) prop = item.Size; else if (!_flatMode && propID == kpidPackSize) prop = item.PackSize; else switch(propID) { case kpidIsDir: prop = true; break; case kpidNumSubDirs: prop = item.NumSubFolders; break; case kpidNumSubFiles: prop = item.NumSubFiles; break; case kpidName: prop = item.Name; break; case kpidCRC: { if (item.IsLeaf) { RINOK(_agentSpec->GetArchive()->GetProperty(item.Index, propID, value)); } if (item.CrcIsDefined && value->vt == VT_EMPTY) prop = item.Crc; break; } case kpidPrefix: GetPrefixIfAny(itemIndex, prop); break; default: if (item.IsLeaf) return _agentSpec->GetArchive()->GetProperty(item.Index, propID, value); } } else { realIndex -= folder->Folders.Size(); const CProxyFile &item = folder->Files[realIndex]; switch(propID) { case kpidIsDir: prop = false; break; case kpidName: prop = item.Name; break; case kpidPrefix: GetPrefixIfAny(itemIndex, prop); break; default: return _agentSpec->GetArchive()->GetProperty(item.Index, propID, value); } } prop.Detach(value); return S_OK; }
STDMETHODIMP CArchiveUpdateCallback::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) { COM_TRY_BEGIN const CUpdatePair2 &up = (*UpdatePairs)[index]; NCOM::CPropVariant prop; if (up.NewData) { /* if (propID == kpidIsHardLink) { prop = _isHardLink; prop.Detach(value); return S_OK; } */ if (propID == kpidSymLink) { if (index == _hardIndex_From) { prop.Detach(value); return S_OK; } if (up.DirIndex >= 0) { #ifndef UNDER_CE const CDirItem &di = DirItems->Items[up.DirIndex]; // if (di.IsDir()) { CReparseAttr attr; DWORD errorCode = 0; if (attr.Parse(di.ReparseData, di.ReparseData.Size(), errorCode)) { UString simpleName = attr.GetPath(); if (attr.IsRelative()) prop = simpleName; else { const FString phyPath = DirItems->GetPhyPath(up.DirIndex); FString fullPath; if (NDir::MyGetFullPathName(phyPath, fullPath)) { prop = GetRelativePath(simpleName, fs2us(fullPath)); } } prop.Detach(value); return S_OK; } } #endif } } else if (propID == kpidHardLink) { if (index == _hardIndex_From) { const CKeyKeyValPair &pair = _map[_hardIndex_To]; const CUpdatePair2 &up2 = (*UpdatePairs)[pair.Value]; prop = DirItems->GetLogPath(up2.DirIndex); prop.Detach(value); return S_OK; } if (up.DirIndex >= 0) { prop.Detach(value); return S_OK; } } } if (up.IsAnti && propID != kpidIsDir && propID != kpidPath && propID != kpidIsAltStream) { switch (propID) { case kpidSize: prop = (UInt64)0; break; case kpidIsAnti: prop = true; break; } } else if (propID == kpidPath && up.NewNameIndex >= 0) prop = (*NewNames)[up.NewNameIndex]; else if (propID == kpidComment && CommentIndex >= 0 && (unsigned)CommentIndex == index && Comment) prop = *Comment; else if (propID == kpidShortName && up.NewNameIndex >= 0 && up.IsMainRenameItem) { // we can generate new ShortName here; } else if ((up.UseArcProps || (KeepOriginalItemNames && (propID == kpidPath || propID == kpidIsAltStream))) && up.ExistInArchive() && Archive) return Archive->GetProperty(ArcItems ? (*ArcItems)[up.ArcIndex].IndexInServer : up.ArcIndex, propID, value); else if (up.ExistOnDisk()) { const CDirItem &di = DirItems->Items[up.DirIndex]; switch (propID) { case kpidPath: prop = DirItems->GetLogPath(up.DirIndex); break; case kpidIsDir: prop = di.IsDir(); break; case kpidSize: prop = di.IsDir() ? (UInt64)0 : di.Size; break; case kpidAttrib: prop = di.Attrib; break; case kpidCTime: prop = di.CTime; break; case kpidATime: prop = di.ATime; break; case kpidMTime: prop = di.MTime; break; case kpidIsAltStream: prop = di.IsAltStream; break; #if defined(_WIN32) && !defined(UNDER_CE) // case kpidShortName: prop = di.ShortName; break; #endif } } prop.Detach(value); return S_OK; COM_TRY_END }
STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) { COM_TRY_BEGIN NCOM::CPropVariant prop; if (index >= (UInt32)_archive.Refs.Size()) { index -= _archive.Refs.Size(); const CBootInitialEntry &be = _archive.BootEntries[index]; switch (propID) { case kpidPath: { AString s = "[BOOT]" STRING_PATH_SEPARATOR; if (_archive.BootEntries.Size() != 1) { char temp[16]; ConvertUInt32ToString(index + 1, temp); s += temp; s += '-'; } s += be.GetName(); prop = s; break; } case kpidIsDir: prop = false; break; case kpidSize: case kpidPackSize: prop = (UInt64)_archive.GetBootItemSize(index); break; } } else { const CRef &ref = _archive.Refs[index]; const CDir &item = ref.Dir->_subItems[ref.Index]; switch (propID) { case kpidPath: // if (item.FileId.GetCapacity() >= 0) { UString s; if (_archive.IsJoliet()) item.GetPathU(s); else s = MultiByteToUnicodeString(item.GetPath(_archive.IsSusp, _archive.SuspSkipSize), CP_OEMCP); if (s.Len() >= 2 && s[s.Len() - 2] == ';' && s.Back() == '1') s.DeleteFrom(s.Len() - 2); if (!s.IsEmpty() && s.Back() == L'.') s.DeleteBack(); NItemName::ConvertToOSName2(s); prop = s; } break; case kpidIsDir: prop = item.IsDir(); break; case kpidSize: case kpidPackSize: if (!item.IsDir()) prop = (UInt64)ref.TotalSize; break; case kpidMTime: { FILETIME utc; if (item.DateTime.GetFileTime(utc)) prop = utc; break; } } } prop.Detach(value); return S_OK; COM_TRY_END }
HRESULT CProxyArc::Load(const CArc &arc, IProgress *progress) { // DWORD tickCount = GetTickCount(); for (int ttt = 0; ttt < 1; ttt++) { Files.Free(); Dirs.Clear(); Dirs.AddNew(); IInArchive *archive = arc.Archive; UInt32 numItems; RINOK(archive->GetNumberOfItems(&numItems)); if (progress) RINOK(progress->SetTotal(numItems)); Files.Alloc(numItems); UString path; UString name; NCOM::CPropVariant prop; for (UInt32 i = 0; i < numItems; i++) { if (progress && (i & 0xFFFF) == 0) { UInt64 currentItemIndex = i; RINOK(progress->SetCompleted(¤tItemIndex)); } const wchar_t *s = NULL; unsigned len = 0; bool isPtrName = false; #ifdef MY_CPU_LE if (arc.GetRawProps) { const void *p; UInt32 size; UInt32 propType; if (arc.GetRawProps->GetRawProp(i, kpidPath, &p, &size, &propType) == S_OK && propType == NPropDataType::kUtf16z && size > 2) { // is (size <= 2), it's empty name, and we call default arc.GetItemPath(); len = size / 2 - 1; s = (const wchar_t *)p; isPtrName = true; } } if (!s) #endif { prop.Clear(); RINOK(arc.Archive->GetProperty(i, kpidPath, &prop)); if (prop.vt == VT_BSTR) { s = prop.bstrVal; len = ::SysStringLen(prop.bstrVal); } else if (prop.vt != VT_EMPTY) return E_FAIL; if (len == 0) { RINOK(arc.GetDefaultItemPath(i, path)); len = path.Len(); s = path; } /* RINOK(arc.GetItemPath(i, path)); len = path.Len(); s = path; */ } unsigned curItem = 0; /* if (arc.Ask_Deleted) { bool isDeleted = false; RINOK(Archive_IsItem_Deleted(archive, i, isDeleted)); if (isDeleted) curItem = AddDirSubItem(curItem, (UInt32)(Int32)-1, false, L"[DELETED]"); } */ unsigned namePos = 0; for (unsigned j = 0; j < len; j++) { wchar_t c = s[j]; if (c == WCHAR_PATH_SEPARATOR || c == L'/') { name.SetFrom(s + namePos, j - namePos); curItem = AddDir(curItem, -1, name); namePos = j + 1; } } /* that code must be implemeted to hide alt streams in list. if (arc.Ask_AltStreams) { bool isAltStream; RINOK(Archive_IsItem_AltStream(archive, i, isAltStream)); if (isAltStream) { } } */ bool isDir; RINOK(Archive_IsItem_Dir(archive, i, isDir)); CProxyFile &f = Files[i]; f.NameLen = len - namePos; s += namePos; if (isPtrName) f.Name = s; else { f.Name = new wchar_t[f.NameLen + 1]; f.NeedDeleteName = true; MyStringCopy((wchar_t *)f.Name, s); } if (isDir) { name = s; AddDir(curItem, (int)i, name); } else Dirs[curItem].SubFiles.Add(i); } CalculateSizes(0, archive); // } char s[128]; sprintf(s, "Load archive: %7d ms", GetTickCount() - tickCount); OutputDebugStringA(s); return S_OK; }
STDMETHODIMP CFSFolder::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) { NCOM::CPropVariant prop; /* if (index >= (UInt32)Files.Size()) { CAltStream &ss = Streams[index - Files.Size()]; CDirItem &fi = Files[ss.Parent]; switch (propID) { case kpidIsDir: prop = false; break; case kpidIsAltStream: prop = true; break; case kpidName: prop = fs2us(fi.Name) + ss.Name; break; case kpidSize: prop = ss.Size; break; case kpidPackSize: #ifdef UNDER_CE prop = ss.Size; #else if (!ss.PackSize_Defined) { ss.PackSize_Defined = true; if (!MyGetCompressedFileSizeW(_path + GetRelPath(fi) + us2fs(ss.Name), ss.PackSize)) ss.PackSize = ss.Size; } prop = ss.PackSize; #endif break; case kpidComment: break; default: index = ss.Parent; } if (index >= (UInt32)Files.Size()) { prop.Detach(value); return S_OK; } } */ CDirItem &fi = Files[index]; switch (propID) { case kpidIsDir: prop = fi.IsDir(); break; case kpidIsAltStream: prop = false; break; case kpidName: prop = fs2us(fi.Name); break; case kpidSize: if (!fi.IsDir() || fi.FolderStat_Defined) prop = fi.Size; break; case kpidPackSize: #ifdef UNDER_CE prop = fi.Size; #else if (!fi.PackSize_Defined) { fi.PackSize_Defined = true; if (fi.IsDir () || !MyGetCompressedFileSizeW(_path + GetRelPath(fi), fi.PackSize)) fi.PackSize = fi.Size; } prop = fi.PackSize; #endif break; #ifdef FS_SHOW_LINKS_INFO case kpidLinks: #ifdef UNDER_CE // prop = fi.NumLinks; #else if (!fi.FileInfo_WasRequested) ReadFileInfo(fi); if (fi.FileInfo_Defined) prop = fi.NumLinks; #endif break; case kpidINode: #ifdef UNDER_CE // prop = fi.FileIndex; #else if (!fi.FileInfo_WasRequested) ReadFileInfo(fi); if (fi.FileInfo_Defined) prop = fi.FileIndex; #endif break; #endif case kpidAttrib: prop = (UInt32)fi.Attrib; break; case kpidCTime: prop = fi.CTime; break; case kpidATime: prop = fi.ATime; break; case kpidMTime: prop = fi.MTime; break; case kpidComment: { if (!_commentsAreLoaded) LoadComments(); UString comment; if (_comments.GetValue(fs2us(GetRelPath(fi)), comment)) { int pos = comment.Find((wchar_t)4); if (pos >= 0) comment.DeleteFrom(pos); prop = comment; } break; } case kpidPrefix: if (fi.Parent >= 0) prop = Folders[fi.Parent]; break; case kpidNumSubDirs: if (fi.IsDir() && fi.FolderStat_Defined) prop = fi.NumFolders; break; case kpidNumSubFiles: if (fi.IsDir() && fi.FolderStat_Defined) prop = fi.NumFiles; break; } prop.Detach(value); return S_OK; }
STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) { COM_TRY_BEGIN NCOM::CPropVariant prop; if (index < _db.SortedItems.Size()) { unsigned realIndex = _db.SortedItems[index]; const CItem &item = _db.Items[realIndex]; const CStreamInfo *si = NULL; const CVolume *vol = NULL; if (item.StreamIndex >= 0) { si = &_db.DataStreams[item.StreamIndex]; vol = &_volumes[si->PartNumber]; } const CItem *mainItem = &item; if (item.IsAltStream) mainItem = &_db.Items[item.Parent]; const Byte *metadata = NULL; if (mainItem->ImageIndex >= 0) metadata = _db.Images[mainItem->ImageIndex].Meta + mainItem->Offset; switch (propID) { case kpidPath: if (item.ImageIndex >= 0) _db.GetItemPath(realIndex, _showImageNumber, prop); else { char sz[16]; ConvertUInt32ToString(item.StreamIndex, sz); AString s = sz; /* while (s.Len() < _nameLenForStreams) s = '0' + s; */ /* if (si->Resource.IsFree()) s = (AString)("[Free]" STRING_PATH_SEPARATOR) + sz; else */ s = (AString)(FILES_DIR_NAME STRING_PATH_SEPARATOR) + sz; prop = s; } break; case kpidName: if (item.ImageIndex >= 0) _db.GetItemName(realIndex, prop); else { char sz[16]; ConvertUInt32ToString(item.StreamIndex, sz); /* AString s = sz; while (s.Len() < _nameLenForStreams) s = '0' + s; */ prop = sz; } break; case kpidShortName: if (item.ImageIndex >= 0 && !item.IsAltStream) _db.GetShortName(realIndex, prop); break; case kpidPackSize: prop = (UInt64)(si ? si->Resource.PackSize : 0); break; case kpidSize: prop = (UInt64)(si ? si->Resource.UnpackSize : 0); break; case kpidIsDir: prop = item.IsDir; break; case kpidIsAltStream: prop = item.IsAltStream; break; case kpidAttrib: if (!item.IsAltStream && mainItem->ImageIndex >= 0) { /* if (fileNameLen == 0 && isDir && !item.HasStream()) item.Attrib = 0x10; // some swm archives have system/hidden attributes for root */ prop = (UInt32)Get32(metadata + 8); } break; case kpidCTime: if (mainItem->HasMetadata()) GetFileTime(metadata + (_db.IsOldVersion ? 0x18: 0x28), prop); break; case kpidATime: if (mainItem->HasMetadata()) GetFileTime(metadata + (_db.IsOldVersion ? 0x20: 0x30), prop); break; case kpidMTime: if (mainItem->HasMetadata()) GetFileTime(metadata + (_db.IsOldVersion ? 0x28: 0x38), prop); break; case kpidINode: if (mainItem->HasMetadata() && !_isOldVersion) { UInt32 attrib = (UInt32)Get32(metadata + 8); if ((attrib & FILE_ATTRIBUTE_REPARSE_POINT) == 0) { // we don't know about that field in OLD WIM format unsigned offset = 0x58; // (_db.IsOldVersion ? 0x30: 0x58); UInt64 val = Get64(metadata + offset); if (val != 0) prop = val; } } break; case kpidStreamId: if (item.StreamIndex >= 0) prop = (UInt32)item.StreamIndex; break; case kpidMethod: if (si) prop = si->Resource.IsCompressed() ? (vol->Header.IsLzxMode() ? kMethodLZX : kMethodXpress) : kMethodCopy; break; case kpidLinks: if (si) prop = (UInt32)si->RefCount; break; #ifdef WIM_DETAILS case kpidVolume: if (si) prop = (UInt32)si->PartNumber; break; case kpidOffset: if (si) prop = (UInt64)si->Resource.Offset; break; #endif } } else { index -= _db.SortedItems.Size(); if (index < _numXmlItems) { switch (propID) { case kpidPath: case kpidName: prop = _xmls[index].FileName; break; case kpidIsDir: prop = false; break; case kpidPackSize: case kpidSize: prop = (UInt64)_xmls[index].Data.Size(); break; case kpidMethod: prop = kMethodCopy; break; } } else { index -= _numXmlItems; switch (propID) { case kpidPath: case kpidName: if (index < (UInt32)_db.VirtualRoots.Size()) prop = _db.Images[_db.VirtualRoots[index]].RootName; else prop = FILES_DIR_NAME; break; case kpidIsDir: prop = true; break; case kpidIsAux: prop = true; break; } } } prop.Detach(value); return S_OK; COM_TRY_END }