atl: improvment of registrar

Jacek Caban jack at itma.pwr.wroc.pl
Thu Mar 17 15:47:41 CST 2005


Changelog:
    Key may have only one of attributes
-------------- next part --------------
Index: dlls/atl/registrar.c
===================================================================
RCS file: /home/wine/wine/dlls/atl/registrar.c,v
retrieving revision 1.3
diff -u -p -r1.3 registrar.c
--- dlls/atl/registrar.c	17 Mar 2005 10:24:42 -0000	1.3
+++ dlls/atl/registrar.c	17 Mar 2005 21:37:11 -0000
@@ -192,11 +192,18 @@ static HRESULT do_preprocess(Registrar *
 static HRESULT do_process_key(LPCOLESTR *pstr, HKEY parent_key, strbuf *buf, BOOL do_register)
 {
     LPCOLESTR iter = *pstr;
-    BOOL no_remove = FALSE, is_val = FALSE, force_remove = FALSE, do_delete = FALSE;
     HRESULT hres;
     LONG lres;
     HKEY hkey = 0;
     strbuf name;
+    
+    enum {
+        NORMAL,
+        NO_REMOVE,
+        IS_VAL,
+        FORCE_REMOVE,
+        DO_DELETE
+    } key_type = NORMAL; 
 
     static const WCHAR wstrNoRemove[] = {'N','o','R','e','m','o','v','e',0};
     static const WCHAR wstrForceRemove[] = {'F','o','r','c','e','R','e','m','o','v','e',0};
@@ -210,128 +217,134 @@ static HRESULT do_process_key(LPCOLESTR 
     strbuf_init(&name);
 
     while(buf->str[1] || buf->str[0] != '}') {
-        if(!lstrcmpW(buf->str, wstrNoRemove)) {
-            no_remove = TRUE;
-        }else if(!lstrcmpW(buf->str, wstrForceRemove)) {
-            force_remove = TRUE;
-        }else if(!lstrcmpW(buf->str, wstrval)) {
-            is_val = TRUE;
-        }else if(!lstrcmpW(buf->str, wstrDelete)) {
-            do_delete = TRUE;
-        }else {
-            TRACE("name = %s\n", debugstr_w(buf->str));
+        key_type = NORMAL;
+        if(!lstrcmpW(buf->str, wstrNoRemove))
+            key_type = NO_REMOVE;
+        else if(!lstrcmpW(buf->str, wstrForceRemove))
+            key_type = FORCE_REMOVE;
+        else if(!lstrcmpW(buf->str, wstrval))
+            key_type = IS_VAL;
+        else if(!lstrcmpW(buf->str, wstrDelete))
+            key_type = DO_DELETE;
+
+        if(key_type != NORMAL) {
+            hres = get_word(&iter, buf);
+            if(FAILED(hres))
+                break;
+        }
+        TRACE("name = %s\n", debugstr_w(buf->str));
+    
+        if(do_register) {
+            if(key_type == IS_VAL) {
+                hkey = parent_key;
+                strbuf_write(buf->str, &name, -1);
+            }else if(key_type == DO_DELETE) {
+                TRACE("Deleting %s\n", debugstr_w(buf->str));
+                lres = SHDeleteKeyW(parent_key, buf->str);
+            }else {
+                if(key_type == FORCE_REMOVE)
+                    SHDeleteKeyW(parent_key, buf->str);
+                lres = RegCreateKeyW(parent_key, buf->str, &hkey);
+                if(lres != ERROR_SUCCESS) {
+                    WARN("Could not create(open) key: %08lx\n", lres);
+                    hres = HRESULT_FROM_WIN32(lres);
+                    break;
+                }
+            }
+        }else if(key_type != IS_VAL && key_type != DO_DELETE) {
+            strbuf_write(buf->str, &name, -1);
+            lres = RegOpenKeyW(parent_key, buf->str, &hkey);
+              if(lres != ERROR_SUCCESS)
+                WARN("Could not open key %s: %08lx\n", debugstr_w(name.str), lres);
+        }
+
+        if(key_type != DO_DELETE && *iter == '=') {
+            iter++;
+            hres = get_word(&iter, buf);
+            if(FAILED(hres))
+                break;
+            if(buf->len != 1) {
+                WARN("Wrong registry type: %s\n", debugstr_w(buf->str));
+                hres = DISP_E_EXCEPTION;
+                break;
+            }
             if(do_register) {
-                if(is_val) {
-                    if(force_remove || no_remove || do_delete) {
-                        WARN("Attribites for value!\n");
-                        hres = DISP_E_EXCEPTION;
+                switch(buf->str[0]) {
+                case 's':
+                    hres = get_word(&iter, buf);
+                    if(FAILED(hres))
                         break;
-                    }
-                    hkey = parent_key;
-                    strbuf_write(buf->str, &name, -1);
-                }else if(do_delete) {
-                    TRACE("Deleting %s\n", debugstr_w(buf->str));
-                    lres = SHDeleteKeyW(parent_key, buf->str);
-                }else {
-                    if(force_remove)
-                        SHDeleteKeyW(parent_key, buf->str);
-                    lres = RegCreateKeyW(parent_key, buf->str, &hkey);
+                    lres = RegSetValueExW(hkey, name.len ? name.str :  NULL, 0, REG_SZ, (PBYTE)buf->str,
+                            (lstrlenW(buf->str)+1)*sizeof(WCHAR));
                     if(lres != ERROR_SUCCESS) {
-                        WARN("Could not create(open) key: %08lx\n", lres);
+                        WARN("Could set value of key: %08lx\n", lres);
                         hres = HRESULT_FROM_WIN32(lres);
                         break;
                     }
-                }
-            }else if(!is_val && !do_delete) {
-                strbuf_write(buf->str, &name, -1);
-                lres = RegOpenKeyW(parent_key, buf->str, &hkey);
-                if(lres != ERROR_SUCCESS)
-                    WARN("Could not open key %s: %08lx\n", debugstr_w(name.str), lres);
-            }
-            if(!do_delete && *iter == '=') {
-                iter++;
-                hres = get_word(&iter, buf);
-                if(FAILED(hres))
-                    break;
-                if(buf->len != 1) {
-                    WARN("Wrong registry type: %s\n", debugstr_w(buf->str));
-                    hres = DISP_E_EXCEPTION;
                     break;
-                }
-                if(do_register) {
-                    switch(buf->str[0]) {
-                    case 's':
-                        hres = get_word(&iter, buf);
-                        if(FAILED(hres))
-                            break;
-                        lres = RegSetValueExW(hkey, name.len ? name.str :  NULL, 0, REG_SZ, (PBYTE)buf->str,
-                                (lstrlenW(buf->str)+1)*sizeof(WCHAR));
-                        if(lres != ERROR_SUCCESS) {
-                            WARN("Could set value of key: %08lx\n", lres);
-                            hres = HRESULT_FROM_WIN32(lres);
-                            break;
-                        }
-                        break;
-                    case 'd': {
-                        DWORD dw;
-                        if(*iter == '0' && iter[1] == 'x') {
-                            iter += 2;
-                            dw = strtolW(iter, (WCHAR**)&iter, 16);
-                        }else {
-                            dw = strtolW(iter, (WCHAR**)&iter, 10);
-                        }
-                        lres = RegSetValueExW(hkey, name.len ? name.str :  NULL, 0, REG_DWORD,
-                                (PBYTE)&dw, sizeof(dw));
-                        if(lres != ERROR_SUCCESS) {
-                            WARN("Could set value of key: %08lx\n", lres);
-                            hres = HRESULT_FROM_WIN32(lres);
-                            break;
-                        }
-                        break;
+                case 'd': {
+                    DWORD dw;
+                    if(*iter == '0' && iter[1] == 'x') {
+                        iter += 2;
+                        dw = strtolW(iter, (WCHAR**)&iter, 16);
+                    }else {
+                        dw = strtolW(iter, (WCHAR**)&iter, 10);
                     }
-                    default:
-                        WARN("Wrong resource type: %s\n", debugstr_w(buf->str));
-                        hres = DISP_E_EXCEPTION;
-                    };
-                    if(FAILED(hres))
-                        break;
-                }else {
-                    if(*iter == '-')
-                        iter++;
-                    hres = get_word(&iter, buf);
-                    if(FAILED(hres))
+                    lres = RegSetValueExW(hkey, name.len ? name.str :  NULL, 0, REG_DWORD,
+                            (PBYTE)&dw, sizeof(dw));
+                    if(lres != ERROR_SUCCESS) {
+                        WARN("Could set value of key: %08lx\n", lres);
+                        hres = HRESULT_FROM_WIN32(lres);
                         break;
+                    }
+                    break;
                 }
-            }else if(is_val) {
-                WARN("value not set!\n");
-                hres = DISP_E_EXCEPTION;
-                break;
-            }
-            if(!is_val && !do_delete && *iter == '{') {
-                hres = get_word(&iter, buf);
+                default:
+                    WARN("Wrong resource type: %s\n", debugstr_w(buf->str));
+                    hres = DISP_E_EXCEPTION;
+                };
                 if(FAILED(hres))
                     break;
-                hres = do_process_key(&iter, hkey, buf, do_register);
+            }else {
+                if(*iter == '-')
+                    iter++;
+                hres = get_word(&iter, buf);
                 if(FAILED(hres))
                     break;
             }
-            if(!do_register && !do_delete && !is_val && !no_remove) {
-                TRACE("Deleting %s\n", debugstr_w(name.str));
-                RegDeleteKeyW(parent_key, name.str);
-            }
-            if(hkey && !is_val)
-                RegCloseKey(hkey);
-            hkey = 0;
-            name.len = 0;
-            no_remove = is_val = force_remove = do_delete = FALSE;
+        }else if(key_type == IS_VAL) {
+            WARN("value not set!\n");
+            hres = DISP_E_EXCEPTION;
+            break;
+        }
+
+        if(key_type != IS_VAL && key_type != DO_DELETE && *iter == '{') {
+            hres = get_word(&iter, buf);
+            if(FAILED(hres))
+                break;
+            hres = do_process_key(&iter, hkey, buf, do_register);
+            if(FAILED(hres))
+                break;
         }
+
+        TRACE("%x %x\n", do_register, key_type);
+        if(!do_register && (key_type == NORMAL || key_type == FORCE_REMOVE)) {
+            TRACE("Deleting %s\n", debugstr_w(name.str));
+            RegDeleteKeyW(parent_key, name.str);
+        }
+
+        if(hkey && key_type != IS_VAL)
+            RegCloseKey(hkey);
+        hkey = 0;
+        name.len = 0;
+        
         hres = get_word(&iter, buf);
         if(FAILED(hres))
             break;
     }
 
     HeapFree(GetProcessHeap(), 0, name.str);
-    if(hkey && !is_val)
+    if(hkey && key_type != IS_VAL)
         RegCloseKey(hkey);
     *pstr = iter;
     return hres;


More information about the wine-patches mailing list