Esempio n. 1
0
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());
        }
    });
}
Esempio n. 2
0
/*------------------------------------------------------------------------
 * 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;
}
Esempio n. 3
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;
}
Esempio n. 4
0
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;
}