首页 > 代码库 > libstrophe发送图片

libstrophe发送图片

今天用libstrophe做了一个发送图片的,自己用了三个方法进行实现:感觉可能还是这个最好吧!之前两个CTO不想增加项目大小,被否决。这是用于将windows上的图片发送到ios手机项目中,所以需要自己去实现下。用过libevent、gloox库。下面是libstrophe库的实现。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "base64.h"
#include <strophe.h>
#include <iostream>
#include <fstream>
struct msgdata
{
char* from;
char* to;
//long length;
char* msg;
};
/** Send a single text message.
 *  This function sends a simple text message to a given recipient.
 *
 *  @param conn a Strophe connection object
 *  @param to the JID of the recipient
 *  @param message the text of the message to send
 *
 *  @ingroup Connections
 */
void xmpp_send_simple_message(xmpp_conn_t* conn,const char* const from,const char* const to,const char* const message)
{
xmpp_stanza_t *body,*text,*command;
xmpp_ctx_t *ctx = xmpp_conn_get_context(conn);
char* rePath = "aaa.jpg";
command = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(command,"message");
xmpp_stanza_set_type(command,"file");
xmpp_stanza_set_attribute(command,"from",from);
xmpp_stanza_set_attribute(command,"to",to);
xmpp_stanza_set_attribute(command,"destin","/");

body = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(body,"body");


xmpp_stanza_t *item =xmpp_stanza_new(ctx);
xmpp_stanza_set_name(item,"item");
    xmpp_stanza_set_attribute(item, "path", rePath);



text = xmpp_stanza_new(ctx);
    xmpp_stanza_set_text(text,message);
//xmpp_stanza_add_child(body,text);
xmpp_stanza_add_child(item,text);
xmpp_stanza_add_child(body,item);


xmpp_stanza_add_child(command,body);


xmpp_send(conn,command);
xmpp_stanza_release(command);
}
/*define a handler for connection events*/
void conn_handler(xmpp_conn_t* const conn,const xmpp_conn_event_t status,const int error,xmpp_stream_error_t* const stream_error,void* const userdata)
{
xmpp_ctx_t *ctx = xmpp_conn_get_context(conn);
struct msgdata* msg = (struct msgdata*)userdata;


if(status ==XMPP_CONN_CONNECT)
{
xmpp_stanza_t* pres;
fprintf(stderr,"DEBUG:connected\n");


/*send initial <presence/> so that we appear online to contacts*/
pres = xmpp_stanza_new(ctx);
//xmpp_handler_add(conn,presence_handler, NULL, "presence", NULL, ctx);
xmpp_stanza_set_name(pres,"presence");
xmpp_send(conn,pres);
xmpp_stanza_release(pres);


/*send a message*/
xmpp_send_simple_message(conn,msg->from,msg->to,msg->msg);
free(msg);


/*cause the conn_handler to be executed,where the event loop gets shut down*/
xmpp_disconnect(conn);
}else
{
fprintf(stderr,"DEBUG:disconnect\n");
xmpp_stop(ctx);
}
}
int main(int argc,char** argv)
{
xmpp_ctx_t *ctx;
xmpp_conn_t *conn;
xmpp_log_t *log;
char *jid,*pass;
struct msgdata* msg = (struct msgdata*)malloc(sizeof(struct msgdata));
msg->to=  "test1@192.168.11.206/";
msg->from= "test@192.168.11.206/";
jid =msg->from;
pass = "test";


/*initalize library*/
xmpp_initialize();


/*create a context*/
log = xmpp_get_default_logger(XMPP_LEVEL_DEBUG);
ctx = xmpp_ctx_new(NULL,log);


/* create a connection*/
conn = xmpp_conn_new(ctx);


/* setup authentication information*/
xmpp_conn_set_jid(conn,jid);
xmpp_conn_set_pass(conn,pass);


/* prepare the message for sending*/


std::ifstream file;
file.open("C:/Users/Administrator/Desktop/2.jpg",std::ios_base::in|std::ios_base::binary|std::ios_base::ate);
file.seekg(0,std::ios::end);
char *buffer ;
long size;
size = file.tellg();
buffer = new char [size];
file.seekg(0,std::ios::beg);
file.read (buffer, size);


std::string picture = base64_encode(reinterpret_cast<const unsigned char*>(buffer), size);
msg->msg = const_cast<char*>(picture.c_str());

/* initialize connection*/
xmpp_connect_client(conn,NULL,0,conn_handler,msg);


/* enter the event loop - our connect handler will trigger an exit*/
xmpp_run(ctx);
/*release our connection and contex*/
xmpp_conn_release(conn);
xmpp_ctx_free(ctx);


/*final shutdown of the libraty*/
xmpp_shutdown();
return 0;
}