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