Alexandre Julliard : server: Save and load the registry class names to/ from disk files.

Alexandre Julliard julliard at winehq.org
Tue Feb 16 11:44:40 CST 2010


Module: wine
Branch: master
Commit: 2a378676ef8036dfde5abbb3abe978c652c86097
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2a378676ef8036dfde5abbb3abe978c652c86097

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Feb 16 12:26:15 2010 +0100

server: Save and load the registry class names to/from disk files.

---

 server/registry.c |   35 ++++++++++++++++++++++++++++++++---
 1 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/server/registry.c b/server/registry.c
index eb89800..2dc640e 100644
--- a/server/registry.c
+++ b/server/registry.c
@@ -246,13 +246,19 @@ static void save_subkeys( const struct key *key, const struct key *base, FILE *f
     int i;
 
     if (key->flags & KEY_VOLATILE) return;
-    /* save key if it has either some values or no subkeys */
+    /* save key if it has either some values or no subkeys, or needs special options */
     /* keys with no values but subkeys are saved implicitly by saving the subkeys */
-    if ((key->last_value >= 0) || (key->last_subkey == -1))
+    if ((key->last_value >= 0) || (key->last_subkey == -1) || key->class)
     {
         fprintf( f, "\n[" );
         if (key != base) dump_path( key, base, f );
         fprintf( f, "] %u\n", (unsigned int)((key->modif - ticks_1601_to_1970) / TICKS_PER_SEC) );
+        if (key->class)
+        {
+            fprintf( f, "#class=\"" );
+            dump_strW( key->class, key->classlen / sizeof(WCHAR), f, "\"\"" );
+            fprintf( f, "\"\n" );
+        }
         for (i = 0; i <= key->last_value; i++) dump_value( &key->values[i], f );
     }
     for (i = 0; i <= key->last_subkey; i++) save_subkeys( key->subkeys[i], base, f );
@@ -1224,6 +1230,27 @@ static struct key *load_key( struct key *base, const char *buffer, int flags,
     return create_key( base, &name, NULL, flags, 0, 0, modif, &res );
 }
 
+/* load a key option from the input file */
+static int load_key_option( struct key *key, const char *buffer, struct file_load_info *info )
+{
+    const char *p;
+    data_size_t len;
+
+    if (!strncmp( buffer, "#class=", 7 ))
+    {
+        p = buffer + 7;
+        if (*p++ != '"') return 0;
+        if (!get_file_tmp_space( info, strlen(p) * sizeof(WCHAR) )) return 0;
+        len = info->tmplen;
+        if (parse_strW( info->tmp, &len, p, '\"' ) == -1) return 0;
+        free( key->class );
+        if (!(key->class = memdup( info->tmp, len ))) len = 0;
+        key->classlen = len;
+    }
+    /* ignore unknown options */
+    return 1;
+}
+
 /* parse a comma-separated list of hex digits */
 static int parse_hex( unsigned char *dest, data_size_t *len, const char *buffer )
 {
@@ -1420,7 +1447,9 @@ static void load_keys( struct key *key, const char *filename, FILE *f, int prefi
             if (subkey) load_value( subkey, p, &info );
             else file_read_error( "Value without key", &info );
             break;
-        case '#':   /* comment */
+        case '#':   /* option */
+            if (subkey) load_key_option( subkey, p, &info );
+            break;
         case ';':   /* comment */
         case 0:     /* empty line */
             break;




More information about the wine-cvs mailing list