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

branch
TOR_BUG_9701
changeset 14
925c144e1f1f
equal deleted inserted replaced
-1:000000000000 0:8d97f9d437d5
1 // MyWindows.cpp
2
3 #include "StdAfx.h"
4
5 #ifndef _WIN32
6
7 #include "MyWindows.h"
8 #include "Types.h"
9 #include <malloc.h>
10
11 static inline void *AllocateForBSTR(size_t cb) { return ::malloc(cb); }
12 static inline void FreeForBSTR(void *pv) { ::free(pv);}
13
14 static UINT MyStringLen(const wchar_t *s)
15 {
16 UINT i;
17 for (i = 0; s[i] != '\0'; i++);
18 return i;
19 }
20
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 }
35
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 }
50
51 void SysFreeString(BSTR bstr)
52 {
53 if (bstr != 0)
54 FreeForBSTR((UINT *)bstr - 1);
55 }
56
57 UINT SysStringByteLen(BSTR bstr)
58 {
59 if (bstr == 0)
60 return 0;
61 return *((UINT *)bstr - 1);
62 }
63
64 UINT SysStringLen(BSTR bstr)
65 {
66 return SysStringByteLen(bstr) / sizeof(OLECHAR);
67 }
68
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 }
76
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 }
94
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 }
107
108 DWORD GetLastError()
109 {
110 return 0;
111 }
112
113 #endif

mercurial