other-licenses/7zstub/src/Common/MyWindows.cpp

Fri, 16 Jan 2015 18:13:44 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Fri, 16 Jan 2015 18:13:44 +0100
branch
TOR_BUG_9701
changeset 14
925c144e1f1f
permissions
-rw-r--r--

Integrate suggestion from review to improve consistency with existing code.

     1 // MyWindows.cpp
     3 #include "StdAfx.h"
     5 #ifndef _WIN32
     7 #include "MyWindows.h"
     8 #include "Types.h"
     9 #include <malloc.h>
    11 static inline void *AllocateForBSTR(size_t cb) { return ::malloc(cb); }
    12 static inline void FreeForBSTR(void *pv) { ::free(pv);}
    14 static UINT MyStringLen(const wchar_t *s)
    15 { 
    16   UINT i;
    17   for (i = 0; s[i] != '\0'; i++);
    18   return i;
    19 }
    21 BSTR SysAllocStringByteLen(LPCSTR psz, UINT len)
    22 {
    23   int realLen = len + sizeof(UINT) + sizeof(OLECHAR) + sizeof(OLECHAR);
    24   void *p = AllocateForBSTR(realLen);
    25   if (p == 0)
    26     return 0;
    27   *(UINT *)p = len;
    28   BSTR bstr = (BSTR)((UINT *)p + 1);
    29   memmove(bstr, psz, len);
    30   Byte *pb = ((Byte *)bstr) + len;
    31   for (int i = 0; i < sizeof(OLECHAR) * 2; i++)
    32     pb[i] = 0;
    33   return bstr;
    34 }
    36 BSTR SysAllocString(const OLECHAR *sz)
    37 {
    38   if (sz == 0)
    39     return 0;
    40   UINT strLen = MyStringLen(sz);
    41   UINT len = (strLen + 1) * sizeof(OLECHAR);
    42   void *p = AllocateForBSTR(len + sizeof(UINT));
    43   if (p == 0)
    44     return 0;
    45   *(UINT *)p = strLen;
    46   BSTR bstr = (BSTR)((UINT *)p + 1);
    47   memmove(bstr, sz, len);
    48   return bstr;
    49 }
    51 void SysFreeString(BSTR bstr)
    52 {
    53   if (bstr != 0)
    54     FreeForBSTR((UINT *)bstr - 1);
    55 }
    57 UINT SysStringByteLen(BSTR bstr)
    58 {
    59   if (bstr == 0)
    60     return 0;
    61   return *((UINT *)bstr - 1);
    62 }
    64 UINT SysStringLen(BSTR bstr)
    65 {
    66   return SysStringByteLen(bstr) / sizeof(OLECHAR);
    67 }
    69 HRESULT VariantClear(VARIANTARG *prop)
    70 {
    71   if (prop->vt == VT_BSTR)
    72     SysFreeString(prop->bstrVal);
    73   prop->vt = VT_EMPTY;
    74   return S_OK;
    75 }
    77 HRESULT VariantCopy(VARIANTARG *dest, VARIANTARG *src)
    78 {
    79   HRESULT res = ::VariantClear(dest);
    80   if (res != S_OK)
    81     return res;
    82   if (src->vt == VT_BSTR)
    83   {
    84     dest->bstrVal = SysAllocStringByteLen((LPCSTR)src->bstrVal, 
    85         SysStringByteLen(src->bstrVal));
    86     if (dest->bstrVal == 0)
    87       return E_OUTOFMEMORY;
    88     dest->vt = VT_BSTR;
    89   }
    90   else
    91     *dest = *src;
    92   return S_OK;
    93 }
    95 LONG CompareFileTime(const FILETIME* ft1, const FILETIME* ft2)
    96 {
    97   if(ft1->dwHighDateTime < ft2->dwHighDateTime)
    98     return -1;
    99   if(ft1->dwHighDateTime > ft2->dwHighDateTime)
   100     return 1;
   101   if(ft1->dwLowDateTime < ft2->dwLowDateTime)
   102     return -1;
   103   if(ft1->dwLowDateTime > ft2->dwLowDateTime)
   104     return 1;
   105   return 0;
   106 }
   108 DWORD GetLastError()
   109 {
   110   return 0;
   111 }
   113 #endif

mercurial