void GaduChatImageService::handleEventImageRequest(struct gg_event *e) { kdebugm(KDEBUG_INFO, qPrintable(QString("Received image request. sender: %1, size: %2, crc32: %3\n") .arg(e->event.image_request.sender).arg(e->event.image_request.size).arg(e->event.image_request.crc32))); uint32_t size = e->event.image_request.size; uint32_t crc32 = e->event.image_request.crc32; if (!ImagesToSend.contains(qMakePair(size, crc32))) { kdebugm(KDEBUG_WARNING, "Image data not found\n"); return; } ImageToSend &image = ImagesToSend[qMakePair(size, crc32)]; if (image.content.isNull()) { loadImageContent(image); if (image.content.isNull()) return; } gg_image_reply(Protocol->gaduSession(), e->event.image_request.sender, qPrintable(image.fileName), image.content.constData(), image.content.length()); image.content = QByteArray(); image.lastSent = QDateTime::currentDateTime(); }
void ggp_image_send(PurpleConnection *gc, const struct gg_event_image_request *image_request) { GGPInfo *accdata = purple_connection_get_protocol_data(gc); ggp_image_session_data *sdata = ggp_image_get_sdata(gc); ggp_image_sent *sent_image; PurpleStoredImage *image; PurpleConversation *conv; uint64_t id; gchar *gg_filename; purple_debug_info("gg", "ggp_image_send: got image request " "[uin=%u, crc=%u, size=%u]\n", image_request->sender, image_request->crc32, image_request->size); id = ggp_image_params_to_id(image_request->crc32, image_request->size); sent_image = g_hash_table_lookup(sdata->sent_images, &id); if (sent_image == NULL && image_request->sender == ggp_str_to_uin( purple_account_get_username(purple_connection_get_account(gc)))) { purple_debug_misc("gg", "ggp_image_send: requested image " "not found, but this may be another session request\n"); return; } if (sent_image == NULL) { purple_debug_warning("gg", "ggp_image_send: requested image " "not found\n"); return; } purple_debug_misc("gg", "ggp_image_send: requested image found " "[id=" GGP_IMAGE_ID_FORMAT ", stored id=%d, conv=%s]\n", id, sent_image->id, sent_image->conv_name); image = purple_imgstore_find_by_id(sent_image->id); if (!image) { purple_debug_error("gg", "ggp_image_send: requested image " "found, but doesn't exists in image store\n"); g_hash_table_remove(sdata->sent_images, GINT_TO_POINTER(image_request->crc32)); return; } /* TODO: check allowed recipients */ gg_filename = g_strdup_printf(GGP_IMAGE_ID_FORMAT, id); gg_image_reply(accdata->session, image_request->sender, gg_filename, purple_imgstore_get_data(image), purple_imgstore_get_size(image)); g_free(gg_filename); conv = purple_conversations_find_with_account( sent_image->conv_name, purple_connection_get_account(gc)); if (conv != NULL) { gchar *msg = g_strdup_printf(_("Image delivered to %u."), image_request->sender); purple_conversation_write(conv, "", msg, PURPLE_MESSAGE_NO_LOG | PURPLE_MESSAGE_NOTIFY, time(NULL)); g_free(msg); } }