Author: gedmurphy
Date: Sun May 15 14:40:53 2011
New Revision: 51763

URL: http://svn.reactos.org/svn/reactos?rev=51763&view=rev
Log:
[ATL]
- Add DECLARE_NO_REGISTRY
- Fix invalid pointer use and add an overloaded assignment operator in 
CComDynamicUnkArray
- Add UpdateWindow to the CWindow class
- Add missing error checks
Changes by Andrew Hill <ash77 at reactos dot org>

Modified:
    trunk/reactos/lib/atl/atlcom.h
    trunk/reactos/lib/atl/atlwin.h
    trunk/reactos/lib/atl/statreg.h

Modified: trunk/reactos/lib/atl/atlcom.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/atl/atlcom.h?rev=51763&r1=51762&r2=51763&view=diff
==============================================================================
--- trunk/reactos/lib/atl/atlcom.h [iso-8859-1] (original)
+++ trunk/reactos/lib/atl/atlcom.h [iso-8859-1] Sun May 15 14:40:53 2011
@@ -369,10 +369,16 @@
     reinterpret_cast<DWORD>(&_CComChainData<classname, _ComMapClass>::data),   
\
     _Chain},
 
-#define DECLARE_REGISTRY_RESOURCEID(x)\
-       static HRESULT WINAPI UpdateRegistry(BOOL bRegister)\
-       {\
-               return ATL::_pAtlModule->UpdateRegistryFromResource(x, 
bRegister); \
+#define DECLARE_NO_REGISTRY()\
+       static HRESULT WINAPI UpdateRegistry(BOOL /*bRegister*/)                
                        \
+       {                                                                       
                                                                                
\
+               return S_OK;                                                    
                                                                \
+       }
+
+#define DECLARE_REGISTRY_RESOURCEID(x)                                         
                                        \
+       static HRESULT WINAPI UpdateRegistry(BOOL bRegister)                    
                        \
+       {                                                                       
                                                                                
\
+               return ATL::_pAtlModule->UpdateRegistryFromResource(x, 
bRegister);              \
        }
 
 #define DECLARE_NOT_AGGREGATABLE(x)                                            
                                                \
@@ -841,8 +847,8 @@
                newArray = reinterpret_cast<IUnknown **>(realloc(m_ppUnk, 
newSize * sizeof(IUnknown *)));
                if (newArray == NULL)
                        return 0;
+               m_ppUnk = newArray;
                memset(&m_ppUnk[m_nSize], 0, (newSize - m_nSize) * 
sizeof(IUnknown *));
-               m_ppUnk = newArray;
                m_nSize = newSize;
                m_ppUnk[m_nSize] = pUnk;
                return m_nSize + 1;
@@ -862,6 +868,15 @@
                return FALSE;
        }
 
+private:
+       CComDynamicUnkArray &operator = (const CComDynamicUnkArray &)
+       {
+               return *this;
+       }
+
+       CComDynamicUnkArray(const CComDynamicUnkArray &)
+       {
+       }
 };
 
 struct _ATL_CONNMAP_ENTRY

Modified: trunk/reactos/lib/atl/atlwin.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/atl/atlwin.h?rev=51763&r1=51762&r2=51763&view=diff
==============================================================================
--- trunk/reactos/lib/atl/atlwin.h [iso-8859-1] (original)
+++ trunk/reactos/lib/atl/atlwin.h [iso-8859-1] Sun May 15 14:40:53 2011
@@ -24,7 +24,7 @@
 #define GCCU(x)        x __attribute__((unused))
 #define Unused(x)
 #else
-#define GCCU(x) x
+#define GCCU(x)
 #define Unused(x)      (x);
 #endif // __GNUC__
 
@@ -353,6 +353,11 @@
                return ::ShowWindow(m_hWnd, nCmdShow);
        }
 
+       BOOL UpdateWindow()
+       {
+               ATLASSERT(::IsWindow(m_hWnd));
+               return ::UpdateWindow(m_hWnd);
+       }
 };
 
 _declspec(selectany) RECT CWindow::rcDefault = { CW_USEDEFAULT, CW_USEDEFAULT, 
0, 0 };
@@ -770,6 +775,8 @@
 
        ATOM Register(WNDPROC *p)
        {
+               if (m_wc.hInstance == NULL)
+                       m_wc.hInstance = _AtlBaseModule.GetModuleInstance();
                if (m_atom == 0)
                        m_atom = RegisterClassEx(&m_wc);
                return m_atom;

Modified: trunk/reactos/lib/atl/statreg.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/atl/statreg.h?rev=51763&r1=51762&r2=51763&view=diff
==============================================================================
--- trunk/reactos/lib/atl/statreg.h [iso-8859-1] (original)
+++ trunk/reactos/lib/atl/statreg.h [iso-8859-1] Sun May 15 14:40:53 2011
@@ -89,13 +89,26 @@
                rep_list                                                        
*new_rep;
 
                new_rep = reinterpret_cast<rep_list 
*>(HeapAlloc(GetProcessHeap(), 0, sizeof(rep_list)));
+               if (new_rep == NULL)
+                       return E_OUTOFMEMORY;
 
                new_rep->key_len  = lstrlenW(key);
                new_rep->key = reinterpret_cast<OLECHAR 
*>(HeapAlloc(GetProcessHeap(), 0, (new_rep->key_len + 1) * sizeof(OLECHAR)));
+               if (new_rep->key == NULL)
+               {
+                       HeapFree(GetProcessHeap(), 0, new_rep);
+                       return E_OUTOFMEMORY;
+               }
                memcpy(new_rep->key, key, (new_rep->key_len + 1) * 
sizeof(OLECHAR));
 
                len = lstrlenW(item) + 1;
                new_rep->item = reinterpret_cast<OLECHAR 
*>(HeapAlloc(GetProcessHeap(), 0, len * sizeof(OLECHAR)));
+               if (new_rep->item == NULL)
+               {
+                       HeapFree(GetProcessHeap(), 0, new_rep->key);
+                       HeapFree(GetProcessHeap(), 0, new_rep);
+                       return E_OUTOFMEMORY;
+               }
                memcpy(new_rep->item, item, len * sizeof(OLECHAR));
 
                new_rep->next = m_rep;
@@ -205,25 +218,34 @@
                return RegDeleteKey(parentKey, subKeyName);
        }
 
-       void strbuf_init(strbuf *buf)
+       HRESULT strbuf_init(strbuf *buf)
        {
                buf->str = 
reinterpret_cast<LPOLESTR>(HeapAlloc(GetProcessHeap(), 0, 128 * sizeof(WCHAR)));
+               if (buf->str == NULL)
+                       return E_OUTOFMEMORY;
                buf->alloc = 128;
                buf->len = 0;
-       }
-
-       void strbuf_write(LPCOLESTR str, strbuf *buf, int len)
-       {
+               return S_OK;
+       }
+
+       HRESULT strbuf_write(LPCOLESTR str, strbuf *buf, int len)
+       {
+               LPOLESTR                                                        
newBuffer;
+
                if (len == -1)
                        len = lstrlenW(str);
-               if (buf->len+len+1 >= buf->alloc)
+               if (buf->len + len + 1 >= buf->alloc)
                {
                        buf->alloc = (buf->len + len) * 2;
-                       buf->str = 
reinterpret_cast<LPOLESTR>(HeapReAlloc(GetProcessHeap(), 0, buf->str, 
buf->alloc * sizeof(WCHAR)));
+                       newBuffer = 
reinterpret_cast<LPOLESTR>(HeapReAlloc(GetProcessHeap(), 0, buf->str, 
buf->alloc * sizeof(WCHAR)));
+                       if (newBuffer == NULL)
+                               return E_OUTOFMEMORY;
+                       buf->str = newBuffer;
                }
                memcpy(buf->str + buf->len, str, len * sizeof(OLECHAR));
                buf->len += len;
                buf->str[buf->len] = '\0';
+               return S_OK;
        }
 
 
@@ -242,11 +264,18 @@
                {
                        filelen = GetFileSize(file, NULL);
                        regstra = 
reinterpret_cast<LPSTR>(HeapAlloc(GetProcessHeap(), 0, filelen));
+                       if (regstra == NULL)
+                               return E_OUTOFMEMORY;
                        lres = ReadFile(file, regstra, filelen, NULL, NULL);
                        if (lres == ERROR_SUCCESS)
                        {
                                len = MultiByteToWideChar(CP_ACP, 0, regstra, 
filelen, NULL, 0) + 1;
                                regstrw = 
reinterpret_cast<LPWSTR>(HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len * 
sizeof(WCHAR)));
+                               if (regstra == NULL)
+                               {
+                                       HeapFree(GetProcessHeap(), 0, regstra);
+                                       return E_OUTOFMEMORY;
+                               }
                                MultiByteToWideChar(CP_ACP, 0, regstra, 
filelen, regstrw, len);
                                regstrw[len - 1] = '\0';
 
@@ -291,6 +320,8 @@
                                {
                                        len = MultiByteToWideChar(CP_ACP, 0, 
reinterpret_cast<LPCSTR>(regstra), reslen, NULL, 0) + 1;
                                        regstrw = 
reinterpret_cast<LPWSTR>(HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len * 
sizeof(WCHAR)));
+                                       if (regstrw == NULL)
+                                               return E_OUTOFMEMORY;
                                        MultiByteToWideChar(CP_ACP, 0, 
reinterpret_cast<LPCSTR>(regstra), reslen, regstrw, len);
                                        regstrw[len - 1] = '\0';
 
@@ -316,7 +347,9 @@
                strbuf                                                          
buf;
                HRESULT                                                         
hResult;
 
-               strbuf_init(&buf);
+               hResult = strbuf_init(&buf);
+               if (FAILED(hResult))
+                       return hResult;
                hResult = do_preprocess(data, &buf);
                if (SUCCEEDED(hResult))
                {
@@ -334,12 +367,15 @@
                LPCOLESTR                                                       
iter;
                LPCOLESTR                                                       
iter2;
                rep_list                                                        
*rep_iter;
+               HRESULT                                                         
hResult;
 
                iter2 = data;
                iter = wcschr(data, '%');
                while (iter)
                {
-                       strbuf_write(iter2, buf, static_cast<int>(iter - 
iter2));
+                       hResult = strbuf_write(iter2, buf, 
static_cast<int>(iter - iter2));
+                       if (FAILED(hResult))
+                               return hResult;
 
                        iter2 = ++iter;
                        if (!*iter2)
@@ -349,7 +385,11 @@
                                return DISP_E_EXCEPTION;
 
                        if (iter == iter2)
-                               strbuf_write(_T("%"), buf, 1);
+                       {
+                               hResult = strbuf_write(_T("%"), buf, 1);
+                               if (FAILED(hResult))
+                                       return hResult;
+                       }
                        else
                        {
                                for (rep_iter = m_rep; rep_iter; rep_iter = 
rep_iter->next)
@@ -360,14 +400,18 @@
                                if (!rep_iter)
                                        return DISP_E_EXCEPTION;
 
-                               strbuf_write(rep_iter->item, buf, -1);
+                               hResult = strbuf_write(rep_iter->item, buf, -1);
+                               if (FAILED(hResult))
+                                       return hResult;
                        }
 
                        iter2 = ++iter;
                        iter = wcschr(iter, '%');
                }
 
-               strbuf_write(iter2, buf, -1);
+               hResult = strbuf_write(iter2, buf, -1);
+               if (FAILED(hResult))
+                       return hResult;
 
                return S_OK;
        }
@@ -376,6 +420,7 @@
        {
                LPCOLESTR                                                       
iter;
                LPCOLESTR                                                       
iter2;
+               HRESULT                                                         
hResult;
 
                iter2 = *str;
                buf->len = 0;
@@ -392,7 +437,9 @@
 
                if (*iter == '}' || *iter == '=')
                {
-                       strbuf_write(iter++, buf, 1);
+                       hResult = strbuf_write(iter++, buf, 1);
+                       if (FAILED(hResult))
+                               return hResult;
                }
                else if (*iter == '\'')
                {
@@ -403,20 +450,36 @@
                                *str = iter;
                                return DISP_E_EXCEPTION;
                        }
-                       strbuf_write(iter2, buf, static_cast<int>(iter - 
iter2));
+                       hResult = strbuf_write(iter2, buf, 
static_cast<int>(iter - iter2));
+                       if (FAILED(hResult))
+                               return hResult;
                        iter++;
                }
                else
                {
                        while (*iter && !iswspace(*iter))
                                iter++;
-                       strbuf_write(iter2, buf, static_cast<int>(iter - 
iter2));
+                       hResult = strbuf_write(iter2, buf, 
static_cast<int>(iter - iter2));
+                       if (FAILED(hResult))
+                               return hResult;
                }
 
                while (iswspace(*iter))
                        iter++;
                *str = iter;
                return S_OK;
+       }
+
+       inline unsigned int HexToBin(char a)
+       {
+               if (a >= '0' && a <= '9')
+                       return a - 0x30;
+               if (a >= 'A' && a <= 'F')
+                       return a - 'A' + 10;
+               if (a >= 'a' && a <= 'f')
+                       return a - 'a' + 10;
+               ATLASSERT(false);
+               return 0;
        }
 
        HRESULT do_process_key(LPCOLESTR *pstr, HKEY parent_key, strbuf *buf, 
BOOL do_register)
@@ -446,7 +509,9 @@
                hres = get_word(&iter, buf);
                if (FAILED(hres))
                        return hres;
-               strbuf_init(&name);
+               hres = strbuf_init(&name);
+               if (FAILED(hres))
+                       return hres;
 
                while(buf->str[1] || buf->str[0] != '}')
                {
@@ -463,7 +528,7 @@
                        if (key_type != NORMAL)
                        {
                                hres = get_word(&iter, buf);
-                               if(FAILED(hres))
+                               if (FAILED(hres))
                                        break;
                        }
            
@@ -472,7 +537,9 @@
                                if (key_type == IS_VAL)
                                {
                                        hkey = parent_key;
-                                       strbuf_write(buf->str, &name, -1);
+                                       hres = strbuf_write(buf->str, &name, 
-1);
+                                       if (FAILED(hres))
+                                               return hres;
                                }
                                else if (key_type == DO_DELETE)
                                {
@@ -492,7 +559,9 @@
                        }
                        else if (key_type != IS_VAL && key_type != DO_DELETE)
                        {
-                               strbuf_write(buf->str, &name, -1);
+                               hres = strbuf_write(buf->str, &name, -1);
+                               if (FAILED(hres))
+                                       return hres;
                                lres = RegOpenKey(parent_key, buf->str, &hkey);
                                if (lres != ERROR_SUCCESS)
                                {
@@ -521,31 +590,50 @@
                                                        lres = 
RegSetValueEx(hkey, name.len ? name.str :  NULL, 0, REG_SZ, (PBYTE)buf->str,
                                                                        
(lstrlenW(buf->str) + 1) * sizeof(WCHAR));
                                                        if (lres != 
ERROR_SUCCESS)
-                                                       {
                                                                hres = 
HRESULT_FROM_WIN32(lres);
+                                                       break;
+                                               case 'e':
+                                                       hres = get_word(&iter, 
buf);
+                                                       if (FAILED(hres))
                                                                break;
-                                                       }
+                                                       lres = 
RegSetValueEx(hkey, name.len ? name.str :  NULL, 0, REG_EXPAND_SZ, 
(PBYTE)buf->str,
+                                                                       
(lstrlenW(buf->str) + 1) * sizeof(WCHAR));
+                                                       if (lres != 
ERROR_SUCCESS)
+                                                               hres = 
HRESULT_FROM_WIN32(lres);
                                                        break;
                                                case 'd':
                                                        {
+                                                               hres = 
get_word(&iter, buf);
+                                                               if 
(FAILED(hres))
+                                                                       break;
                                                                WCHAR *end;
                                                                DWORD dw;
-                                                               if(*iter == '0' 
&& iter[1] == 'x')
-                                                               {
-                                                                       iter += 
2;
-                                                                       dw = 
wcstol(iter, &end, 16);
-                                                               }
+                                                               if 
((buf->str[0] == '0' && buf->str[1] == 'x') || (buf->str[0] == '&' && 
buf->str[1] == 'H'))
+                                                                       dw = 
wcstoul(&buf->str[2], &end, 16);
                                                                else
-                                                               {
-                                                                       dw = 
wcstol(iter, &end, 10);
-                                                               }
-                                                               iter = end;
+                                                                       dw = 
wcstol(&buf->str[0], &end, 10);
                                                                lres = 
RegSetValueEx(hkey, name.len ? name.str :  NULL, 0, REG_DWORD, (PBYTE)&dw, 
sizeof(dw));
                                                                if (lres != 
ERROR_SUCCESS)
-                                                               {
                                                                        hres = 
HRESULT_FROM_WIN32(lres);
+                                                               break;
+                                                       }
+                                               case 'b':
+                                                       {
+                                                               DWORD           
        count;
+                                                               DWORD           
        curIndex;
+
+                                                               hres = 
get_word(&iter, buf);
+                                                               if 
(FAILED(hres))
                                                                        break;
-                                                               }
+                                                               count = 
buf->len;
+                                                               if ((count & 1) 
!= 0)
+                                                                       return 
DISP_E_EXCEPTION;
+                                                               count = count / 
2;
+                                                               for (curIndex = 
0; curIndex < count; curIndex++)
+                                                                       
buf->str[curIndex] = (HexToBin(buf->str[curIndex * 2]) << 4) | 
HexToBin(buf->str[curIndex * 2 + 1]);
+                                                               lres = 
RegSetValueEx(hkey, name.len ? name.str :  NULL, 0, REG_BINARY, 
(PBYTE)buf->str, count);
+                                                               if (lres != 
ERROR_SUCCESS)
+                                                                       hres = 
HRESULT_FROM_WIN32(lres);
                                                                break;
                                                        }
                                                default:
@@ -628,9 +716,10 @@
                };
 
                iter = data;
-               hResult = S_OK;
-
-               strbuf_init(&buf);
+
+               hResult = strbuf_init(&buf);
+               if (FAILED(hResult))
+                       return hResult;
                hResult = get_word(&iter, &buf);
                if (FAILED(hResult))
                        return hResult;


Reply via email to