storing the registry key class name to make PDFXChange-Viewer happy

Austin English austinenglish at gmail.com
Sat Feb 28 19:04:30 CST 2009


On Sat, Feb 28, 2009 at 12:37 AM, Patrick <ragamuffin at datacomm.ch> wrote:
> Dear Developpers of Wine
>
> I like wine and I like Tracker Software's PDFXChange-Viewer as well.
> http://www.docu-track.com/home/prod_user/PDF-XChange_Tools/pdfx_viewer
>
> So, today I was not getting any rest until i found out why these two
> won't work together nicely. I mean they DO, actually. But I'm kind of
> touchy. I was wondering all the time, why most of the settings I changed
> were not restored as I exited and restarted the app.
>
> I then discovered that if wineserver was preserved ("-p" option) beween
> restarts they WERE restored. Further investigations unveiled that the
> problem is triggered by the fact that wineserver is not storing the
> registry key class name attributes. Something M$ must have come up with
> in XP but that is not very wideley used. PDFXChange-Viewer however seems
> to rely on it when parsing it's preferences from the registry on
> startup.
>
> Wineservers unicode string handling gave me a though time in
> implementing a solution to this but i finally managed. You can see that
> I went quiet straightforward: adding the class name next to the key name
> in the {system,user}.reg files. There are two different versions of the
> fix. I would prefer the second one because it preserves backwards
> compatibility: In case the key class attribute is set, it is put in
> brackets between the key name and modification time. Otherwise nothing
> changes.
>
> It would be really nice if this could be somehow integrated into wine.
> (Not only because I worked on it for a whole day, but also because i
> really miss the feature because i don't want to reconfigure
> PDFXChange-Viewer every time i start it and also because I would like to
> make that functionality available to all of my friends and all linux
> users as well.
>
> Greets
>
> Patrick
>
>
> [Software\\Tracker Software\\PDFViewer\\FullScreen\\MainView\\Bars\\0011;ParamItem] 1235760987
> "Break"=dword:00000001
> "ID"=dword:000081c9
> "Name"="Properties"
>
> [Software\\Tracker Software\\PDFViewer\\FullScreen\\MainView\\Bars\\0011] [ParamItem] 1235761189
> "Break"=dword:00000001
> "ID"=dword:000081c9
> "Name"="Properties"
>
> --- registry.c  2009-02-27 19:44:14.000000000 +0100
> +++ registry.PP1.c      2009-02-27 19:49:03.000000000 +0100
> @@ -176,7 +176,7 @@
>         dump_path( key->parent, base, f );
>         fprintf( f, "\\\\" );
>     }
> -    dump_strW( key->name, key->namelen / sizeof(WCHAR), f, "[]" );
> +    dump_strW( key->name, key->namelen / sizeof(WCHAR), f, "[;" );
>  }
>
>  /* dump a value to a text file */
> @@ -245,6 +245,8 @@
>     {
>         fprintf( f, "\n[" );
>         if (key != base) dump_path( key, base, f );
> +        fprintf( f, ";" );
> +        dump_strW( key->class, key->classlen / sizeof(WCHAR), f, "[]" );
>         fprintf( f, "] %ld\n", (long)key->modif );
>         for (i = 0; i <= key->last_value; i++) dump_value( &key->values[i], f );
>     }
> @@ -1108,20 +1110,22 @@
>                              int prefix_len, struct file_load_info *info,
>                              int default_modif )
>  {
> -    WCHAR *p;
> -    struct unicode_str name;
> -    int res, modif;
> -    data_size_t len;
> +    WCHAR *p, cls[256];
> +    struct unicode_str name, class;
> +    int res, res2, modif;
> +    data_size_t len, len2 = 256;
>
>     if (!get_file_tmp_space( info, strlen(buffer) * sizeof(WCHAR) )) return NULL;
>
>     len = info->tmplen;
> -    if ((res = parse_strW( info->tmp, &len, buffer, ']' )) == -1)
> +    if ((res = parse_strW( info->tmp, &len, buffer, ';' )) == -1 ||
> +        (res2 = parse_strW( cls, &len2, buffer+res, ']' ) == -1))
>     {
>         file_read_error( "Malformed key", info );
>         return NULL;
>     }
> -    if (sscanf( buffer + res, " %d", &modif ) != 1) modif = default_modif;
> +
> +    if (sscanf( buffer + res + res2, " %d", &modif ) != 1) modif = default_modif;
>
>     p = info->tmp;
>     while (prefix_len && *p) { if (*p++ == '\\') prefix_len--; }
> @@ -1138,7 +1142,10 @@
>     }
>     name.str = p;
>     name.len = len - (p - info->tmp + 1) * sizeof(WCHAR);
> -    return create_key( base, &name, NULL, flags, modif, &res );
> +    class.str = cls;
> +    class.len = len2 - sizeof(WCHAR);
> +
> +    return create_key( base, &name, &class, flags, modif, &res );
>  }
>
>  /* parse a comma-separated list of hex digits */
>
>
> --- registry.c  2009-02-27 19:44:14.000000000 +0100
> +++ registry.PP2.c      2009-02-27 19:59:28.000000000 +0100
> @@ -245,6 +245,10 @@
>     {
>         fprintf( f, "\n[" );
>         if (key != base) dump_path( key, base, f );
> +        if (key->class != NULL) {
> +                fprintf( f, "] [" );
> +                dump_strW( key->class, key->classlen / sizeof(WCHAR), f, "[]" );
> +        }
>         fprintf( f, "] %ld\n", (long)key->modif );
>         for (i = 0; i <= key->last_value; i++) dump_value( &key->values[i], f );
>     }
> @@ -1108,10 +1112,10 @@
>                              int prefix_len, struct file_load_info *info,
>                              int default_modif )
>  {
> -    WCHAR *p;
> -    struct unicode_str name;
> -    int res, modif;
> -    data_size_t len;
> +    WCHAR *p, *c;
> +    struct unicode_str name, class;
> +    int res, c_res, modif;
> +    data_size_t len, c_len;
>
>     if (!get_file_tmp_space( info, strlen(buffer) * sizeof(WCHAR) )) return NULL;
>
> @@ -1121,6 +1125,23 @@
>         file_read_error( "Malformed key", info );
>         return NULL;
>     }
> +
> +    c_len = info->tmplen - len;
> +    if ((c_res = parse_strW( info->tmp + len / sizeof(WCHAR), &c_len, buffer + res, ']' )) == -1)
> +    {
> +        class.len = 0;
> +    }
> +    else
> +    {
> +       res += c_res;
> +
> +        c = info->tmp + len / sizeof(WCHAR);
> +        while (*c) { if (*c++ == '[') break; }
> +
> +        class.str = c;
> +        class.len = c_len - (c - (info->tmp + len / sizeof(WCHAR)) + 1) * sizeof(WCHAR);
> +    }
> +
>     if (sscanf( buffer + res, " %d", &modif ) != 1) modif = default_modif;
>
>     p = info->tmp;
> @@ -1138,6 +1159,9 @@
>     }
>     name.str = p;
>     name.len = len - (p - info->tmp + 1) * sizeof(WCHAR);
> +
> +    if (class.len > 0)
> +        return create_key( base, &name, &class, flags, modif, &res );
>     return create_key( base, &name, NULL, flags, modif, &res );
>  }
>
>
>
>
>
>

Patches should be sent in git diff format to wine-patches at winehq.org.

See http://wiki.winehq.org/Patching

Thanks for helping Wine!

-- 
-Austin



More information about the wine-devel mailing list