Mercurial > vba-linux
diff 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 diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/win32/7zip/7z/CPP/7zip/Archive/ArchiveExports.cpp Sat Mar 03 10:31:27 2012 -0600 1.3 @@ -0,0 +1,130 @@ 1.4 +// ArchiveExports.cpp 1.5 + 1.6 +#include "StdAfx.h" 1.7 + 1.8 +#include "../../Common/ComTry.h" 1.9 +#include "../../Common/Types.h" 1.10 +#include "../../Windows/PropVariant.h" 1.11 +#include "../Common/RegisterArc.h" 1.12 + 1.13 +#include "IArchive.h" 1.14 +#include "../ICoder.h" 1.15 +#include "../IPassword.h" 1.16 + 1.17 +static const unsigned int kNumArcsMax = 32; 1.18 +static unsigned int g_NumArcs = 0; 1.19 +static const CArcInfo *g_Arcs[kNumArcsMax]; 1.20 +void RegisterArc(const CArcInfo *arcInfo) 1.21 +{ 1.22 + if (g_NumArcs < kNumArcsMax) 1.23 + g_Arcs[g_NumArcs++] = arcInfo; 1.24 +} 1.25 + 1.26 +DEFINE_GUID(CLSID_CArchiveHandler, 1.27 +0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00); 1.28 + 1.29 +#define CLS_ARC_ID_ITEM(cls) ((cls).Data4[5]) 1.30 + 1.31 +static inline HRESULT SetPropString(const char *s, unsigned int size, PROPVARIANT *value) 1.32 +{ 1.33 + if ((value->bstrVal = ::SysAllocStringByteLen(s, size)) != 0) 1.34 + value->vt = VT_BSTR; 1.35 + return S_OK; 1.36 +} 1.37 + 1.38 +static inline HRESULT SetPropGUID(const GUID &guid, PROPVARIANT *value) 1.39 +{ 1.40 + return SetPropString((const char *)&guid, sizeof(GUID), value); 1.41 +} 1.42 + 1.43 +int FindFormatCalssId(const GUID *clsID) 1.44 +{ 1.45 + GUID cls = *clsID; 1.46 + CLS_ARC_ID_ITEM(cls) = 0; 1.47 + if (cls != CLSID_CArchiveHandler) 1.48 + return -1; 1.49 + Byte id = CLS_ARC_ID_ITEM(*clsID); 1.50 + for (unsigned i = 0; i < g_NumArcs; i++) 1.51 + if (g_Arcs[i]->ClassId == id) 1.52 + return (int)i; 1.53 + return -1; 1.54 +} 1.55 + 1.56 +STDAPI CreateArchiver(const GUID *clsid, const GUID *iid, void **outObject) 1.57 +{ 1.58 + COM_TRY_BEGIN 1.59 + { 1.60 + int needIn = (*iid == IID_IInArchive); 1.61 + int needOut = (*iid == IID_IOutArchive); 1.62 + if (!needIn && !needOut) 1.63 + return E_NOINTERFACE; 1.64 + int formatIndex = FindFormatCalssId(clsid); 1.65 + if (formatIndex < 0) 1.66 + return CLASS_E_CLASSNOTAVAILABLE; 1.67 + 1.68 + const CArcInfo &arc = *g_Arcs[formatIndex]; 1.69 + if (needIn) 1.70 + { 1.71 + *outObject = arc.CreateInArchive(); 1.72 + ((IInArchive *)*outObject)->AddRef(); 1.73 + } 1.74 + else 1.75 + { 1.76 + if (!arc.CreateOutArchive) 1.77 + return CLASS_E_CLASSNOTAVAILABLE; 1.78 + *outObject = arc.CreateOutArchive(); 1.79 + ((IOutArchive *)*outObject)->AddRef(); 1.80 + } 1.81 + } 1.82 + COM_TRY_END 1.83 + return S_OK; 1.84 +} 1.85 + 1.86 +STDAPI GetHandlerProperty2(UInt32 formatIndex, PROPID propID, PROPVARIANT *value) 1.87 +{ 1.88 + if (formatIndex >= g_NumArcs) 1.89 + return E_INVALIDARG; 1.90 + const CArcInfo &arc = *g_Arcs[formatIndex]; 1.91 + NWindows::NCOM::CPropVariant prop; 1.92 + switch(propID) 1.93 + { 1.94 + case NArchive::kName: 1.95 + prop = arc.Name; 1.96 + break; 1.97 + case NArchive::kClassID: 1.98 + { 1.99 + GUID clsId = CLSID_CArchiveHandler; 1.100 + CLS_ARC_ID_ITEM(clsId) = arc.ClassId; 1.101 + return SetPropGUID(clsId, value); 1.102 + } 1.103 + case NArchive::kExtension: 1.104 + if (arc.Ext != 0) 1.105 + prop = arc.Ext; 1.106 + break; 1.107 + case NArchive::kAddExtension: 1.108 + if (arc.AddExt != 0) 1.109 + prop = arc.AddExt; 1.110 + break; 1.111 + case NArchive::kUpdate: 1.112 + prop = (bool)(arc.CreateOutArchive != 0); 1.113 + break; 1.114 + case NArchive::kKeepName: 1.115 + prop = arc.KeepName; 1.116 + break; 1.117 + case NArchive::kStartSignature: 1.118 + return SetPropString((const char *)arc.Signature, arc.SignatureSize, value); 1.119 + } 1.120 + prop.Detach(value); 1.121 + return S_OK; 1.122 +} 1.123 + 1.124 +STDAPI GetHandlerProperty(PROPID propID, PROPVARIANT *value) 1.125 +{ 1.126 + return GetHandlerProperty2(0, propID, value); 1.127 +} 1.128 + 1.129 +STDAPI GetNumberOfFormats(UINT32 *numFormats) 1.130 +{ 1.131 + *numFormats = g_NumArcs; 1.132 + return S_OK; 1.133 +}