5 #include "../../Common/ComTry.h"
6 #include "../../Common/Types.h"
7 #include "../../Windows/PropVariant.h"
8 #include "../Common/RegisterArc.h"
11 #include "../ICoder.h"
12 #include "../IPassword.h"
14 static const unsigned int kNumArcsMax = 32;
15 static unsigned int g_NumArcs = 0;
16 static const CArcInfo *g_Arcs[kNumArcsMax];
17 void RegisterArc(const CArcInfo *arcInfo)
19 if (g_NumArcs < kNumArcsMax)
20 g_Arcs[g_NumArcs++] = arcInfo;
23 DEFINE_GUID(CLSID_CArchiveHandler,
24 0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00);
26 #define CLS_ARC_ID_ITEM(cls) ((cls).Data4[5])
28 static inline HRESULT SetPropString(const char *s, unsigned int size, PROPVARIANT *value)
30 if ((value->bstrVal = ::SysAllocStringByteLen(s, size)) != 0)
35 static inline HRESULT SetPropGUID(const GUID &guid, PROPVARIANT *value)
37 return SetPropString((const char *)&guid, sizeof(GUID), value);
40 int FindFormatCalssId(const GUID *clsID)
43 CLS_ARC_ID_ITEM(cls) = 0;
44 if (cls != CLSID_CArchiveHandler)
46 Byte id = CLS_ARC_ID_ITEM(*clsID);
47 for (UInt32 i = 0; i < g_NumArcs; i++)
48 if (g_Arcs[i]->ClassId == id)
53 STDAPI CreateArchiver(const GUID *clsid, const GUID *iid, void **outObject)
57 int needIn = (*iid == IID_IInArchive);
58 int needOut = (*iid == IID_IOutArchive);
59 if (!needIn && !needOut)
61 int formatIndex = FindFormatCalssId(clsid);
63 return CLASS_E_CLASSNOTAVAILABLE;
65 const CArcInfo &arc = *g_Arcs[formatIndex];
68 *outObject = arc.CreateInArchive();
69 ((IInArchive *)*outObject)->AddRef();
73 if (!arc.CreateOutArchive)
74 return CLASS_E_CLASSNOTAVAILABLE;
75 *outObject = arc.CreateOutArchive();
76 ((IOutArchive *)*outObject)->AddRef();
83 STDAPI GetHandlerProperty2(UInt32 formatIndex, PROPID propID, PROPVARIANT *value)
85 if (formatIndex >= g_NumArcs)
87 const CArcInfo &arc = *g_Arcs[formatIndex];
88 NWindows::NCOM::CPropVariant prop;
94 case NArchive::kClassID:
96 GUID clsId = CLSID_CArchiveHandler;
97 CLS_ARC_ID_ITEM(clsId) = arc.ClassId;
98 return SetPropGUID(clsId, value);
100 case NArchive::kExtension:
104 case NArchive::kAddExtension:
108 case NArchive::kUpdate:
109 prop = (bool)(arc.CreateOutArchive != 0);
111 case NArchive::kKeepName:
114 case NArchive::kStartSignature:
115 return SetPropString((const char *)arc.Signature, arc.SignatureSize, value);
121 STDAPI GetHandlerProperty(PROPID propID, PROPVARIANT *value)
123 return GetHandlerProperty2(0, propID, value);
126 STDAPI GetNumberOfFormats(UINT32 *numFormats)
128 *numFormats = g_NumArcs;