Skip to content

Commit

Permalink
add error receipt for upload file and image
Browse files Browse the repository at this point in the history
  • Loading branch information
xiehuc committed Jun 7, 2015
1 parent e04619c commit 1139a94
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 16 deletions.
4 changes: 4 additions & 0 deletions src/Localizable.h
@@ -1,5 +1,9 @@

#define qError _("Error")
#define qErrorFormat "%s(%d):%s"
#define qUploadImageError _("Upload Image Error")
#define qUploadFileError _("Upload File Error")

#define qGetFriendListError _("Get Friend List Failed")
#define qGetGroupListError _("Get Group List Failed")
#define qGetOnlineListError _("Get Online List Failed")
Expand Down
29 changes: 23 additions & 6 deletions src/ft.c
Expand Up @@ -96,7 +96,8 @@ static void upload_file_to_server(PurpleXfer* xfer)
req->add_form(req, LWQQ_FORM_FILE, "name", xfer->local_filename);
lwqq_http_on_progress(req, file_trans_on_progress, xfer);
lwqq_http_set_option(req, LWQQ_HTTP_CANCELABLE, 1L);
req->do_request_async(req, 0, "", _C_(2p, send_file_message, req, xfer));
req->do_request_async(
req, 0, "", _C_(2p, send_file_message, req, xfer));
}
static void download_file_finish(PurpleXfer* xfer, LwqqHttpRequest* req)
{
Expand Down Expand Up @@ -142,6 +143,7 @@ void qq_send_file(PurpleConnection* gc, const char* who, const char* filename)
return;
}
PurpleXfer* xfer = purple_xfer_new(gc->account, PURPLE_XFER_SEND, who);
xfer->remote_port = LWQQ_MS_BUDDY_MSG; // use remote port to store special data
purple_xfer_set_init_fnc(xfer, upload_file_to_server);
purple_xfer_set_request_denied_fnc(xfer, NULL); // send offline file to server, would not denied
purple_xfer_set_cancel_send_fnc(xfer, cancel_upload);
Expand All @@ -158,6 +160,7 @@ void qq_send_offline_file(PurpleBlistNode* node)
return;
}
PurpleXfer* xfer = purple_xfer_new(account, PURPLE_XFER_SEND, get_name_from_chat(chat));
xfer->remote_port = LWQQ_MS_GROUP_MSG;
purple_xfer_set_init_fnc(xfer, upload_file_to_server);
purple_xfer_set_request_denied_fnc(xfer, NULL);
purple_xfer_set_cancel_send_fnc(xfer, cancel_upload);
Expand All @@ -177,13 +180,19 @@ void qq_ask_download_file(qq_account* ac, LwqqMsgContent* C, const char* local_i
purple_xfer_request(xfer);
}

static void set_img_url(LwqqHttpRequest* req, LwqqMsgContent* C, void* data)
static int set_img_url(LwqqHttpRequest* req, LwqqMsgContent* C, void* data)
{
char buffer[1024];
snprintf(buffer,sizeof(buffer),"%s ", strtrim(req->response)); // append a blank to url
C->data.ext.param[0] = s_strdup(buffer);
LwqqErrorCode err = req->err;
if(req->http_code == 200){
snprintf(buffer,sizeof(buffer),"%s ", strtrim(req->response)); // append a blank to url
C->data.ext.param[0] = s_strdup(buffer);
}else{
lwqq_msg_content_clean(C);
}
s_free(data);
lwqq_http_request_free(req);
return err;
}

static void replace_img_ext(LwqqHttpRequest* req, LwqqMsgContent* C)
Expand All @@ -202,7 +211,7 @@ static void replace_img_ext(LwqqHttpRequest* req, LwqqMsgContent* C)
LwqqAsyncEvent* upload_image_to_server(qq_account* ac, PurpleStoredImage* img, LwqqMsgContent** Content)
{
const char* name = purple_imgstore_get_filename(img);
LwqqMsgContent* C = LWQQ_CONTENT_EXT_IMG(name);
LwqqMsgContent* C = LWQQ_CONTENT_EXT_IMG(NULL);
LwqqHttpRequest* req
= lwqq_http_request_new(ac->settings.image_server);
req->lc = ac->qq;
Expand All @@ -213,7 +222,7 @@ LwqqAsyncEvent* upload_image_to_server(qq_account* ac, PurpleStoredImage* img, L
req->add_form(req, LWQQ_FORM_CONTENT, "user", ac->qq->myself->qqnumber);
req->add_file_content(req, "name", name, buffer, len, ext);
*Content = C;
return req->do_request_async(req, 0, "", _C_(3p, set_img_url, req, C, buffer));
return req->do_request_async(req, 0, "", _C_(3p_i, set_img_url, req, C, buffer));
}

LwqqAsyncEvent* download_image_from_server(qq_account* ac, LwqqMsgContent* C)
Expand All @@ -222,3 +231,11 @@ LwqqAsyncEvent* download_image_from_server(qq_account* ac, LwqqMsgContent* C)
req->lc = ac->qq;
return req->do_request_async(req, 0, "", _C_(2p, replace_img_ext, req, C));
}
void qq_upload_image_receipt(LwqqAsyncEvent* ev, LwqqMsgMessage* msg)
{
if(!ev || ev->result == LWQQ_EC_OK) return;
char message[1024];
qq_account* ac = ev->lc->data;
snprintf(message, sizeof(message), qErrorFormat, qUploadImageError, -1, "");
qq_sys_msg_write(ac, msg->super.super.type, msg->super.to, message, PURPLE_MESSAGE_ERROR, time(0));
}
1 change: 1 addition & 0 deletions src/qq_types.h
Expand Up @@ -130,6 +130,7 @@ LwqqAsyncEvent* upload_image_to_server(qq_account* ac, PurpleStoredImage* img,
LwqqAsyncEvent* download_image_from_server(qq_account* ac, LwqqMsgContent* C);
void send_file_message(LwqqHttpRequest* req, PurpleXfer* xfer);
void qq_ask_download_file(qq_account* ac, LwqqMsgContent* C, const char* local_id);
void qq_upload_image_receipt(LwqqAsyncEvent* ev, LwqqMsgMessage* msg);
//=============================================================

LwqqBuddy* find_buddy_by_qqnumber(LwqqClient* lc, const char* qqnum);
Expand Down
7 changes: 5 additions & 2 deletions src/translate.c
Expand Up @@ -225,6 +225,8 @@ static LwqqMsgContent* build_face_direct(int num)
c->data.face = num;
return c;
}


LwqqAsyncEvset* translate_message_to_struct(qq_account* ac, const char* to,
const char* what, LwqqMsg* msg, int using_cface)
{
Expand Down Expand Up @@ -268,8 +270,9 @@ LwqqAsyncEvset* translate_message_to_struct(qq_account* ac, const char* to,
snprintf(buf, sizeof(buf), "%d", img_id);
// record extra information to file_id
if (ac->settings.image_server) {
lwqq_async_evset_add_event(set,
upload_image_to_server(ac, simg, &c));
LwqqAsyncEvent* ev = upload_image_to_server(ac, simg, &c);
lwqq_async_add_event_listener(ev, _C_(2p, qq_upload_image_receipt, ev, msg));
lwqq_async_evset_add_event(set, ev);
c->data.ext.param[2]
= s_strdup(buf); // store a special value for echo
} else if (using_cface || msg->type == LWQQ_MS_GROUP_MSG) {
Expand Down
20 changes: 12 additions & 8 deletions src/webqq.c
Expand Up @@ -1730,21 +1730,25 @@ void send_file_message(LwqqHttpRequest* req, PurpleXfer* xfer)
qq_account* ac = lc->data;
LwqqMsgOffFile* file = xfer->data;
PurpleConvChat* chat;
LwqqMsgType mt = xfer->remote_port;
if (err) {
qq_sys_msg_write(ac, LWQQ_MS_BUDDY_MSG, file->super.to,
_("Send offline file failed"), PURPLE_MESSAGE_ERROR,
time(NULL));
purple_xfer_set_completed(xfer, 1);
snprintf(message, sizeof(message), qErrorFormat, qUploadFileError,
lwqq_http_impl_errno(req), lwqq_http_impl_errstr(req));
qq_sys_msg_write(ac, mt, file->super.to, message,
PURPLE_MESSAGE_ERROR, time(NULL));
} else {
struct stat st = {0};
stat(xfer->local_filename, &st);
snprintf(message, sizeof(message), ":file:`%s ``%s``%lu`", req->response,
strrchr(xfer->local_filename, '/') + 1, st.st_size);
if(purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, xfer->who, xfer->account))
if(mt == LWQQ_MS_BUDDY_MSG)
qq_send_im(xfer->account->gc, xfer->who, message, PURPLE_MESSAGE_SEND);
else if ((chat = PURPLE_CONV_CHAT(purple_find_conversation_with_account(
PURPLE_CONV_TYPE_CHAT, xfer->who, xfer->account))))
qq_send_chat(xfer->account->gc, chat->id, message, PURPLE_MESSAGE_SEND);
else{
chat = PURPLE_CONV_CHAT(purple_find_conversation_with_account(
PURPLE_CONV_TYPE_CHAT, xfer->who, xfer->account));
qq_send_chat(xfer->account->gc, chat->id, message,
PURPLE_MESSAGE_SEND);
}
}
lwqq_msg_free((LwqqMsg*)file);
purple_xfer_set_completed(xfer, 1);
Expand Down

0 comments on commit 1139a94

Please sign in to comment.