summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLubos Lunak <l.lunak@ suse.cz>2006-03-14 12:45:34 +0000
committerLubos Lunak <l.lunak@ suse.cz>2006-03-14 12:45:34 +0000
commit0fe5cc6c5a93357033eeaad97bd1a21c77212f85 (patch)
treef9547ee5be26853da72f24b7849ba0f7520bb0da
parent9eb4697960cdbbfa5f034123757afb66be1d8c62 (diff)
Don't use structs for marshalling, marshall arguments directly.
-rw-r--r--kde/gen/comm_generated.c217
-rw-r--r--kde/gen/gen.cpp154
-rw-r--r--lib/comm.c154
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();
diff --git a/lib/comm.c b/lib/comm.c
index 6f38ef4..55825a3 100644
--- a/lib/comm.c
+++ b/lib/comm.c
@@ -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"