Mercurial > vba-linux
view 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 |
line wrap: on
line source
1 // ArchiveExports.cpp3 #include "StdAfx.h"5 #include "../../Common/ComTry.h"6 #include "../../Common/Types.h"7 #include "../../Windows/PropVariant.h"8 #include "../Common/RegisterArc.h"10 #include "IArchive.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)18 {19 if (g_NumArcs < kNumArcsMax)20 g_Arcs[g_NumArcs++] = arcInfo;21 }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)29 {30 if ((value->bstrVal = ::SysAllocStringByteLen(s, size)) != 0)31 value->vt = VT_BSTR;32 return S_OK;33 }35 static inline HRESULT SetPropGUID(const GUID &guid, PROPVARIANT *value)36 {37 return SetPropString((const char *)&guid, sizeof(GUID), value);38 }40 int FindFormatCalssId(const GUID *clsID)41 {42 GUID cls = *clsID;43 CLS_ARC_ID_ITEM(cls) = 0;44 if (cls != CLSID_CArchiveHandler)45 return -1;46 Byte id = CLS_ARC_ID_ITEM(*clsID);47 for (unsigned i = 0; i < g_NumArcs; i++)48 if (g_Arcs[i]->ClassId == id)49 return (int)i;50 return -1;51 }53 STDAPI CreateArchiver(const GUID *clsid, const GUID *iid, void **outObject)54 {55 COM_TRY_BEGIN56 {57 int needIn = (*iid == IID_IInArchive);58 int needOut = (*iid == IID_IOutArchive);59 if (!needIn && !needOut)60 return E_NOINTERFACE;61 int formatIndex = FindFormatCalssId(clsid);62 if (formatIndex < 0)63 return CLASS_E_CLASSNOTAVAILABLE;65 const CArcInfo &arc = *g_Arcs[formatIndex];66 if (needIn)67 {68 *outObject = arc.CreateInArchive();69 ((IInArchive *)*outObject)->AddRef();70 }71 else72 {73 if (!arc.CreateOutArchive)74 return CLASS_E_CLASSNOTAVAILABLE;75 *outObject = arc.CreateOutArchive();76 ((IOutArchive *)*outObject)->AddRef();77 }78 }79 COM_TRY_END80 return S_OK;81 }83 STDAPI GetHandlerProperty2(UInt32 formatIndex, PROPID propID, PROPVARIANT *value)84 {85 if (formatIndex >= g_NumArcs)86 return E_INVALIDARG;87 const CArcInfo &arc = *g_Arcs[formatIndex];88 NWindows::NCOM::CPropVariant prop;89 switch(propID)90 {91 case NArchive::kName:92 prop = arc.Name;93 break;94 case NArchive::kClassID:95 {96 GUID clsId = CLSID_CArchiveHandler;97 CLS_ARC_ID_ITEM(clsId) = arc.ClassId;98 return SetPropGUID(clsId, value);99 }100 case NArchive::kExtension:101 if (arc.Ext != 0)102 prop = arc.Ext;103 break;104 case NArchive::kAddExtension:105 if (arc.AddExt != 0)106 prop = arc.AddExt;107 break;108 case NArchive::kUpdate:109 prop = (bool)(arc.CreateOutArchive != 0);110 break;111 case NArchive::kKeepName:112 prop = arc.KeepName;113 break;114 case NArchive::kStartSignature:115 return SetPropString((const char *)arc.Signature, arc.SignatureSize, value);116 }117 prop.Detach(value);118 return S_OK;119 }121 STDAPI GetHandlerProperty(PROPID propID, PROPVARIANT *value)122 {123 return GetHandlerProperty2(0, propID, value);124 }126 STDAPI GetNumberOfFormats(UINT32 *numFormats)127 {128 *numFormats = g_NumArcs;129 return S_OK;130 }