1*f6dc9357SAndroid Build Coastguard Worker // ArchiveExports.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../C/7zVersion.h"
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/ComTry.h"
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker #include "../../Windows/PropVariant.h"
10*f6dc9357SAndroid Build Coastguard Worker
11*f6dc9357SAndroid Build Coastguard Worker #include "../Common/RegisterArc.h"
12*f6dc9357SAndroid Build Coastguard Worker
13*f6dc9357SAndroid Build Coastguard Worker static const unsigned kNumArcsMax = 72;
14*f6dc9357SAndroid Build Coastguard Worker static unsigned g_NumArcs = 0;
15*f6dc9357SAndroid Build Coastguard Worker static unsigned g_DefaultArcIndex = 0;
16*f6dc9357SAndroid Build Coastguard Worker static const CArcInfo *g_Arcs[kNumArcsMax];
17*f6dc9357SAndroid Build Coastguard Worker
RegisterArc(const CArcInfo * arcInfo)18*f6dc9357SAndroid Build Coastguard Worker void RegisterArc(const CArcInfo *arcInfo) throw()
19*f6dc9357SAndroid Build Coastguard Worker {
20*f6dc9357SAndroid Build Coastguard Worker if (g_NumArcs < kNumArcsMax)
21*f6dc9357SAndroid Build Coastguard Worker {
22*f6dc9357SAndroid Build Coastguard Worker const char *p = arcInfo->Name;
23*f6dc9357SAndroid Build Coastguard Worker if (p[0] == '7' && p[1] == 'z' && p[2] == 0)
24*f6dc9357SAndroid Build Coastguard Worker g_DefaultArcIndex = g_NumArcs;
25*f6dc9357SAndroid Build Coastguard Worker g_Arcs[g_NumArcs++] = arcInfo;
26*f6dc9357SAndroid Build Coastguard Worker }
27*f6dc9357SAndroid Build Coastguard Worker // else throw 1;
28*f6dc9357SAndroid Build Coastguard Worker }
29*f6dc9357SAndroid Build Coastguard Worker
30*f6dc9357SAndroid Build Coastguard Worker Z7_DEFINE_GUID(CLSID_CArchiveHandler,
31*f6dc9357SAndroid Build Coastguard Worker k_7zip_GUID_Data1,
32*f6dc9357SAndroid Build Coastguard Worker k_7zip_GUID_Data2,
33*f6dc9357SAndroid Build Coastguard Worker k_7zip_GUID_Data3_Common,
34*f6dc9357SAndroid Build Coastguard Worker 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00);
35*f6dc9357SAndroid Build Coastguard Worker
36*f6dc9357SAndroid Build Coastguard Worker #define CLS_ARC_ID_ITEM(cls) ((cls).Data4[5])
37*f6dc9357SAndroid Build Coastguard Worker
SetPropStrFromBin(const char * s,unsigned size,PROPVARIANT * value)38*f6dc9357SAndroid Build Coastguard Worker static inline HRESULT SetPropStrFromBin(const char *s, unsigned size, PROPVARIANT *value)
39*f6dc9357SAndroid Build Coastguard Worker {
40*f6dc9357SAndroid Build Coastguard Worker if ((value->bstrVal = ::SysAllocStringByteLen(s, size)) != NULL)
41*f6dc9357SAndroid Build Coastguard Worker value->vt = VT_BSTR;
42*f6dc9357SAndroid Build Coastguard Worker return S_OK;
43*f6dc9357SAndroid Build Coastguard Worker }
44*f6dc9357SAndroid Build Coastguard Worker
SetPropGUID(const GUID & guid,PROPVARIANT * value)45*f6dc9357SAndroid Build Coastguard Worker static inline HRESULT SetPropGUID(const GUID &guid, PROPVARIANT *value)
46*f6dc9357SAndroid Build Coastguard Worker {
47*f6dc9357SAndroid Build Coastguard Worker return SetPropStrFromBin((const char *)&guid, sizeof(guid), value);
48*f6dc9357SAndroid Build Coastguard Worker }
49*f6dc9357SAndroid Build Coastguard Worker
FindFormatCalssId(const GUID * clsid)50*f6dc9357SAndroid Build Coastguard Worker static int FindFormatCalssId(const GUID *clsid)
51*f6dc9357SAndroid Build Coastguard Worker {
52*f6dc9357SAndroid Build Coastguard Worker GUID cls = *clsid;
53*f6dc9357SAndroid Build Coastguard Worker CLS_ARC_ID_ITEM(cls) = 0;
54*f6dc9357SAndroid Build Coastguard Worker if (cls != CLSID_CArchiveHandler)
55*f6dc9357SAndroid Build Coastguard Worker return -1;
56*f6dc9357SAndroid Build Coastguard Worker const Byte id = CLS_ARC_ID_ITEM(*clsid);
57*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < g_NumArcs; i++)
58*f6dc9357SAndroid Build Coastguard Worker if (g_Arcs[i]->Id == id)
59*f6dc9357SAndroid Build Coastguard Worker return (int)i;
60*f6dc9357SAndroid Build Coastguard Worker return -1;
61*f6dc9357SAndroid Build Coastguard Worker }
62*f6dc9357SAndroid Build Coastguard Worker
63*f6dc9357SAndroid Build Coastguard Worker STDAPI CreateArchiver(const GUID *clsid, const GUID *iid, void **outObject);
CreateArchiver(const GUID * clsid,const GUID * iid,void ** outObject)64*f6dc9357SAndroid Build Coastguard Worker STDAPI CreateArchiver(const GUID *clsid, const GUID *iid, void **outObject)
65*f6dc9357SAndroid Build Coastguard Worker {
66*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
67*f6dc9357SAndroid Build Coastguard Worker {
68*f6dc9357SAndroid Build Coastguard Worker const int needIn = (*iid == IID_IInArchive);
69*f6dc9357SAndroid Build Coastguard Worker const int needOut = (*iid == IID_IOutArchive);
70*f6dc9357SAndroid Build Coastguard Worker if (!needIn && !needOut)
71*f6dc9357SAndroid Build Coastguard Worker return E_NOINTERFACE;
72*f6dc9357SAndroid Build Coastguard Worker const int formatIndex = FindFormatCalssId(clsid);
73*f6dc9357SAndroid Build Coastguard Worker if (formatIndex < 0)
74*f6dc9357SAndroid Build Coastguard Worker return CLASS_E_CLASSNOTAVAILABLE;
75*f6dc9357SAndroid Build Coastguard Worker
76*f6dc9357SAndroid Build Coastguard Worker const CArcInfo &arc = *g_Arcs[formatIndex];
77*f6dc9357SAndroid Build Coastguard Worker if (needIn)
78*f6dc9357SAndroid Build Coastguard Worker {
79*f6dc9357SAndroid Build Coastguard Worker *outObject = arc.CreateInArchive();
80*f6dc9357SAndroid Build Coastguard Worker ((IInArchive *)*outObject)->AddRef();
81*f6dc9357SAndroid Build Coastguard Worker }
82*f6dc9357SAndroid Build Coastguard Worker else
83*f6dc9357SAndroid Build Coastguard Worker {
84*f6dc9357SAndroid Build Coastguard Worker if (!arc.CreateOutArchive)
85*f6dc9357SAndroid Build Coastguard Worker return CLASS_E_CLASSNOTAVAILABLE;
86*f6dc9357SAndroid Build Coastguard Worker *outObject = arc.CreateOutArchive();
87*f6dc9357SAndroid Build Coastguard Worker ((IOutArchive *)*outObject)->AddRef();
88*f6dc9357SAndroid Build Coastguard Worker }
89*f6dc9357SAndroid Build Coastguard Worker }
90*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
91*f6dc9357SAndroid Build Coastguard Worker return S_OK;
92*f6dc9357SAndroid Build Coastguard Worker }
93*f6dc9357SAndroid Build Coastguard Worker
94*f6dc9357SAndroid Build Coastguard Worker STDAPI GetHandlerProperty2(UInt32 formatIndex, PROPID propID, PROPVARIANT *value);
GetHandlerProperty2(UInt32 formatIndex,PROPID propID,PROPVARIANT * value)95*f6dc9357SAndroid Build Coastguard Worker STDAPI GetHandlerProperty2(UInt32 formatIndex, PROPID propID, PROPVARIANT *value)
96*f6dc9357SAndroid Build Coastguard Worker {
97*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
98*f6dc9357SAndroid Build Coastguard Worker NWindows::NCOM::PropVariant_Clear(value);
99*f6dc9357SAndroid Build Coastguard Worker if (formatIndex >= g_NumArcs)
100*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
101*f6dc9357SAndroid Build Coastguard Worker const CArcInfo &arc = *g_Arcs[formatIndex];
102*f6dc9357SAndroid Build Coastguard Worker NWindows::NCOM::CPropVariant prop;
103*f6dc9357SAndroid Build Coastguard Worker switch (propID)
104*f6dc9357SAndroid Build Coastguard Worker {
105*f6dc9357SAndroid Build Coastguard Worker case NArchive::NHandlerPropID::kName: prop = arc.Name; break;
106*f6dc9357SAndroid Build Coastguard Worker case NArchive::NHandlerPropID::kClassID:
107*f6dc9357SAndroid Build Coastguard Worker {
108*f6dc9357SAndroid Build Coastguard Worker GUID clsId = CLSID_CArchiveHandler;
109*f6dc9357SAndroid Build Coastguard Worker CLS_ARC_ID_ITEM(clsId) = arc.Id;
110*f6dc9357SAndroid Build Coastguard Worker return SetPropGUID(clsId, value);
111*f6dc9357SAndroid Build Coastguard Worker }
112*f6dc9357SAndroid Build Coastguard Worker case NArchive::NHandlerPropID::kExtension: if (arc.Ext) prop = arc.Ext; break;
113*f6dc9357SAndroid Build Coastguard Worker case NArchive::NHandlerPropID::kAddExtension: if (arc.AddExt) prop = arc.AddExt; break;
114*f6dc9357SAndroid Build Coastguard Worker case NArchive::NHandlerPropID::kUpdate: prop = (bool)(arc.CreateOutArchive != NULL); break;
115*f6dc9357SAndroid Build Coastguard Worker case NArchive::NHandlerPropID::kKeepName: prop = ((arc.Flags & NArcInfoFlags::kKeepName) != 0); break;
116*f6dc9357SAndroid Build Coastguard Worker case NArchive::NHandlerPropID::kAltStreams: prop = ((arc.Flags & NArcInfoFlags::kAltStreams) != 0); break;
117*f6dc9357SAndroid Build Coastguard Worker case NArchive::NHandlerPropID::kNtSecure: prop = ((arc.Flags & NArcInfoFlags::kNtSecure) != 0); break;
118*f6dc9357SAndroid Build Coastguard Worker case NArchive::NHandlerPropID::kFlags: prop = (UInt32)arc.Flags; break;
119*f6dc9357SAndroid Build Coastguard Worker case NArchive::NHandlerPropID::kTimeFlags: prop = (UInt32)arc.TimeFlags; break;
120*f6dc9357SAndroid Build Coastguard Worker case NArchive::NHandlerPropID::kSignatureOffset: prop = (UInt32)arc.SignatureOffset; break;
121*f6dc9357SAndroid Build Coastguard Worker // case NArchive::NHandlerPropID::kVersion: prop = (UInt32)MY_VER_MIX; break;
122*f6dc9357SAndroid Build Coastguard Worker
123*f6dc9357SAndroid Build Coastguard Worker case NArchive::NHandlerPropID::kSignature:
124*f6dc9357SAndroid Build Coastguard Worker if (arc.SignatureSize != 0 && !arc.IsMultiSignature())
125*f6dc9357SAndroid Build Coastguard Worker return SetPropStrFromBin((const char *)arc.Signature, arc.SignatureSize, value);
126*f6dc9357SAndroid Build Coastguard Worker break;
127*f6dc9357SAndroid Build Coastguard Worker case NArchive::NHandlerPropID::kMultiSignature:
128*f6dc9357SAndroid Build Coastguard Worker if (arc.SignatureSize != 0 && arc.IsMultiSignature())
129*f6dc9357SAndroid Build Coastguard Worker return SetPropStrFromBin((const char *)arc.Signature, arc.SignatureSize, value);
130*f6dc9357SAndroid Build Coastguard Worker break;
131*f6dc9357SAndroid Build Coastguard Worker }
132*f6dc9357SAndroid Build Coastguard Worker prop.Detach(value);
133*f6dc9357SAndroid Build Coastguard Worker return S_OK;
134*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
135*f6dc9357SAndroid Build Coastguard Worker }
136*f6dc9357SAndroid Build Coastguard Worker
137*f6dc9357SAndroid Build Coastguard Worker STDAPI GetHandlerProperty(PROPID propID, PROPVARIANT *value);
GetHandlerProperty(PROPID propID,PROPVARIANT * value)138*f6dc9357SAndroid Build Coastguard Worker STDAPI GetHandlerProperty(PROPID propID, PROPVARIANT *value)
139*f6dc9357SAndroid Build Coastguard Worker {
140*f6dc9357SAndroid Build Coastguard Worker return GetHandlerProperty2(g_DefaultArcIndex, propID, value);
141*f6dc9357SAndroid Build Coastguard Worker }
142*f6dc9357SAndroid Build Coastguard Worker
143*f6dc9357SAndroid Build Coastguard Worker STDAPI GetNumberOfFormats(UINT32 *numFormats);
GetNumberOfFormats(UINT32 * numFormats)144*f6dc9357SAndroid Build Coastguard Worker STDAPI GetNumberOfFormats(UINT32 *numFormats)
145*f6dc9357SAndroid Build Coastguard Worker {
146*f6dc9357SAndroid Build Coastguard Worker *numFormats = g_NumArcs;
147*f6dc9357SAndroid Build Coastguard Worker return S_OK;
148*f6dc9357SAndroid Build Coastguard Worker }
149*f6dc9357SAndroid Build Coastguard Worker
150*f6dc9357SAndroid Build Coastguard Worker STDAPI GetIsArc(UInt32 formatIndex, Func_IsArc *isArc);
GetIsArc(UInt32 formatIndex,Func_IsArc * isArc)151*f6dc9357SAndroid Build Coastguard Worker STDAPI GetIsArc(UInt32 formatIndex, Func_IsArc *isArc)
152*f6dc9357SAndroid Build Coastguard Worker {
153*f6dc9357SAndroid Build Coastguard Worker *isArc = NULL;
154*f6dc9357SAndroid Build Coastguard Worker if (formatIndex >= g_NumArcs)
155*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
156*f6dc9357SAndroid Build Coastguard Worker *isArc = g_Arcs[formatIndex]->IsArc;
157*f6dc9357SAndroid Build Coastguard Worker return S_OK;
158*f6dc9357SAndroid Build Coastguard Worker }
159