diff options
author | Lubos Lunak <l.lunak@ suse.cz> | 2006-03-14 12:45:34 +0000 |
---|---|---|
committer | Lubos Lunak <l.lunak@ suse.cz> | 2006-03-14 12:45:34 +0000 |
commit | 0fe5cc6c5a93357033eeaad97bd1a21c77212f85 (patch) | |
tree | f9547ee5be26853da72f24b7849ba0f7520bb0da | |
parent | 9eb4697960cdbbfa5f034123757afb66be1d8c62 (diff) |
Don't use structs for marshalling, marshall arguments directly.
-rw-r--r-- | kde/gen/comm_generated.c | 217 | ||||
-rw-r--r-- | kde/gen/gen.cpp | 154 | ||||
-rw-r--r-- | lib/comm.c | 154 |
3 files changed, 148 insertions, 377 deletions
diff --git a/kde/gen/comm_generated.c b/kde/gen/comm_generated.c index 65e3139..d1956e1 100644 --- a/kde/gen/comm_generated.c +++ b/kde/gen/comm_generated.c @@ -1,29 +1,11 @@ -int dapi_readCommand( DapiConnection* conn, int* comm, int* seq ) - { - command_header command; - if( readSocket( conn, ( char* ) &command, sizeof( command )) <= 0 ) - return 0; - if( command.magic != MAGIC ) - return 0; - *comm = command.command; - *seq = command.seq; - return 1; - } - int dapi_readCommandInit( DapiConnection* conn ) { - command_init command_; - if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 ) - return 0; return 1; } int dapi_readCommandOpenUrl( DapiConnection* conn, char** url ) { - command_openurl command_; - if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 ) - return 0; - *url = readString( conn, command_.url_len ); + *url = readString( conn ); if( *url == NULL ) { free( *url ); @@ -34,10 +16,7 @@ int dapi_readCommandOpenUrl( DapiConnection* conn, char** url ) int dapi_readCommandExecuteUrl( DapiConnection* conn, char** url ) { - command_executeurl command_; - if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 ) - return 0; - *url = readString( conn, command_.url_len ); + *url = readString( conn ); if( *url == NULL ) { free( *url ); @@ -48,19 +27,13 @@ int dapi_readCommandExecuteUrl( DapiConnection* conn, char** url ) int dapi_readCommandButtonOrder( DapiConnection* conn ) { - command_buttonorder command_; - if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 ) - return 0; return 1; } int dapi_readCommandRunAsUser( DapiConnection* conn, char** user, char** command ) { - command_runasuser command_; - if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 ) - return 0; - *user = readString( conn, command_.user_len ); - *command = readString( conn, command_.command_len ); + *user = readString( conn ); + *command = readString( conn ); if( *user == NULL || *command == NULL ) { free( *user ); @@ -72,25 +45,19 @@ int dapi_readCommandRunAsUser( DapiConnection* conn, char** user, char** command int dapi_readCommandSuspendScreensaving( DapiConnection* conn, int* suspend ) { - command_suspendscreensaving command_; - if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 ) - return 0; - *suspend = command_.suspend; + readSocket( conn, suspend, sizeof( *suspend )); return 1; } int dapi_readCommandMailTo( DapiConnection* conn, char** subject, char** body, char** to, char** cc, char** bcc, char*** attachments ) { - command_mailto command_; - if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 ) - return 0; - *subject = readString( conn, command_.subject_len ); - *body = readString( conn, command_.body_len ); - *to = readString( conn, command_.to_len ); - *cc = readString( conn, command_.cc_len ); - *bcc = readString( conn, command_.bcc_len ); - *attachments = readStringList( conn, command_.attachments_count ); + *subject = readString( conn ); + *body = readString( conn ); + *to = readString( conn ); + *cc = readString( conn ); + *bcc = readString( conn ); + *attachments = readStringList( conn ); if( *subject == NULL || *body == NULL || *to == NULL || *cc == NULL || *bcc == NULL || *attachments == NULL ) { free( *subject ); @@ -107,12 +74,9 @@ int dapi_readCommandMailTo( DapiConnection* conn, char** subject, char** body, c int dapi_readCommandLocalFile( DapiConnection* conn, char** remote, char** local, int* allow_download ) { - command_localfile command_; - if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 ) - return 0; - *allow_download = command_.allow_download; - *remote = readString( conn, command_.remote_len ); - *local = readString( conn, command_.local_len ); + *remote = readString( conn ); + *local = readString( conn ); + readSocket( conn, allow_download, sizeof( *allow_download )); if( *remote == NULL || *local == NULL ) { free( *remote ); @@ -124,12 +88,9 @@ int dapi_readCommandLocalFile( DapiConnection* conn, char** remote, char** local int dapi_readCommandUploadFile( DapiConnection* conn, char** local, char** file, int* remove_local ) { - command_uploadfile command_; - if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 ) - return 0; - *remove_local = command_.remove_local; - *local = readString( conn, command_.local_len ); - *file = readString( conn, command_.file_len ); + *local = readString( conn ); + *file = readString( conn ); + readSocket( conn, remove_local, sizeof( *remove_local )); if( *local == NULL || *file == NULL ) { free( *local ); @@ -141,10 +102,7 @@ int dapi_readCommandUploadFile( DapiConnection* conn, char** local, char** file, int dapi_readCommandRemoveTemporaryLocalFile( DapiConnection* conn, char** local ) { - command_removetemporarylocalfile command_; - if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 ) - return 0; - *local = readString( conn, command_.local_len ); + *local = readString( conn ); if( *local == NULL ) { free( *local ); @@ -155,73 +113,49 @@ int dapi_readCommandRemoveTemporaryLocalFile( DapiConnection* conn, char** local int dapi_readReplyInit( DapiConnection* conn, int* ok ) { - reply_init command_; - if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 ) - return 0; - *ok = command_.ok; + readSocket( conn, ok, sizeof( *ok )); return 1; } int dapi_readReplyOpenUrl( DapiConnection* conn, int* ok ) { - reply_openurl command_; - if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 ) - return 0; - *ok = command_.ok; + readSocket( conn, ok, sizeof( *ok )); return 1; } int dapi_readReplyExecuteUrl( DapiConnection* conn, int* ok ) { - reply_executeurl command_; - if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 ) - return 0; - *ok = command_.ok; + readSocket( conn, ok, sizeof( *ok )); return 1; } int dapi_readReplyButtonOrder( DapiConnection* conn, int* order ) { - reply_buttonorder command_; - if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 ) - return 0; - *order = command_.order; + readSocket( conn, order, sizeof( *order )); return 1; } int dapi_readReplyRunAsUser( DapiConnection* conn, int* ok ) { - reply_runasuser command_; - if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 ) - return 0; - *ok = command_.ok; + readSocket( conn, ok, sizeof( *ok )); return 1; } int dapi_readReplySuspendScreensaving( DapiConnection* conn, int* ok ) { - reply_suspendscreensaving command_; - if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 ) - return 0; - *ok = command_.ok; + readSocket( conn, ok, sizeof( *ok )); return 1; } int dapi_readReplyMailTo( DapiConnection* conn, int* ok ) { - reply_mailto command_; - if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 ) - return 0; - *ok = command_.ok; + readSocket( conn, ok, sizeof( *ok )); return 1; } int dapi_readReplyLocalFile( DapiConnection* conn, char** result ) { - reply_localfile command_; - if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 ) - return 0; - *result = readString( conn, command_.result_len ); + *result = readString( conn ); if( *result == NULL ) { free( *result ); @@ -232,79 +166,50 @@ int dapi_readReplyLocalFile( DapiConnection* conn, char** result ) int dapi_readReplyUploadFile( DapiConnection* conn, int* ok ) { - reply_uploadfile command_; - if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 ) - return 0; - *ok = command_.ok; + readSocket( conn, ok, sizeof( *ok )); return 1; } int dapi_readReplyRemoveTemporaryLocalFile( DapiConnection* conn, int* ok ) { - reply_removetemporarylocalfile command_; - if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 ) - return 0; - *ok = command_.ok; + readSocket( conn, ok, sizeof( *ok )); return 1; } -static void writeCommand( DapiConnection* conn, int com, int seq ) - { - command_header command; - command.magic = MAGIC; - command.seq = seq; - command.command = com; - writeSocket( conn, ( char* ) &command, sizeof( command )); - } - int dapi_writeCommandInit( DapiConnection* conn ) { - command_init command_; int seq = getNextSeq( conn ); writeCommand( conn, DAPI_COMMAND_INIT, seq ); - writeSocket( conn, ( char* ) &command_, sizeof( command_ )); return seq; } int dapi_writeCommandOpenUrl( DapiConnection* conn, const char* url ) { - command_openurl command_; int seq = getNextSeq( conn ); writeCommand( conn, DAPI_COMMAND_OPENURL, seq ); - command_.url_len = url != NULL ? strlen( url ) : 0; - writeSocket( conn, ( char* ) &command_, sizeof( command_ )); writeString( conn, url ); return seq; } int dapi_writeCommandExecuteUrl( DapiConnection* conn, const char* url ) { - command_executeurl command_; int seq = getNextSeq( conn ); writeCommand( conn, DAPI_COMMAND_EXECUTEURL, seq ); - command_.url_len = url != NULL ? strlen( url ) : 0; - writeSocket( conn, ( char* ) &command_, sizeof( command_ )); writeString( conn, url ); return seq; } int dapi_writeCommandButtonOrder( DapiConnection* conn ) { - command_buttonorder command_; int seq = getNextSeq( conn ); writeCommand( conn, DAPI_COMMAND_BUTTONORDER, seq ); - writeSocket( conn, ( char* ) &command_, sizeof( command_ )); return seq; } int dapi_writeCommandRunAsUser( DapiConnection* conn, const char* user, const char* command ) { - command_runasuser command_; int seq = getNextSeq( conn ); writeCommand( conn, DAPI_COMMAND_RUNASUSER, seq ); - command_.user_len = user != NULL ? strlen( user ) : 0; - command_.command_len = command != NULL ? strlen( command ) : 0; - writeSocket( conn, ( char* ) &command_, sizeof( command_ )); writeString( conn, user ); writeString( conn, command ); return seq; @@ -312,27 +217,17 @@ int dapi_writeCommandRunAsUser( DapiConnection* conn, const char* user, const ch int dapi_writeCommandSuspendScreensaving( DapiConnection* conn, int suspend ) { - command_suspendscreensaving command_; int seq = getNextSeq( conn ); writeCommand( conn, DAPI_COMMAND_SUSPENDSCREENSAVING, seq ); - command_.suspend = suspend; - writeSocket( conn, ( char* ) &command_, sizeof( command_ )); + writeSocket( conn, &suspend, sizeof( suspend )); return seq; } int dapi_writeCommandMailTo( DapiConnection* conn, const char* subject, const char* body, const char* to, const char* cc, const char* bcc, const char** attachments ) { - command_mailto command_; int seq = getNextSeq( conn ); writeCommand( conn, DAPI_COMMAND_MAILTO, seq ); - command_.subject_len = subject != NULL ? strlen( subject ) : 0; - command_.body_len = body != NULL ? strlen( body ) : 0; - command_.to_len = to != NULL ? strlen( to ) : 0; - command_.cc_len = cc != NULL ? strlen( cc ) : 0; - command_.bcc_len = bcc != NULL ? strlen( bcc ) : 0; - command_.attachments_count = stringSize( attachments ); - writeSocket( conn, ( char* ) &command_, sizeof( command_ )); writeString( conn, subject ); writeString( conn, body ); writeString( conn, to ); @@ -345,122 +240,90 @@ int dapi_writeCommandMailTo( DapiConnection* conn, const char* subject, const ch int dapi_writeCommandLocalFile( DapiConnection* conn, const char* remote, const char* local, int allow_download ) { - command_localfile command_; int seq = getNextSeq( conn ); writeCommand( conn, DAPI_COMMAND_LOCALFILE, seq ); - command_.remote_len = remote != NULL ? strlen( remote ) : 0; - command_.local_len = local != NULL ? strlen( local ) : 0; - command_.allow_download = allow_download; - writeSocket( conn, ( char* ) &command_, sizeof( command_ )); writeString( conn, remote ); writeString( conn, local ); + writeSocket( conn, &allow_download, sizeof( allow_download )); return seq; } int dapi_writeCommandUploadFile( DapiConnection* conn, const char* local, const char* file, int remove_local ) { - command_uploadfile command_; int seq = getNextSeq( conn ); writeCommand( conn, DAPI_COMMAND_UPLOADFILE, seq ); - command_.local_len = local != NULL ? strlen( local ) : 0; - command_.file_len = file != NULL ? strlen( file ) : 0; - command_.remove_local = remove_local; - writeSocket( conn, ( char* ) &command_, sizeof( command_ )); writeString( conn, local ); writeString( conn, file ); + writeSocket( conn, &remove_local, sizeof( remove_local )); return seq; } int dapi_writeCommandRemoveTemporaryLocalFile( DapiConnection* conn, const char* local ) { - command_removetemporarylocalfile command_; int seq = getNextSeq( conn ); writeCommand( conn, DAPI_COMMAND_REMOVETEMPORARYLOCALFILE, seq ); - command_.local_len = local != NULL ? strlen( local ) : 0; - writeSocket( conn, ( char* ) &command_, sizeof( command_ )); writeString( conn, local ); return seq; } void dapi_writeReplyInit( DapiConnection* conn, int seq, int ok ) { - reply_init command_; writeCommand( conn, DAPI_REPLY_INIT, seq ); - command_.ok = ok; - writeSocket( conn, ( char* ) &command_, sizeof( command_ )); + writeSocket( conn, &ok, sizeof( ok )); } void dapi_writeReplyOpenUrl( DapiConnection* conn, int seq, int ok ) { - reply_openurl command_; writeCommand( conn, DAPI_REPLY_OPENURL, seq ); - command_.ok = ok; - writeSocket( conn, ( char* ) &command_, sizeof( command_ )); + writeSocket( conn, &ok, sizeof( ok )); } void dapi_writeReplyExecuteUrl( DapiConnection* conn, int seq, int ok ) { - reply_executeurl command_; writeCommand( conn, DAPI_REPLY_EXECUTEURL, seq ); - command_.ok = ok; - writeSocket( conn, ( char* ) &command_, sizeof( command_ )); + writeSocket( conn, &ok, sizeof( ok )); } void dapi_writeReplyButtonOrder( DapiConnection* conn, int seq, int order ) { - reply_buttonorder command_; writeCommand( conn, DAPI_REPLY_BUTTONORDER, seq ); - command_.order = order; - writeSocket( conn, ( char* ) &command_, sizeof( command_ )); + writeSocket( conn, &order, sizeof( order )); } void dapi_writeReplyRunAsUser( DapiConnection* conn, int seq, int ok ) { - reply_runasuser command_; writeCommand( conn, DAPI_REPLY_RUNASUSER, seq ); - command_.ok = ok; - writeSocket( conn, ( char* ) &command_, sizeof( command_ )); + writeSocket( conn, &ok, sizeof( ok )); } void dapi_writeReplySuspendScreensaving( DapiConnection* conn, int seq, int ok ) { - reply_suspendscreensaving command_; writeCommand( conn, DAPI_REPLY_SUSPENDSCREENSAVING, seq ); - command_.ok = ok; - writeSocket( conn, ( char* ) &command_, sizeof( command_ )); + writeSocket( conn, &ok, sizeof( ok )); } void dapi_writeReplyMailTo( DapiConnection* conn, int seq, int ok ) { - reply_mailto command_; writeCommand( conn, DAPI_REPLY_MAILTO, seq ); - command_.ok = ok; - writeSocket( conn, ( char* ) &command_, sizeof( command_ )); + writeSocket( conn, &ok, sizeof( ok )); } void dapi_writeReplyLocalFile( DapiConnection* conn, int seq, const char* result ) { - reply_localfile command_; writeCommand( conn, DAPI_REPLY_LOCALFILE, seq ); - command_.result_len = result != NULL ? strlen( result ) : 0; - writeSocket( conn, ( char* ) &command_, sizeof( command_ )); writeString( conn, result ); } void dapi_writeReplyUploadFile( DapiConnection* conn, int seq, int ok ) { - reply_uploadfile command_; writeCommand( conn, DAPI_REPLY_UPLOADFILE, seq ); - command_.ok = ok; - writeSocket( conn, ( char* ) &command_, sizeof( command_ )); + writeSocket( conn, &ok, sizeof( ok )); } void dapi_writeReplyRemoveTemporaryLocalFile( DapiConnection* conn, int seq, int ok ) { - reply_removetemporarylocalfile command_; writeCommand( conn, DAPI_REPLY_REMOVETEMPORARYLOCALFILE, seq ); - command_.ok = ok; - writeSocket( conn, ( char* ) &command_, sizeof( command_ )); + writeSocket( conn, &ok, sizeof( ok )); } diff --git a/kde/gen/gen.cpp b/kde/gen/gen.cpp index b00e692..8ecda52 100644 --- a/kde/gen/gen.cpp +++ b/kde/gen/gen.cpp @@ -20,6 +20,8 @@ struct Arg Arg() : out( false ), ret( false ) {} QString cType() const; static QString cType( const QString& type ); + void readCommand( QTextStream& stream ) const; + void writeCommand( QTextStream& stream ) const; QString name; QString type; bool out; @@ -147,6 +149,26 @@ ArgList Arg::stripReturnArgument( const ArgList& args ) return new_args; } +void Arg::readCommand( QTextStream& stream ) const + { + if( type == "string" ) + stream << " *" << name << " = readString( conn );\n"; + else if( type == "stringlist" ) + stream << " *" << name << " = readStringList( conn );\n"; + else + stream << " readSocket( conn, " << name << ", sizeof( *" << name << " ));\n"; + } + +void Arg::writeCommand( QTextStream& stream ) const + { + if( type == "string" ) + stream << " writeString( conn, " << name << " );\n"; + else if( type == "stringlist" ) + stream << " writeStringList( conn, " << name << " );\n"; + else + stream << " writeSocket( conn, &" << name << ", sizeof( " << name << " ));\n"; + } + QString makeIndent( int indent ) { return indent > 0 ? QString().fill( ' ', indent ) : ""; @@ -371,67 +393,6 @@ void generateSharedCommH() stream << "\n };\n"; } -void generateSharedCommHInternal() - { - QFile file( "comm_internal_generated.h" ); - if( !file.open( IO_WriteOnly )) - error(); - QTextStream stream( &file ); - stream << - "typedef struct command_header\n" - " {\n" - " int magic;\n" - " int seq;\n" - " int command;\n" - " } command_header;\n"; - for( QValueList< Function >::ConstIterator it = functions.begin(); - it != functions.end(); - ++it ) - { - const Function& function = *it; - stream << "typedef struct command_" << function.name.lower() << "\n {\n"; - ArgList args = Arg::stripOutArguments( function.args ); - for( ArgList::ConstIterator it = args.begin(); - it != args.end(); - ++it ) - { - const Arg& arg = (*it); - if( arg.type == "string" ) - stream << " int " << arg.name << "_len; /* char* " << arg.name << " */\n"; - else if( arg.type == "stringlist" ) - stream << " int " << arg.name << "_count; /* char** " << arg.name << " */\n"; - else - stream << " " << arg.cType() << " " << arg.name << ";\n"; - } - if( args.isEmpty()) - stream << " int dummy;\n"; - stream << " } command_" << function.name.lower() << ";\n"; - } - for( QValueList< Function >::ConstIterator it = functions.begin(); - it != functions.end(); - ++it ) - { - const Function& function = *it; - stream << "typedef struct reply_" << function.name.lower() << "\n {\n"; - ArgList args = Arg::stripNonOutArguments( function.args ); - for( ArgList::ConstIterator it = args.begin(); - it != args.end(); - ++it ) - { - const Arg& arg = (*it); - if( arg.type == "string" ) - stream << " int " << arg.name << "_len; /* char* " << arg.name << " */\n"; - else if( arg.type == "stringlist" ) - stream << " int " << arg.name << "_count; /* char* " << arg.name << " */\n"; - else - stream << " " << arg.cType() << " " << arg.name << ";\n"; - } - if( args.isEmpty()) - stream << " int dummy;\n"; - stream << " } reply_" << function.name.lower() << ";\n"; - } - } - void generateSharedCommCReadFunctions( QTextStream& stream, FunctionType type ) { for( QValueList< Function >::ConstIterator it = functions.begin(); @@ -441,12 +402,6 @@ void generateSharedCommCReadFunctions( QTextStream& stream, FunctionType type ) const Function& function = *it; function.generateC( stream, 0, type ); stream << "\n {\n"; - if( type == ReadCommand ) - stream << " command_" << function.name.lower() << " command_;\n"; - else - stream << " reply_" << function.name.lower() << " command_;\n"; - stream << " if( readSocket( conn, ( char* ) &command_, sizeof( command_ )) <= 0 )\n" - << " return 0;\n"; ArgList args = type == ReadCommand ? Arg::stripOutArguments( function.args ) : Arg::stripNonOutArguments( function.args ); for( ArgList::ConstIterator it = args.begin(); @@ -454,25 +409,12 @@ void generateSharedCommCReadFunctions( QTextStream& stream, FunctionType type ) ++it ) { const Arg& arg = (*it); - if( arg.type == "string" || arg.type == "stringlist" ) - continue; - stream << " *" << arg.name << " = command_." << arg.name << ";\n"; + arg.readCommand( stream ); } + // TODO tady chybi kontrola, ze nebyla chyba pri cteni ArgList args_extra = Arg::stripSimpleArguments( args ); if( !args_extra.isEmpty()) { - for( ArgList::ConstIterator it = args_extra.begin(); - it != args_extra.end(); - ++it ) - { - const Arg& arg = (*it); - if( arg.type == "string" ) - stream << " *" << arg.name << " = readString( conn, command_." << arg.name << "_len );\n"; - else if( arg.type == "stringlist" ) - stream << " *" << arg.name << " = readStringList( conn, command_." << arg.name << "_count );\n"; - else - abort(); - } stream << " if("; bool need_op = false; for( ArgList::ConstIterator it = args_extra.begin(); @@ -511,14 +453,12 @@ void generateSharedCommCWriteFunctions( QTextStream& stream, FunctionType type ) stream << "\n {\n"; if( type == WriteCommand ) { - stream << " command_" << function.name.lower() << " command_;\n" - << " int seq = getNextSeq( conn );\n" + stream << " int seq = getNextSeq( conn );\n" << " writeCommand( conn, DAPI_COMMAND_" << function.name.upper() << ", seq );\n"; } else { - stream << " reply_" << function.name.lower() << " command_;\n" - << " writeCommand( conn, DAPI_REPLY_" << function.name.upper() << ", seq );\n"; + stream << " writeCommand( conn, DAPI_REPLY_" << function.name.upper() << ", seq );\n"; } ArgList args2 = type == WriteCommand ? Arg::stripOutArguments( function.args ) : Arg::stripNonOutArguments( function.args ); for( ArgList::ConstIterator it = args2.begin(); @@ -526,25 +466,9 @@ void generateSharedCommCWriteFunctions( QTextStream& stream, FunctionType type ) ++it ) { const Arg& arg = (*it); - if( arg.type == "string" ) - stream << " command_." << arg.name << "_len = " - << arg.name << " != NULL ? strlen( " << arg.name << " ) : 0;\n"; - else if( arg.type == "stringlist" ) - stream << " command_." << arg.name << "_count = stringSize( " << arg.name << " );\n"; - else - stream << " command_." << arg.name << " = " << arg.name << ";\n"; - } - stream << " writeSocket( conn, ( char* ) &command_, sizeof( command_ ));\n"; - for( ArgList::ConstIterator it = args2.begin(); - it != args2.end(); - ++it ) - { - const Arg& arg = (*it); - if( arg.type == "string" ) - stream << " writeString( conn, " << arg.name << " );\n"; - else if( arg.type == "stringlist" ) - stream << " writeStringList( conn, " << arg.name << " );\n"; + arg.writeCommand( stream ); } + // TODO kontrola, ze nebyla chyba pri zapisu? if( type == WriteCommand ) stream << " return seq;\n"; stream << " }\n\n"; @@ -557,29 +481,8 @@ void generateSharedCommC() if( !file.open( IO_WriteOnly )) error(); QTextStream stream( &file ); - stream << - "int dapi_readCommand( DapiConnection* conn, int* comm, int* seq )\n" - " {\n" - " command_header command;\n" - " if( readSocket( conn, ( char* ) &command, sizeof( command )) <= 0 )\n" - " return 0;\n" - " if( command.magic != MAGIC )\n" - " return 0;\n" - " *comm = command.command;\n" // TODO check range? - " *seq = command.seq;\n" - " return 1;\n" - " }\n\n"; generateSharedCommCReadFunctions( stream, ReadCommand ); generateSharedCommCReadFunctions( stream, ReadReply ); - stream << - "static void writeCommand( DapiConnection* conn, int com, int seq )\n" - " {\n" - " command_header command;\n" - " command.magic = MAGIC;\n" - " command.seq = seq;\n" - " command.command = com;\n" - " writeSocket( conn, ( char* ) &command, sizeof( command ));\n" - " }\n\n"; generateSharedCommCWriteFunctions( stream, WriteCommand ); generateSharedCommCWriteFunctions( stream, WriteReply ); } @@ -677,7 +580,6 @@ void generateSharedCallsC() void generateShared() { generateSharedCommH(); - generateSharedCommHInternal(); generateSharedCommC(); generateSharedCallsH(); generateSharedCallsC(); @@ -127,12 +127,12 @@ int dapi_socket( DapiConnection* conn ) return conn->sock; } -static int writeSocket( DapiConnection* conn, const char* data, int size ) +static int writeSocket( DapiConnection* conn, const void* data, int size ) { int written = 0; for(;;) { - int len = write( conn->sock, data + written, size - written ); + int len = write( conn->sock, ( const char* ) data + written, size - written ); if( len < 0 && errno != EINTR && errno != EAGAIN ) return -1; if( len > 0 ) @@ -142,12 +142,12 @@ static int writeSocket( DapiConnection* conn, const char* data, int size ) } } -static int readSocket( DapiConnection* conn, char* data, int size ) +static int readSocket( DapiConnection* conn, void* data, int size ) { int rd = 0; for(;;) { - int len = read( conn->sock, data + rd, size - rd ); + int len = read( conn->sock, ( char* ) data + rd, size - rd ); if( len < 0 && errno != EINTR && errno != EAGAIN ) return -1; if( len == 0 ) @@ -193,109 +193,115 @@ static int getNextSeq( DapiConnection* conn ) return conn->last_seq; } -static char* readString( DapiConnection* conn, int len ) +static char* readString( DapiConnection* conn ) { + int len; + if( readSocket( conn, &len, sizeof( len )) <= 0 ) + return NULL; char* ret = malloc( len + 1 ); if( ret == NULL ) return NULL; - if( readSocket( conn, ret, len + 1 ) > 0 ) + if( len > 0 ) { - ret[ len ] = '\0'; - return ret; + if( readSocket( conn, ret, len ) <= 0 ) + { + free( ret ); + return NULL; + } } - free( ret ); - return NULL; + ret[ len ] = '\0'; + return ret; } static void writeString( DapiConnection* conn, const char* str ) { - if( str == NULL ) - { - char c = '\0'; - writeSocket( conn, &c, 1 ); - return; - } - writeSocket( conn, str, strlen( str ) + 1 ); + int len = ( str == NULL ? 0 : strlen( str )); + writeSocket( conn, &len, sizeof( len )); + if( len > 0 ) + writeSocket( conn, str, len ); } -static int stringSize( const char** strs ) +void dapi_freeStringList( char** strs ) { - int cnt = 0; - if( strs == NULL || *strs == NULL ) - return 0; - for(; - *strs != NULL; - ++strs ) - cnt += strlen( *strs ) + 1; - return cnt; + if( strs != NULL ) + { + char** pos; + for( pos = strs; + *pos != NULL; + ++pos ) + free( *pos ); + free( strs ); + } } -static char** readStringList( DapiConnection* conn, int len ) +static char** readStringList( DapiConnection* conn ) { - char* buf; + int count; char** ret; - int cnt; int i; - int pos; - int set; - if( len == 0 ) - { - ret = malloc( sizeof( char* )); - if( ret == NULL ) - return NULL; - *ret = NULL; - return ret; - } - buf = malloc( len ); - if( buf == NULL ) + if( readSocket( conn, &count, sizeof( count )) <= 0 ) return NULL; - if( readSocket( conn, buf, len ) <= 0 ) - { - free( buf ); + ret = malloc(( count + 1 ) * sizeof( char** )); + if( ret == NULL ) return NULL; - } - cnt = 1; /* extra for terminating NULL */ for( i = 0; - i < len; + i < count; ++i ) - if( buf[ i ] == '\0' ) - ++cnt; - if( cnt == 0 ) - { - free( buf ); - return NULL; - } - ret = malloc( sizeof( char* ) * cnt + len ); - if( ret == NULL ) - { - free( buf ); - return NULL; - } - memcpy( ret + cnt, buf, len ); /* place string data right after the pointers */ - free( buf ); - buf = ( char* )( ret + cnt ); - pos = 0; - set = 1; + ret[ i ] = NULL; for( i = 0; - i < len; + i < count; ++i ) { - if( set ) - ret[ pos++ ] = buf + i; - set = buf[ i ] == '\0'; + ret[ i ] = readString( conn ); + if( ret[ i ] == NULL ) + { + dapi_freeStringList( ret ); + return NULL; + } } - ret[ pos ] = NULL; /* terminating NULL */ + ret[ count ] = NULL; /* terminating NULL */ return ret; } static void writeStringList( DapiConnection* conn, const char** strs ) { + int count = 0; + const char** pos; if( strs == NULL || *strs == NULL ) + { + int count = 0; + writeSocket( conn, &count, sizeof( count )); return; - for(; - *strs != NULL; - ++strs ) - writeSocket( conn, *strs, strlen( *strs ) + 1 ); + } + for( pos = strs; + *pos != NULL; + ++pos ) + ++count; + writeSocket( conn, &count, sizeof( count )); + for( pos = strs; + *pos != NULL; + ++pos ) + writeString( conn, *pos ); + } + +int dapi_readCommand( DapiConnection* conn, int* comm, int* seq ) + { + int magic; + /* TODO kontrola failure */ + readSocket( conn, &magic, sizeof( magic )); + readSocket( conn, comm, sizeof( *comm )); + readSocket( conn, seq, sizeof( *seq )); + if( magic != MAGIC ) + return 0; + return 1; + } + +static void writeCommand( DapiConnection* conn, int comm, int seq ) + { + int magic = MAGIC; + writeSocket( conn, &magic, sizeof( magic )); + writeSocket( conn, &comm, sizeof( comm )); + writeSocket( conn, &seq, sizeof( seq )); } #include "../kde/gen/comm_generated.c" |