void XMPP_IBB_SendPayload(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata, char* resp ) { static int seq = 0; int data_seq = 0; char Data_Seq_Buf[32]; char ID_Buf[32]; char* encoded_data; xmpp_ctx_t *ctx = (xmpp_ctx_t *)userdata; xmpp_stanza_t *iq, *data, *text; iq = xmpp_stanza_new(ctx); data = xmpp_stanza_new(ctx); text = xmpp_stanza_new(ctx); xmpp_stanza_set_name(iq, "iq"); xmpp_stanza_set_type(iq, "set"); sprintf(ID_Buf, "ID-seq-%d", seq); seq++; xmpp_stanza_set_id(iq, ID_Buf); xmpp_stanza_set_attribute(iq, "to", xmpp_stanza_get_attribute(stanza, "from")); xmpp_stanza_set_attribute(iq, "from", xmpp_stanza_get_attribute(stanza, "to")); xmpp_stanza_set_name(data, "data"); xmpp_stanza_set_ns(data, XMLNS_IBB); xmpp_stanza_set_attribute(data, "sid", \ xmpp_stanza_get_attribute(xmpp_stanza_get_child_by_name(stanza, "data"), "sid")); sprintf(Data_Seq_Buf , "%d", data_seq); xmpp_stanza_set_attribute(data, "seq", Data_Seq_Buf); printf("\n[Response =%s]\n", resp); encoded_data = base64_encode(ctx, (unsigned char*)resp, strlen(resp)); xmpp_stanza_set_text_with_size(text, encoded_data, strlen(encoded_data)); xmpp_stanza_add_child(data, text); xmpp_stanza_add_child(iq, data); xmpp_send(conn, iq); seq++; free(resp); xmpp_free(ctx, encoded_data); xmpp_stanza_release(data); xmpp_stanza_release(iq); xmpp_stanza_release(text); xmpp_stanza_release(stanza); //copied by IBB IQ receiver handler }
static void _characters(void *userdata, const XML_Char *s, int len) { parser_t *parser = (parser_t *)userdata; xmpp_stanza_t *stanza; if (parser->depth < 2) return; /* create and populate stanza */ stanza = xmpp_stanza_new(parser->ctx); if (!stanza) { /* FIXME: allocation error, disconnect */ return; } xmpp_stanza_set_text_with_size(stanza, s, len); xmpp_stanza_add_child(parser->stanza, stanza); xmpp_stanza_release(stanza); }
static void _characters(void *userdata, const xmlChar *chr, int len) { parser_t *parser = (parser_t *)userdata; xmpp_stanza_t *stanza; /* skip unimportant whitespace, etc */ if (parser->depth < 2) return; /* create and populate stanza */ stanza = xmpp_stanza_new(parser->ctx); if (!stanza) { /* FIXME: allocation error, disconnect */ return; } xmpp_stanza_set_text_with_size(stanza, (char *)chr, len); xmpp_stanza_add_child(parser->stanza, stanza); xmpp_stanza_release(stanza); }
int xmpp_ibb_send_data(xmpp_ibb_session_t *sess, xmppdata_t *xdata) { int i; xmpp_stanza_t *iq, *data, *text; char *encode, seqchar[16] = ""; xmpp_ctx_t *ctx; if (sess == NULL || xdata == NULL) { return -1; } if (xdata->size > (sess->block_size / 4 * 3)) { return -1; } const char *jid = xmpp_conn_get_bound_jid(sess->conn); for (i = 0; i < 50; i++) { if (sess->state == STATE_READY) { break ; } else if (sess->state == STATE_SENDING) { fprintf(stderr, "skip invalid state(%d).\n", sess->state); break ; } else if (sess->state == STATE_OPENING) { usleep(100000); } else { fprintf(stderr, "invalid state(%d).\n", sess->state); break ; } } if (sess->state != STATE_SENDING && sess->state != STATE_READY) { fprintf(stderr, "xmpp_ibb_send_data() failed. state(%d) not ready.\n", sess->state); return -1; } if (!ilist_foundinlist(g_list, sess)) { fprintf(stderr, "session is not in handle, may be closed.\n"); return -1; } ctx = xmpp_conn_get_context(sess->conn); iq = xmpp_stanza_new(ctx); data = xmpp_stanza_new(ctx); text = xmpp_stanza_new(ctx); nmtoken_generate(sess->id, 8); xmpp_stanza_set_name(iq, "iq"); xmpp_stanza_set_type(iq, "set"); xmpp_stanza_set_id(iq, sess->id); xmpp_stanza_set_attribute(iq, "to", sess->peer); xmpp_stanza_set_attribute(iq, "from", jid); xmpp_stanza_set_name(data, "data"); xmpp_stanza_set_ns(data, XMLNS_IBB); xmpp_stanza_set_attribute(data, "sid", sess->sid); snprintf(seqchar, sizeof(seqchar), "%d", ++(sess->send_seq)); xmpp_stanza_set_attribute(data, "seq", seqchar); xmpp_b64encode(xdata->data, xdata->size, &encode); if (encode == NULL) { xmpp_stanza_set_text_with_size(text, "", 0); } else { xmpp_stanza_set_text_with_size(text, encode, strlen(encode)); } xmpp_stanza_add_child(data, text); xmpp_stanza_add_child(iq, data); sess->state = STATE_SENDING; xmpp_send(sess->conn, iq); xmpp_stanza_release(text); xmpp_stanza_release(data); xmpp_stanza_release(iq); xmpp_b64free(encode); return sess->send_seq; }