libpurple/purpleprotocolcontactsearch.c

Mon, 07 Aug 2023 23:21:08 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Mon, 07 Aug 2023 23:21:08 -0500
changeset 42266
f521c4c38c6e
permissions
-rw-r--r--

Add PurpleProtocolContactSearchInterface to search for contacts

This interface is meant for you to be able to search for new contacts to add to
your contact list. Right now this just does keyword search, but can be extended
in the future.

Searching through your contact list is the ui's responsibility.

Testing Done:
Ran the unit tests

Reviewed at https://reviews.imfreedom.org/r/2533/

42266
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
1 /*
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
2 * Purple - Internet Messaging Library
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
3 * Copyright (C) Pidgin Developers <devel@pidgin.im>
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
4 *
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
5 * Purple is the legal property of its developers, whose names are too numerous
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
6 * to list here. Please refer to the COPYRIGHT file distributed with this
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
7 * source distribution.
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
8 *
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
9 * This program is free software; you can redistribute it and/or modify
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
10 * it under the terms of the GNU General Public License as published by
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
12 * (at your option) any later version.
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
13 *
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
14 * This program is distributed in the hope that it will be useful,
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
17 * GNU General Public License for more details.
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
18 *
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
20 * along with this program; if not, see <https://www.gnu.org/licenses/>.
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
21 */
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
22
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
23 #include "purpleprotocolcontactsearch.h"
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
24
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
25 /******************************************************************************
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
26 * GInterface Implementation
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
27 *****************************************************************************/
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
28 G_DEFINE_INTERFACE(PurpleProtocolContactSearch, purple_protocol_contact_search,
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
29 PURPLE_TYPE_PROTOCOL)
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
30
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
31 static void
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
32 purple_protocol_contact_search_default_init(G_GNUC_UNUSED PurpleProtocolContactSearchInterface *iface)
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
33 {
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
34 }
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
35
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
36 /******************************************************************************
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
37 * Public API
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
38 *****************************************************************************/
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
39 void
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
40 purple_protocol_contact_search_search_async(PurpleProtocolContactSearch *search,
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
41 PurpleAccount *account,
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
42 const char *text,
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
43 GCancellable *cancellable,
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
44 GAsyncReadyCallback callback,
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
45 gpointer data)
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
46 {
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
47 PurpleProtocolContactSearchInterface *iface = NULL;
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
48
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
49 g_return_if_fail(PURPLE_IS_PROTOCOL_CONTACT_SEARCH(search));
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
50 g_return_if_fail(PURPLE_IS_ACCOUNT(account));
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
51 g_return_if_fail(!purple_strempty(text));
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
52
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
53 iface = PURPLE_PROTOCOL_CONTACT_SEARCH_GET_IFACE(search);
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
54 if(iface != NULL && iface->search_async != NULL) {
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
55 iface->search_async(search, account, text, cancellable, callback,
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
56 data);
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
57 } else {
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
58 g_warning("%s does not implement search_async",
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
59 G_OBJECT_TYPE_NAME(search));
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
60 }
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
61 }
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
62
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
63 GListModel *
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
64 purple_protocol_contact_search_search_finish(PurpleProtocolContactSearch *search,
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
65 GAsyncResult *result,
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
66 GError **error)
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
67 {
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
68 PurpleProtocolContactSearchInterface *iface = NULL;
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
69
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
70 g_return_val_if_fail(PURPLE_IS_PROTOCOL_CONTACT_SEARCH(search), NULL);
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
71
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
72 iface = PURPLE_PROTOCOL_CONTACT_SEARCH_GET_IFACE(search);
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
73 if(iface != NULL && iface->search_finish != NULL) {
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
74 GListModel *ret = iface->search_finish(search, result, error);
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
75
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
76 if(G_IS_LIST_MODEL(ret)) {
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
77 GType type = G_TYPE_INVALID;
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
78
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
79 type = g_list_model_get_item_type(G_LIST_MODEL(ret));
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
80 if(g_type_is_a(type, PURPLE_TYPE_CONTACT_INFO)) {
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
81 return ret;
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
82 }
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
83
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
84 /* The GListModel we got back doesn't have an item type that is
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
85 * PurpleContactInfo or a subclass of it.
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
86 */
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
87 g_clear_object(&ret);
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
88
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
89 g_set_error(error, PURPLE_PROTOCOL_CONTACT_SEARCH_DOMAIN, 0,
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
90 "%s returned a list of type %s which is not "
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
91 "PurpleContactInfo or a a subclass of",
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
92 G_OBJECT_TYPE_NAME(search), g_type_name(type));
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
93 }
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
94 } else {
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
95 g_warning("%s does not implement search_finish",
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
96 G_OBJECT_TYPE_NAME(search));
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
97 }
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
98
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
99 return NULL;
f521c4c38c6e Add PurpleProtocolContactSearchInterface to search for contacts
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
100 }

mercurial