xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/ArchiveExports.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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