Use the new protocol.def file to build the request structures.

Define protocol structures in a separate server_protocol.h file.
Removed __WINE_SERVER__ checks now that all includes are in the right
directory.
This commit is contained in:
Alexandre Julliard 2001-07-19 00:35:37 +00:00
parent 020146619c
commit 37ec927536
10 changed files with 1497 additions and 89 deletions

View File

@ -1,4 +1,4 @@
DEFS = -D__WINE__ -D__WINE_SERVER__ DEFS = -D__WINE__
TOPSRCDIR = @top_srcdir@ TOPSRCDIR = @top_srcdir@
TOPOBJDIR = .. TOPOBJDIR = ..
SRCDIR = @srcdir@ SRCDIR = @srcdir@

View File

@ -7,13 +7,9 @@
#ifndef __WINE_SERVER_HANDLE_H #ifndef __WINE_SERVER_HANDLE_H
#define __WINE_SERVER_HANDLE_H #define __WINE_SERVER_HANDLE_H
#ifndef __WINE_SERVER__
#error This file can only be used in the Wine server
#endif
#include <stdlib.h> #include <stdlib.h>
#include "windef.h" #include "windef.h"
#include "server.h" #include "wine/server_protocol.h"
struct process; struct process;
struct object_ops; struct object_ops;

View File

@ -7,13 +7,9 @@
#ifndef __WINE_SERVER_OBJECT_H #ifndef __WINE_SERVER_OBJECT_H
#define __WINE_SERVER_OBJECT_H #define __WINE_SERVER_OBJECT_H
#ifndef __WINE_SERVER__
#error This file can only be used in the Wine server
#endif
#include <sys/poll.h> #include <sys/poll.h>
#include <sys/time.h> #include <sys/time.h>
#include "server.h" #include "wine/server_protocol.h"
#define DEBUG_OBJECTS #define DEBUG_OBJECTS

View File

@ -7,10 +7,6 @@
#ifndef __WINE_SERVER_PROCESS_H #ifndef __WINE_SERVER_PROCESS_H
#define __WINE_SERVER_PROCESS_H #define __WINE_SERVER_PROCESS_H
#ifndef __WINE_SERVER__
#error This file can only be used in the Wine server
#endif
#include "object.h" #include "object.h"
struct msg_queue; struct msg_queue;

1364
server/protocol.def Normal file

File diff suppressed because it is too large Load Diff

View File

@ -30,7 +30,6 @@
#include "wincon.h" #include "wincon.h"
#include "thread.h" #include "thread.h"
#include "process.h" #include "process.h"
#include "server.h"
#define WANT_REQUEST_HANDLERS #define WANT_REQUEST_HANDLERS
#include "request.h" #include "request.h"
#include "wine/port.h" #include "wine/port.h"

View File

@ -7,11 +7,8 @@
#ifndef __WINE_SERVER_REQUEST_H #ifndef __WINE_SERVER_REQUEST_H
#define __WINE_SERVER_REQUEST_H #define __WINE_SERVER_REQUEST_H
#ifndef __WINE_SERVER__
#error This file can only be used in the Wine server
#endif
#include "thread.h" #include "thread.h"
#include "wine/server_protocol.h"
/* max request length */ /* max request length */
#define MAX_REQUEST_LENGTH 8192 #define MAX_REQUEST_LENGTH 8192

View File

@ -7,10 +7,6 @@
#ifndef __WINE_SERVER_THREAD_H #ifndef __WINE_SERVER_THREAD_H
#define __WINE_SERVER_THREAD_H #define __WINE_SERVER_THREAD_H
#ifndef __WINE_SERVER__
#error This file can only be used in the Wine server
#endif
#include "object.h" #include "object.h"
/* thread structure */ /* thread structure */

View File

@ -7,10 +7,6 @@
#ifndef __WINE_SERVER_UNICODE_H #ifndef __WINE_SERVER_UNICODE_H
#define __WINE_SERVER_UNICODE_H #define __WINE_SERVER_UNICODE_H
#ifndef __WINE_SERVER__
#error This file can only be used in the Wine server
#endif
#include "windef.h" #include "windef.h"
#include "wine/unicode.h" #include "wine/unicode.h"
#include "object.h" #include "object.h"

View File

@ -1,7 +1,7 @@
#! /usr/bin/perl -w #! /usr/bin/perl -w
# #
# Build the server/trace.c and server/request.h files # Build the server/trace.c and server/request.h files
# from the contents of include/server.h. # from the contents of include/wine/server.h.
# #
# Copyright (C) 1998 Alexandre Julliard # Copyright (C) 1998 Alexandre Julliard
# #
@ -21,18 +21,38 @@
my @requests = (); my @requests = ();
my %replies = (); my %replies = ();
open(SERVER,"include/server.h") or die "Can't open include/server.h";
### Parse server.h to find request/reply structure definitions
my @trace_lines = (); my @trace_lines = ();
my $protocol = 0; # server protocol version
while (<SERVER>) # Get the server protocol version
{ my $protocol = &GET_PROTOCOL_VERSION;
if (/^struct +(\w+)_request/) { &DO_REQUEST($1); }
if (/^\#define SERVER_PROTOCOL_VERSION (\d+)/) { $protocol = $1 + 1; } ### Create server_protocol.h and print header
}
open SERVER_PROT, ">include/wine/server_protocol.h" or die "Cannot create include/wine/server_protocol.h";
print SERVER_PROT "/*\n * Wine server protocol definitions\n *\n";
print SERVER_PROT " * This file is automatically generated; DO NO EDIT!\n";
print SERVER_PROT " * Edit server/protocol.def instead and re-run tools/make_requests\n";
print SERVER_PROT " */\n\n";
print SERVER_PROT "#ifndef __WINE_WINE_SERVER_PROTOCOL_H\n";
print SERVER_PROT "#define __WINE_WINE_SERVER_PROTOCOL_H\n";
### Parse requests to find request/reply structure definitions
&PARSE_REQUESTS;
### Build the request list
print SERVER_PROT "\n\nenum request\n{\n";
foreach $req (@requests) { print SERVER_PROT " REQ_$req,\n"; }
print SERVER_PROT " REQ_NB_REQUESTS\n};\n\n";
print SERVER_PROT "union generic_request\n{\n";
print SERVER_PROT " struct request_max_size max_size;\n";
print SERVER_PROT " struct request_header header;\n";
foreach $req (@requests) { print SERVER_PROT " struct ${req}_request $req;\n"; }
print SERVER_PROT "};\n\n";
printf SERVER_PROT "#define SERVER_PROTOCOL_VERSION %d\n\n", $protocol + 1;
print SERVER_PROT "#endif /* __WINE_WINE_SERVER_PROTOCOL_H */\n";
close SERVER_PROT;
### Output the dumping function tables ### Output the dumping function tables
@ -59,22 +79,6 @@ push @trace_lines, "};\n";
REPLACE_IN_FILE( "server/trace.c", @trace_lines ); REPLACE_IN_FILE( "server/trace.c", @trace_lines );
### Replace the request list in server.h by the new values
my @server_lines = ();
push @server_lines, "enum request\n{\n";
foreach $req (@requests) { push @server_lines, " REQ_$req,\n"; }
push @server_lines, " REQ_NB_REQUESTS\n};\n\n";
push @server_lines, "union generic_request\n{\n";
push @server_lines, " struct request_max_size max_size;\n";
push @server_lines, " struct request_header header;\n";
foreach $req (@requests) { push @server_lines, " struct ${req}_request $req;\n"; }
push @server_lines, "};\n\n";
push @server_lines, "#define SERVER_PROTOCOL_VERSION $protocol\n";
REPLACE_IN_FILE( "include/server.h", @server_lines );
### Output the request handlers list ### Output the request handlers list
my @request_lines = (); my @request_lines = ();
@ -91,49 +95,62 @@ push @request_lines, "};\n#endif /* WANT_REQUEST_HANDLERS */\n";
REPLACE_IN_FILE( "server/request.h", @request_lines ); REPLACE_IN_FILE( "server/request.h", @request_lines );
### Handle a request structure definition ### Parse the request definitions
sub DO_REQUEST sub PARSE_REQUESTS
{ {
my $name = shift; # states: 0 = header 1 = declarations 2 = inside @REQ 3 = inside @REPLY
my $state = 0;
my $name = "";
my @in_struct = (); my @in_struct = ();
my @out_struct = (); my @out_struct = ();
my $got_header = 0;
while (<SERVER>) open(PROTOCOL,"server/protocol.def") or die "Can't open server/protocol.def";
while (<PROTOCOL>)
{ {
my ($dir, $type, $var); my ($type, $var);
last if /^};$/; # strip comments
next if /^{$/;
s!/\*.*\*/!!g; s!/\*.*\*/!!g;
next if /^\s*$/; # strip white space at end of line
if (/REQUEST_HEADER/) s/\s+$//;
if (/^\@HEADER/)
{ {
die "Duplicated header" if $got_header; die "Misplaced \@HEADER" unless $state == 0;
die "Header must be first" if ($#in_struct != -1 || $#out_struct != -1); $state++;
$got_header++;
next; next;
} }
if (/^\s*(IN|OUT)\s*VARARG\((\w+),(\w+)\)/)
# ignore everything while in state 0
next if $state == 0;
if (/^\@REQ\(\s*(\w+)\s*\)/)
{ {
$dir = $1; $name = $1;
$var = $2; die "Misplaced \@REQ" unless $state == 1;
$type = "&dump_varargs_" . $3; # start a new request
@in_struct = ();
@out_struct = ();
print SERVER_PROT "struct ${name}_request\n{\n";
print SERVER_PROT " struct request_header __header;\n";
$state++;
next;
} }
elsif (/^\s*(IN|OUT)\s*(\w+\**(\s+\w+\**)*)\s+(\w+)(\[[1]\])?;/)
if (/^\@REPLY/)
{ {
$dir = $1; die "Misplaced \@REPLY" unless $state == 2;
$type = $2 . ($5 || ""); $state++;
$var = $4; next;
die "Unrecognized type $type" unless (defined($formats{$type}) || $5);
} }
else
if (/^\@END/)
{ {
die "Unrecognized syntax $_"; die "Misplaced \@END" unless ($state == 2 || $state == 3);
} print SERVER_PROT "};\n";
if ($dir =~ /IN/) { push @in_struct, $type, $var; }
if ($dir =~ /OUT/) { push @out_struct, $type, $var; } # got a complete request
}
die "Missing header" unless $got_header;
push @requests, $name; push @requests, $name;
&DO_DUMP_FUNC( $name, "request", @in_struct); &DO_DUMP_FUNC( $name, "request", @in_struct);
if ($#out_struct >= 0) if ($#out_struct >= 0)
@ -141,6 +158,43 @@ sub DO_REQUEST
$replies{$name} = 1; $replies{$name} = 1;
&DO_DUMP_FUNC( $name, "reply", @out_struct); &DO_DUMP_FUNC( $name, "reply", @out_struct);
} }
$state = 1;
next;
}
if ($state != 1)
{
# skip empty lines (but keep them in output file)
if (/^$/)
{
print SERVER_PROT "\n";
next;
}
if (/^\s*VARARG\((\w+),(\w+)\)/)
{
$var = $1;
$type = "&dump_varargs_" . $2;
s!(VARARG\(.*\)\s*;)!/* $1 */!;
}
elsif (/^\s*(\w+\**(\s+\w+\**)*)\s+(\w+)(\[[1]\])?;/)
{
$type = $1 . ($4 || "");
$var = $3;
die "Unrecognized type $type" unless (defined($formats{$type}) || $4);
}
else
{
die "Unrecognized syntax $_";
}
if ($state == 2) { push @in_struct, $type, $var; }
if ($state == 3) { push @out_struct, $type, $var; }
}
# Pass it through into the output file
print SERVER_PROT $_ . "\n";
}
close PROTOCOL;
} }
### Generate a dumping function ### Generate a dumping function
@ -191,6 +245,20 @@ sub DO_DUMP_FUNC
push @trace_lines, "}\n\n"; push @trace_lines, "}\n\n";
} }
### Retrieve the server protocol version from the existing server_protocol.h file
sub GET_PROTOCOL_VERSION
{
my $protocol = 0;
open SERVER_PROT, "include/wine/server_protocol.h" or return 0;
while (<SERVER_PROT>)
{
if (/^\#define SERVER_PROTOCOL_VERSION (\d+)/) { $protocol = $1; last; }
}
close SERVER_PROT;
return $protocol;
}
### Replace the contents of a file between ### make_requests ### marks ### Replace the contents of a file between ### make_requests ### marks
sub REPLACE_IN_FILE sub REPLACE_IN_FILE