1// OpenArchive.h
2
3#ifndef __OPEN_ARCHIVE_H
4#define __OPEN_ARCHIVE_H
5
6#include "Common/MyString.h"
7
8#include "Windows/FileFind.h"
9
10#include "../../Archive/IArchive.h"
11
12#include "ArchiveOpenCallback.h"
13#include "LoadCodecs.h"
14
15HRESULT GetArchiveItemBoolProp(IInArchive *archive, UInt32 index, PROPID propID, bool &result);
16HRESULT IsArchiveItemFolder(IInArchive *archive, UInt32 index, bool &result);
17
18struct CArc
19{
20  CMyComPtr<IInArchive> Archive;
21  UString Path;
22  UString DefaultName;
23  int FormatIndex;
24  int SubfileIndex;
25  FILETIME MTime;
26  bool MTimeDefined;
27  UString ErrorMessage;
28
29  CArc(): MTimeDefined(false) {}
30
31  HRESULT GetItemPath(UInt32 index, UString &result) const;
32  HRESULT GetItemMTime(UInt32 index, FILETIME &ft, bool &defined) const;
33  HRESULT IsItemAnti(UInt32 index, bool &result) const
34    { return GetArchiveItemBoolProp(Archive, index, kpidIsAnti, result); }
35
36  HRESULT OpenStream(
37    CCodecs *codecs,
38    int formatIndex,
39    IInStream *stream,
40    ISequentialInStream *seqStream,
41    IArchiveOpenCallback *callback);
42
43  HRESULT OpenStreamOrFile(
44    CCodecs *codecs,
45    int formatIndex,
46    bool stdInMode,
47    IInStream *stream,
48    IArchiveOpenCallback *callback);
49};
50
51struct CArchiveLink
52{
53  CObjectVector<CArc> Arcs;
54  UStringVector VolumePaths;
55  UInt64 VolumesSize;
56  bool IsOpen;
57
58  CArchiveLink(): VolumesSize(0), IsOpen(false) {}
59  HRESULT Close();
60  void Release();
61  ~CArchiveLink() { Release(); }
62
63  IInArchive *GetArchive() const { return Arcs.Back().Archive; }
64
65  HRESULT Open(
66    CCodecs *codecs,
67    const CIntVector &formatIndices,
68    bool stdInMode,
69    IInStream *stream,
70    const UString &filePath,
71    IArchiveOpenCallback *callback);
72
73  HRESULT Open2(
74    CCodecs *codecs,
75    const CIntVector &formatIndices,
76    bool stdInMode,
77    IInStream *stream,
78    const UString &filePath,
79    IOpenCallbackUI *callbackUI);
80
81  HRESULT ReOpen(
82    CCodecs *codecs,
83    const UString &filePath,
84    IArchiveOpenCallback *callback);
85};
86
87#endif
88