# HG changeset patch # User Jeffrey Connelly # Date 1182713021 0 # Node ID cbda7f26d27d01b2a1f7b04d2b4bf3236e67d6c4 # Parent 8caecd2c079c5d2d4ae3db3194bb6696573bbb04 Add a send_raw function, msim_send_really_raw, into the prpl_info struct, so that third-party plugins can send raw data if they choose. diff -r 8caecd2c079c -r cbda7f26d27d libpurple/protocols/myspace/myspace.c --- a/libpurple/protocols/myspace/myspace.c Sun Jun 24 05:08:02 2007 +0000 +++ b/libpurple/protocols/myspace/myspace.c Sun Jun 24 19:23:41 2007 +0000 @@ -191,46 +191,64 @@ #endif /** - * Send raw data to the server. + * Send raw data (given as a NUL-terminated string) to the server. * * @param session - * @param msg The raw data to send. + * @param msg The raw data to send, in a NUL-terminated string. * * @return TRUE if succeeded, FALSE if not. * */ gboolean msim_send_raw(MsimSession *session, const gchar *msg) { - int total_bytes_sent, total_bytes; - purple_debug_info("msim", "msim_send_raw: writing <%s>\n", msg); g_return_val_if_fail(MSIM_SESSION_VALID(session), FALSE); g_return_val_if_fail(msg != NULL, FALSE); + return msim_send_really_raw(session->gc, msg, strlen(msg)) == + strlen(msg); +} +/** Send raw data to the server, possibly with embedded NULs. + * + * Used in prpl_info struct, so that plugins can have the most possible + * control of what is sent over the connection. Inside this prpl, + * msim_send_raw() is used, since it sends NUL-terminated strings (easier). + * + * @param gc PurpleConnection + * @param buf Buffer to send + * @param total_bytes Size of buffer to send + * + * @return Bytes successfully sent. + */ +int msim_send_really_raw(PurpleConnection *gc, const char *buf, int total_bytes) +{ + int total_bytes_sent; + /* Loop until all data is sent, or a failure occurs. */ total_bytes_sent = 0; - total_bytes = strlen(msg); do { int bytes_sent; - bytes_sent = send(session->fd, msg + total_bytes_sent, - total_bytes - total_bytes_sent, 0); + bytes_sent = send(((MsimSession*)(gc->proto_data))->fd, + buf + total_bytes_sent, total_bytes - total_bytes_sent, 0); if (bytes_sent < 0) { purple_debug_info("msim", "msim_send_raw(%s): send() failed: %s\n", - msg, g_strerror(errno)); - return FALSE; + buf, g_strerror(errno)); + return total_bytes_sent; } total_bytes_sent += bytes_sent; } while(total_bytes_sent < total_bytes); - return TRUE; + + return total_bytes_sent; } + /** * Start logging in to the MSIM servers. * @@ -271,6 +289,7 @@ return; } } + /** * Process a login challenge, sending a response. * @@ -1698,7 +1717,6 @@ return TRUE; } - /** * Callback when input available. * @@ -2217,7 +2235,7 @@ NULL, /* new_xfer */ msim_offline_message, /* offline_message */ NULL, /* whiteboard_prpl_ops */ - NULL, /* send_raw */ + msim_send_really_raw, /* send_raw */ NULL, /* roomlist_room_serialize */ NULL, /* _purple_reserved1 */ NULL, /* _purple_reserved2 */ diff -r 8caecd2c079c -r cbda7f26d27d libpurple/protocols/myspace/myspace.h --- a/libpurple/protocols/myspace/myspace.h Sun Jun 24 05:08:02 2007 +0000 +++ b/libpurple/protocols/myspace/myspace.h Sun Jun 24 19:23:41 2007 +0000 @@ -167,6 +167,7 @@ void print_hash_item(gpointer key, gpointer value, gpointer user_data); gboolean msim_send_raw(MsimSession *session, const gchar *msg); +int msim_send_really_raw(PurpleConnection *gc, const char *buf,int total_bytes); void msim_login(PurpleAccount *acct); gboolean msim_login_challenge(MsimSession *session, MsimMessage *msg);