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 +}