HRESULT CArchiveLink::Open2(CCodecs *codecs, const CIntVector &formatIndices, bool stdInMode, IInStream *stream, const UString &filePath, IOpenCallbackUI *callbackUI) { VolumesSize = 0; COpenCallbackImp *openCallbackSpec = new COpenCallbackImp; CMyComPtr<IArchiveOpenCallback> callback = openCallbackSpec; openCallbackSpec->Callback = callbackUI; UString fullName, prefix, name; if (!stream && !stdInMode) { int fileNamePartStartIndex; if (!NFile::NDirectory::MyGetFullPathName(filePath, fullName, fileNamePartStartIndex)) return GetLastError(); prefix = fullName.Left(fileNamePartStartIndex); name = fullName.Mid(fileNamePartStartIndex); openCallbackSpec->Init(prefix, name); } else { openCallbackSpec->SetSubArchiveName(filePath); } RINOK(Open(codecs, formatIndices, stdInMode, stream, filePath, callback)); VolumePaths.Add(prefix + name); for (int i = 0; i < openCallbackSpec->FileNames.Size(); i++) VolumePaths.Add(prefix + openCallbackSpec->FileNames[i]); VolumesSize = openCallbackSpec->TotalSize; return S_OK; }
static void SetCallback(const UString &archiveName, IOpenCallbackUI *openCallbackUI, CMyComPtr<IArchiveOpenCallback> &openCallback) { COpenCallbackImp *openCallbackSpec = new COpenCallbackImp; openCallback = openCallbackSpec; openCallbackSpec->Callback = openCallbackUI; UString fullName; int fileNamePartStartIndex; NFile::NDirectory::MyGetFullPathName(archiveName, fullName, fileNamePartStartIndex); openCallbackSpec->Init( fullName.Left(fileNamePartStartIndex), fullName.Mid(fileNamePartStartIndex)); }
HRESULT MyOpenArchive( CCodecs *codecs, const UString &archiveName, IInArchive **archive0, IInArchive **archive1, UString &defaultItemName0, UString &defaultItemName1, UStringVector &volumePaths, UInt64 &volumesSize, IOpenCallbackUI *openCallbackUI) { volumesSize = 0; COpenCallbackImp *openCallbackSpec = new COpenCallbackImp; CMyComPtr<IArchiveOpenCallback> openCallback = openCallbackSpec; openCallbackSpec->Callback = openCallbackUI; UString fullName; int fileNamePartStartIndex; NFile::NDirectory::MyGetFullPathName(archiveName, fullName, fileNamePartStartIndex); UString prefix = fullName.Left(fileNamePartStartIndex); UString name = fullName.Mid(fileNamePartStartIndex); openCallbackSpec->Init(prefix, name); int formatIndex0, formatIndex1; RINOK(OpenArchive(codecs, archiveName, archive0, archive1, formatIndex0, formatIndex1, defaultItemName0, defaultItemName1, openCallback)); volumePaths.Add(prefix + name); for (int i = 0; i < openCallbackSpec->FileNames.Size(); i++) volumePaths.Add(prefix + openCallbackSpec->FileNames[i]); volumesSize = openCallbackSpec->TotalSize; return S_OK; }
~CInFileStreamVol() { int index = OpenCallbackImp->FindName(Name); if (index >= 0) OpenCallbackImp->FileNames.Delete(index); }