void PurpleLine::upload_media(std::string message_id, std::string type, std::string data) { std::string boundary; std::cout << "Process of upload a image." << std::endl; std::cout << message_id << std::endl; std::cout << type << std::endl; do { gchar *random_string = purple_uuid_random(); boundary = random_string; g_free(random_string); } while (data.find(boundary) != std::string::npos); std::stringstream body; std::cout << boundary << std::endl; std::cout << message_id << std::endl; std::cout << data.size() << std::endl; std::cout << type << std::endl; body << "--" << boundary << "\r\n" << "Content-Disposition: form-data; name=\"params\"\r\n" << "\r\n" << "{" << "\"name\":\"media\"," << "\"oid\":\"" << message_id << "\"," << "\"size\":\"" << data.size() << "\"," << "\"type\":\"" << type << "\"," << "\"ver\":\"1.0\"" << "}" << "\r\n--" << boundary << "\r\n" << "Content-Disposition: form-data; name=\"file\"; filename=\"media\"\r\n" << "Content-Type: image/jpeg\r\n" << "\r\n" << data << "\r\n--" << boundary << "--\r\n"; std::string content_type = std::string("multipart/form-data; boundary=") + boundary; os_http.write_virt((const uint8_t *)body.str().c_str(), body.tellp()); os_http.request("POST", "/talk/m/upload.nhn", content_type, [this]() { if (os_http.status_code() != 201) { purple_debug_warning( "line", "Couldn't upload message media. Status: %d\n", os_http.status_code()); } }); }
/*------------------------------------------------------------------------ * Send a typing indicator event. * * @param gc The connection object * @param name The username of the contact * @param state The typing state to be reported. */ static unsigned int mxit_send_typing( PurpleConnection *gc, const char *name, PurpleTypingState state ) { PurpleAccount* account = purple_connection_get_account( gc ); struct MXitSession* session = purple_connection_get_protocol_data( gc ); PurpleBuddy* buddy; struct contact* contact; gchar* messageId = NULL; /* find the buddy information for this contact (reference: "libpurple/blist.h") */ buddy = purple_find_buddy( account, name ); if ( !buddy ) { purple_debug_warning( MXIT_PLUGIN_ID, "mxit_send_typing: unable to find the buddy '%s'\n", name ); return 0; } contact = purple_buddy_get_protocol_data( buddy ); if ( !contact ) return 0; /* does this contact support and want typing notification? */ if ( ! ( contact->capabilities & MXIT_PFLAG_TYPING ) ) return 0; messageId = purple_uuid_random(); /* generate a unique message id */ switch ( state ) { case PURPLE_TYPING : /* currently typing */ mxit_send_msgevent( session, name, messageId, CP_MSGEVENT_TYPING ); break; case PURPLE_TYPED : /* stopped typing */ case PURPLE_NOT_TYPING : /* not typing / erased all text */ mxit_send_msgevent( session, name, messageId, CP_MSGEVENT_STOPPED ); break; default: break; } g_free( messageId ); return 0; }
static const gchar * ggp_roster_send_update_group_add( ggp_roster_content *content, PurpleGroup *group) { gchar *id_dyn; const char *id_existing, *group_name; static gchar id[40]; PurpleXmlNode *group_node; gboolean succ = TRUE; if (group) { group_name = purple_group_get_name(group); id_existing = g_hash_table_lookup(content->group_ids, group_name); } else id_existing = GGP_ROSTER_GROUPID_DEFAULT; if (id_existing) return id_existing; purple_debug_info("gg", "ggp_roster_send_update_group_add: adding %s\n", purple_group_get_name(group)); id_dyn = purple_uuid_random(); g_snprintf(id, sizeof(id), "%s", id_dyn); g_free(id_dyn); group_node = purple_xmlnode_new_child(content->groups_node, "Group"); succ &= ggp_xml_set_string(group_node, "Id", id); succ &= ggp_xml_set_string(group_node, "Name", group_name); succ &= ggp_xml_set_string(group_node, "IsExpanded", "true"); succ &= ggp_xml_set_string(group_node, "IsRemovable", "true"); content->needs_update = TRUE; g_hash_table_insert(content->group_ids, g_strdup(group_name), g_strdup(id)); g_hash_table_insert(content->group_nodes, g_strdup(id), group_node); g_return_val_if_fail(succ, NULL); return id; }
static gboolean ggp_roster_send_update_contact_update(PurpleConnection *gc, ggp_roster_change *change) { PurpleAccount *account = purple_connection_get_account(gc); ggp_roster_content *content = ggp_roster_get_rdata(gc)->content; uin_t uin = change->data.uin; PurpleBuddy *buddy; PurpleXmlNode *buddy_node, *contact_groups; gboolean succ = TRUE; const char *group_id; g_return_val_if_fail(change->type == GGP_ROSTER_CHANGE_CONTACT_UPDATE, FALSE); buddy = purple_blist_find_buddy(account, ggp_uin_to_str(uin)); if (!buddy) return TRUE; buddy_node = g_hash_table_lookup(content->contact_nodes, GINT_TO_POINTER(uin)); group_id = ggp_roster_send_update_group_add(content, ggp_purplew_buddy_get_group_only(buddy)); if (buddy_node) { /* update existing */ purple_debug_misc("gg", "ggp_roster_send_update_contact_update:" " updating %u...\n", uin); succ &= ggp_xml_set_string(buddy_node, "ShowName", purple_buddy_get_alias(buddy)); contact_groups = purple_xmlnode_get_child(buddy_node, "Groups"); g_assert(contact_groups); ggp_xmlnode_remove_children(contact_groups); succ &= ggp_xml_set_string(contact_groups, "GroupId", group_id); g_return_val_if_fail(succ, FALSE); return TRUE; } /* add new */ purple_debug_misc("gg", "ggp_roster_send_update_contact_update: " "adding %u...\n", uin); buddy_node = purple_xmlnode_new_child(content->contacts_node, "Contact"); succ &= ggp_xml_set_string(buddy_node, "Guid", purple_uuid_random()); succ &= ggp_xml_set_uint(buddy_node, "GGNumber", uin); succ &= ggp_xml_set_string(buddy_node, "ShowName", purple_buddy_get_alias(buddy)); contact_groups = purple_xmlnode_new_child(buddy_node, "Groups"); g_assert(contact_groups); succ &= ggp_xml_set_string(contact_groups, "GroupId", group_id); purple_xmlnode_new_child(buddy_node, "Avatars"); succ &= ggp_xml_set_bool(buddy_node, "FlagBuddy", TRUE); succ &= ggp_xml_set_bool(buddy_node, "FlagNormal", TRUE); succ &= ggp_xml_set_bool(buddy_node, "FlagFriend", TRUE); /* we don't use Guid, so update is not needed * content->needs_update = TRUE; */ g_hash_table_insert(content->contact_nodes, GINT_TO_POINTER(uin), buddy_node); g_return_val_if_fail(succ, FALSE); return TRUE; }