annotate src/win32/7zip/7z/CPP/7zip/Archive/ArchiveExports.cpp @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
rev   line source
rlm@1 1 // ArchiveExports.cpp
rlm@1 2
rlm@1 3 #include "StdAfx.h"
rlm@1 4
rlm@1 5 #include "../../Common/ComTry.h"
rlm@1 6 #include "../../Common/Types.h"
rlm@1 7 #include "../../Windows/PropVariant.h"
rlm@1 8 #include "../Common/RegisterArc.h"
rlm@1 9
rlm@1 10 #include "IArchive.h"
rlm@1 11 #include "../ICoder.h"
rlm@1 12 #include "../IPassword.h"
rlm@1 13
rlm@1 14 static const unsigned int kNumArcsMax = 32;
rlm@1 15 static unsigned int g_NumArcs = 0;
rlm@1 16 static const CArcInfo *g_Arcs[kNumArcsMax];
rlm@1 17 void RegisterArc(const CArcInfo *arcInfo)
rlm@1 18 {
rlm@1 19 if (g_NumArcs < kNumArcsMax)
rlm@1 20 g_Arcs[g_NumArcs++] = arcInfo;
rlm@1 21 }
rlm@1 22
rlm@1 23 DEFINE_GUID(CLSID_CArchiveHandler,
rlm@1 24 0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00);
rlm@1 25
rlm@1 26 #define CLS_ARC_ID_ITEM(cls) ((cls).Data4[5])
rlm@1 27
rlm@1 28 static inline HRESULT SetPropString(const char *s, unsigned int size, PROPVARIANT *value)
rlm@1 29 {
rlm@1 30 if ((value->bstrVal = ::SysAllocStringByteLen(s, size)) != 0)
rlm@1 31 value->vt = VT_BSTR;
rlm@1 32 return S_OK;
rlm@1 33 }
rlm@1 34
rlm@1 35 static inline HRESULT SetPropGUID(const GUID &guid, PROPVARIANT *value)
rlm@1 36 {
rlm@1 37 return SetPropString((const char *)&guid, sizeof(GUID), value);
rlm@1 38 }
rlm@1 39
rlm@1 40 int FindFormatCalssId(const GUID *clsID)
rlm@1 41 {
rlm@1 42 GUID cls = *clsID;
rlm@1 43 CLS_ARC_ID_ITEM(cls) = 0;
rlm@1 44 if (cls != CLSID_CArchiveHandler)
rlm@1 45 return -1;
rlm@1 46 Byte id = CLS_ARC_ID_ITEM(*clsID);
rlm@1 47 for (unsigned i = 0; i < g_NumArcs; i++)
rlm@1 48 if (g_Arcs[i]->ClassId == id)
rlm@1 49 return (int)i;
rlm@1 50 return -1;
rlm@1 51 }
rlm@1 52
rlm@1 53 STDAPI CreateArchiver(const GUID *clsid, const GUID *iid, void **outObject)
rlm@1 54 {
rlm@1 55 COM_TRY_BEGIN
rlm@1 56 {
rlm@1 57 int needIn = (*iid == IID_IInArchive);
rlm@1 58 int needOut = (*iid == IID_IOutArchive);
rlm@1 59 if (!needIn && !needOut)
rlm@1 60 return E_NOINTERFACE;
rlm@1 61 int formatIndex = FindFormatCalssId(clsid);
rlm@1 62 if (formatIndex < 0)
rlm@1 63 return CLASS_E_CLASSNOTAVAILABLE;
rlm@1 64
rlm@1 65 const CArcInfo &arc = *g_Arcs[formatIndex];
rlm@1 66 if (needIn)
rlm@1 67 {
rlm@1 68 *outObject = arc.CreateInArchive();
rlm@1 69 ((IInArchive *)*outObject)->AddRef();
rlm@1 70 }
rlm@1 71 else
rlm@1 72 {
rlm@1 73 if (!arc.CreateOutArchive)
rlm@1 74 return CLASS_E_CLASSNOTAVAILABLE;
rlm@1 75 *outObject = arc.CreateOutArchive();
rlm@1 76 ((IOutArchive *)*outObject)->AddRef();
rlm@1 77 }
rlm@1 78 }
rlm@1 79 COM_TRY_END
rlm@1 80 return S_OK;
rlm@1 81 }
rlm@1 82
rlm@1 83 STDAPI GetHandlerProperty2(UInt32 formatIndex, PROPID propID, PROPVARIANT *value)
rlm@1 84 {
rlm@1 85 if (formatIndex >= g_NumArcs)
rlm@1 86 return E_INVALIDARG;
rlm@1 87 const CArcInfo &arc = *g_Arcs[formatIndex];
rlm@1 88 NWindows::NCOM::CPropVariant prop;
rlm@1 89 switch(propID)
rlm@1 90 {
rlm@1 91 case NArchive::kName:
rlm@1 92 prop = arc.Name;
rlm@1 93 break;
rlm@1 94 case NArchive::kClassID:
rlm@1 95 {
rlm@1 96 GUID clsId = CLSID_CArchiveHandler;
rlm@1 97 CLS_ARC_ID_ITEM(clsId) = arc.ClassId;
rlm@1 98 return SetPropGUID(clsId, value);
rlm@1 99 }
rlm@1 100 case NArchive::kExtension:
rlm@1 101 if (arc.Ext != 0)
rlm@1 102 prop = arc.Ext;
rlm@1 103 break;
rlm@1 104 case NArchive::kAddExtension:
rlm@1 105 if (arc.AddExt != 0)
rlm@1 106 prop = arc.AddExt;
rlm@1 107 break;
rlm@1 108 case NArchive::kUpdate:
rlm@1 109 prop = (bool)(arc.CreateOutArchive != 0);
rlm@1 110 break;
rlm@1 111 case NArchive::kKeepName:
rlm@1 112 prop = arc.KeepName;
rlm@1 113 break;
rlm@1 114 case NArchive::kStartSignature:
rlm@1 115 return SetPropString((const char *)arc.Signature, arc.SignatureSize, value);
rlm@1 116 }
rlm@1 117 prop.Detach(value);
rlm@1 118 return S_OK;
rlm@1 119 }
rlm@1 120
rlm@1 121 STDAPI GetHandlerProperty(PROPID propID, PROPVARIANT *value)
rlm@1 122 {
rlm@1 123 return GetHandlerProperty2(0, propID, value);
rlm@1 124 }
rlm@1 125
rlm@1 126 STDAPI GetNumberOfFormats(UINT32 *numFormats)
rlm@1 127 {
rlm@1 128 *numFormats = g_NumArcs;
rlm@1 129 return S_OK;
rlm@1 130 }