diff --git a/media/avatar.base64 b/media/avatar.base64 new file mode 100644 index 0000000..20bba31 --- /dev/null +++ b/media/avatar.base64 @@ -0,0 +1,188 @@ +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 +C1BcIOYXY3+IQRqYFwYLhqGCYqDLhdyoPj//2Q== diff --git a/src/bot/context.c b/src/bot/context.c index 43c751e..014380a 100644 --- a/src/bot/context.c +++ b/src/bot/context.c @@ -10,7 +10,57 @@ g_string_free(user.pass, freeSegment); } -int bot_xmpp_startup(struct BotUserInfo user, struct BotXmppCtx * const bctx) +int bot_xmpp_set_avatar(struct BotXmppCtx * const bctx, const GString *avatarFile) +{ + gchar *avatar; + gsize avatarLenght; + xmpp_stanza_t *iq, *vcard, *photo, *type, *binval; + + /* 1. Create IQ 'set' stanza */ + iq = xmpp_stanza_new(bctx->ctx); + xmpp_stanza_set_name(iq, "iq"); + xmpp_stanza_set_type(iq, "set"); + xmpp_stanza_set_id(iq, "vcard_set_1"); + + /* Create ctx); + xmpp_stanza_set_name(vcard, "vCard"); + xmpp_stanza_set_ns(vcard, "vcard-temp"); + + /* Create element */ + photo = xmpp_stanza_new(bctx->ctx); + xmpp_stanza_set_name(photo, "PHOTO"); + + /* Add (e.g., image/jpeg) */ + type = xmpp_stanza_new(bctx->ctx); + xmpp_stanza_set_name(type, "TYPE"); + xmpp_stanza_set_text(type, "image/jpeg"); + xmpp_stanza_add_child(photo, type); + + /* Add with base64 data */ + binval = xmpp_stanza_new(bctx->ctx); + xmpp_stanza_set_name(binval, "BINVAL"); + + if(g_file_get_contents(avatarFile->str, &avatar, &avatarLenght, NULL)) { + xmpp_stanza_set_text(binval, avatar); + } else { + fprintf(stderr, "Unable to read BASE64-encoded avatar.\n"); + } + + xmpp_stanza_add_child(photo, binval); + + /* Assemble tree */ + xmpp_stanza_add_child(vcard, photo); + xmpp_stanza_add_child(iq, vcard); + + /* 6. Send stanza and release it + all children */ + xmpp_send(bctx->conn, iq); + xmpp_stanza_release(iq); + + return 0; +} + +int bot_xmpp_startup(struct BotUserInfo user, GString *avatarFile, struct BotXmppCtx * const bctx) { xmpp_log_t* newLog; xmpp_ctx_t* newCtx; @@ -51,6 +101,9 @@ (*bctx).log = newLog; (*bctx).ctx = newCtx; (*bctx).conn = newCon; + + bot_xmpp_set_avatar(bctx, avatarFile); + return 0; } diff --git a/src/bot/context.h b/src/bot/context.h index 906892c..2c0fbc1 100644 --- a/src/bot/context.h +++ b/src/bot/context.h @@ -27,8 +27,11 @@ void bot_free_user_data(struct BotUserInfo user, GString *filename, bool freeSegment); +/* sets the given avatar file (base64 encoded) */ +int bot_xmpp_set_avatar(struct BotXmppCtx * const bctx, const GString *avatarFile); + /* perform xmpp startup, store in bctx if completed successfully */ -int bot_xmpp_startup(struct BotUserInfo user, struct BotXmppCtx * const bctx); +int bot_xmpp_startup(struct BotUserInfo user, GString *avatarFile, struct BotXmppCtx * const bctx); /* teardown and free ctx and connection in bctx */ void bot_xmpp_shutdown(struct BotXmppCtx * const bctx); diff --git a/src/main.c b/src/main.c index abaadb7..49d04a4 100644 --- a/src/main.c +++ b/src/main.c @@ -9,13 +9,14 @@ int main(int argc, char **argv) { GString *filename; + GString *avatarFile; struct BotUserInfo user; struct BotXmppCtx bctx; int startup_code; /* take a jid and password on the command line */ - if (argc != 4) { - fprintf(stderr, "Usage: bot \n\n"); + if (argc != 5) { + fprintf(stderr, "Usage: bot \n\n"); return 1; } @@ -29,11 +30,12 @@ user.jid = g_string_new(argv[1]); user.pass = g_string_new(argv[2]); filename = g_string_new(argv[3]); + avatarFile = g_string_new(argv[4]); bot_set_filename(filename); /* perform the startup and connect routine */ - startup_code = bot_xmpp_startup(user, &bctx); + startup_code = bot_xmpp_startup(user, avatarFile, &bctx); if(startup_code != 0) { /* something went wrong at startup */ return startup_code;