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

Patrick ragamuffin at datacomm.ch
Sun Mar 1 11:41:00 CST 2009


On Sam, 2009-02-28 at 19:04 -0600, Austin English wrote: 
> On Sat, Feb 28, 2009 at 7:04 PM, Austin English <austinenglish at gmail.com> wrote:
> > 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
> >
> 
> Err, make that http://wiki.winehq.org/SubmittingPatches
> 

Sorry, lenghty conformance tests & learning git would take me another
day.... It's unlikely that I'll do that before Christmas 2010 or so...
Thank you for the reply anyway!

In case anybody wants to use the code - put it through the whole
preocess - modify it or implement the idea in another way, he should
feel free to do so. It's hereby set free from any license/copyright or
other obstacles. You could even claim that you wrote it yourself ;-) I
won't mind. Just get it into wine somehow.

Patrick




More information about the wine-devel mailing list