libpurple/protocols/demo/purpledemocontacts.c

changeset 42203
9cb78e799a79
parent 42182
3fc2d2b7b7a8
child 42205
d3fb75a80601
equal deleted inserted replaced
42202:2273647d24b0 42203:9cb78e799a79
24 24
25 /****************************************************************************** 25 /******************************************************************************
26 * Helpers 26 * Helpers
27 *****************************************************************************/ 27 *****************************************************************************/
28 static void 28 static void
29 purple_demo_protocol_load_status(PurpleBuddy *buddy, JsonObject *buddy_object) 29 purple_demo_contacts_load_contact_icon(PurpleContactInfo *info,
30 const char *name)
31 {
32 GdkPixbuf *pixbuf = NULL;
33 GError *error = NULL;
34 char *path = NULL;
35
36 path = g_strdup_printf("/im/pidgin/purple/demo/buddy_icons/%s.png", name);
37 pixbuf = gdk_pixbuf_new_from_resource(path, &error);
38
39 if(error != NULL) {
40 g_message("Failed to load find an icon for %s: %s", path,
41 error->message);
42
43 g_free(path);
44 g_clear_error(&error);
45
46 return;
47 }
48
49 g_free(path);
50
51 if(GDK_IS_PIXBUF(pixbuf)) {
52 purple_contact_info_set_avatar(info, pixbuf);
53
54 g_clear_object(&pixbuf);
55 }
56 }
57
58 static void
59 purple_demo_contacts_load_contact_person(JsonObject *person_object,
60 PurpleContactInfo *info)
61 {
62 PurplePerson *person = NULL;
63 const char *value = NULL;
64
65 /* If the person has an id, grab it so we can use it when constructing the
66 * person object.
67 */
68 if(json_object_has_member(person_object, "id")) {
69 value = json_object_get_string_member(person_object, "id");
70 }
71
72 /* Now create the person with the optional id. */
73 person = g_object_new(PURPLE_TYPE_PERSON, "id", value, NULL);
74
75 /* Alias */
76 if(json_object_has_member(person_object, "alias")) {
77 value = json_object_get_string_member(person_object, "alias");
78 if(!purple_strempty(value)) {
79 purple_person_set_alias(person, value);
80 }
81 }
82
83 /* Create the link between the person and the contact info. */
84 purple_person_add_contact_info(person, info);
85 purple_contact_info_set_person(info, person);
86
87 g_clear_object(&person);
88 }
89
90 static void
91 purple_demo_contacts_load_contact_presence(JsonObject *presence_object,
92 PurpleContactInfo *info)
30 { 93 {
31 PurplePresence *presence = NULL; 94 PurplePresence *presence = NULL;
32 JsonObject *status_object = NULL; 95 const gchar *value = NULL;
33 96
34 if(!json_object_has_member(buddy_object, "status")) { 97 presence = purple_contact_info_get_presence(info);
35 return; 98
36 } 99 /* Emoji */
37 100 if(json_object_has_member(presence_object, "emoji")) {
38 presence = purple_buddy_get_presence(buddy); 101 value = json_object_get_string_member(presence_object, "emoji");
39 102 if(!purple_strempty(value)) {
40 status_object = json_object_get_object_member(buddy_object, "status"); 103 purple_presence_set_emoji(presence, value);
41 104 }
42 if(json_object_has_member(status_object, "primitive")) { 105 }
43 PurplePresencePrimitive primitive = PURPLE_PRESENCE_PRIMITIVE_OFFLINE; 106
44 const char *name = NULL; 107 /* Idle Time */
45 108 if(json_object_has_member(presence_object, "idle")) {
46 name = json_object_get_string_member(status_object, "primitive");
47 if(!purple_strempty(name)) {
48 GEnumClass *klass = NULL;
49 GEnumValue *value = NULL;
50
51 klass = g_type_class_ref(PURPLE_TYPE_PRESENCE_PRIMITIVE);
52 value = g_enum_get_value_by_nick(klass, name);
53
54 if(value != NULL) {
55 primitive = value->value;
56 }
57
58 g_type_class_unref(klass);
59 }
60
61 purple_presence_set_primitive(presence, primitive);
62 }
63
64 if(json_object_has_member(status_object, "message")) {
65 const gchar *message = NULL;
66
67 message = json_object_get_string_member(status_object, "message");
68
69 purple_presence_set_message(presence, message);
70 }
71
72 if(json_object_has_member(status_object, "idle")) {
73 GDateTime *now = NULL; 109 GDateTime *now = NULL;
74 GDateTime *idle_since = NULL; 110 GDateTime *idle_since = NULL;
75 gint idle_minutes = 0; 111 gint64 ivalue = 0;
76 112
77 idle_minutes = json_object_get_int_member(status_object, "idle"); 113 ivalue = json_object_get_int_member(presence_object, "idle");
114
78 now = g_date_time_new_now_local(); 115 now = g_date_time_new_now_local();
79 idle_since = g_date_time_add_minutes(now, -1 * idle_minutes); 116 idle_since = g_date_time_add_minutes(now, -1 * ivalue);
80 117
81 purple_presence_set_idle(presence, TRUE, idle_since); 118 purple_presence_set_idle(presence, TRUE, idle_since);
82 119
83 g_date_time_unref(idle_since); 120 g_date_time_unref(idle_since);
84 g_date_time_unref(now); 121 g_date_time_unref(now);
85 } 122 }
86 } 123
87 124 /* Message */
88 static void 125 if(json_object_has_member(presence_object, "message")) {
89 purple_demo_protocol_load_icon(PurpleAccount *account, const gchar *name) 126 value = json_object_get_string_member(presence_object, "message");
90 { 127 if(!purple_strempty(value)) {
91 gchar *path = NULL; 128 purple_presence_set_message(presence, value);
92 GBytes *icon = NULL; 129 }
93 gpointer icon_data = NULL; 130 }
94 gsize icon_len = 0; 131
95 132 /* Mobile */
96 path = g_strdup_printf("/im/pidgin/purple/demo/buddy_icons/%s.png", name); 133 if(json_object_has_member(presence_object, "mobile")) {
97 icon = g_resource_lookup_data(purple_demo_get_resource(), path, G_RESOURCE_LOOKUP_FLAGS_NONE, NULL); 134 gboolean bvalue = FALSE;
98 g_free(path); 135 bvalue = json_object_get_boolean_member(presence_object, "mobile");
99 136 purple_presence_set_mobile(presence, bvalue);
100 if(icon == NULL) { 137 }
101 /* No stored icon. */ 138
102 return; 139 /* Primitive */
103 } 140 if(json_object_has_member(presence_object, "primitive")) {
104 141 PurplePresencePrimitive primitive = PURPLE_PRESENCE_PRIMITIVE_OFFLINE;
105 icon_data = g_bytes_unref_to_data(icon, &icon_len); 142
106 purple_buddy_icons_set_for_user(account, name, icon_data, icon_len, NULL); 143 value = json_object_get_string_member(presence_object, "primitive");
107 } 144 if(!purple_strempty(value)) {
108 145 GEnumClass *enum_class = NULL;
109 static void 146 GEnumValue *enum_value = NULL;
110 purple_demo_protocol_load_buddies(PurpleAccount *account, PurpleGroup *group, 147
111 PurpleMetaContact *contact, GList *buddies) 148 enum_class = g_type_class_ref(PURPLE_TYPE_PRESENCE_PRIMITIVE);
112 { 149 enum_value = g_enum_get_value_by_nick(enum_class, value);
113 while(buddies != NULL) { 150
114 JsonNode *buddy_node = NULL; 151 if(enum_value != NULL) {
115 JsonObject *buddy_object = NULL; 152 primitive = enum_value->value;
116 const gchar *name = NULL, *alias = NULL;
117
118 buddy_node = (JsonNode *)buddies->data;
119 buddy_object = json_node_get_object(buddy_node);
120
121 if(json_object_has_member(buddy_object, "name")) {
122 name = json_object_get_string_member(buddy_object, "name");
123 }
124
125 if(json_object_has_member(buddy_object, "alias")) {
126 alias = json_object_get_string_member(buddy_object, "alias");
127 }
128
129 if(name != NULL) {
130 PurpleBuddy *buddy = NULL;
131
132 buddy = purple_blist_find_buddy(account, name);
133 if(buddy == NULL) {
134 buddy = purple_buddy_new(account, name, alias);
135 purple_blist_add_buddy(buddy, contact, group, NULL);
136 } 153 }
137 154
138 purple_demo_protocol_load_icon(account, name); 155 g_type_class_unref(enum_class);
139 purple_demo_protocol_load_status(buddy, buddy_object); 156 }
140 if (purple_strequal(name, "Echo")) { 157
141 purple_protocol_got_media_caps(account, name); 158 purple_presence_set_primitive(presence, primitive);
142 } 159 }
143 } 160 }
144 161
145 buddies = g_list_delete_link(buddies, buddies); 162 static void
146 } 163 purple_demo_contacts_load_contact(PurpleContactManager *manager,
147 } 164 PurpleAccount *account,
148 165 JsonObject *contact_object)
149 static void 166 {
150 purple_demo_protocol_load_contacts(PurpleAccount *account, PurpleGroup *group, 167 PurpleContact *contact = NULL;
151 GList *contacts) 168 PurpleContactInfo *info = NULL;
152 { 169 const char *id = NULL;
153 while(contacts != NULL) { 170 const char *value = NULL;
154 PurpleMetaContact *contact = NULL; 171
155 JsonNode *contact_node = NULL; 172 /* If we have an id, grab so we can create the contact with it. */
156 JsonObject *contact_object = NULL; 173 if(json_object_has_member(contact_object, "id")) {
157 174 id = json_object_get_string_member(contact_object, "id");
158 contact_node = (JsonNode *)contacts->data; 175 }
159 contact_object = json_node_get_object(contact_node); 176
160 177 /* Create the contact using the id if one was provided. */
161 contact = purple_meta_contact_new(); 178 contact = purple_contact_new(account, id);
162 179 info = PURPLE_CONTACT_INFO(contact);
163 /* Set the contact's alias if one was specified. */ 180
164 if(json_object_has_member(contact_object, "alias")) { 181 /* Alias */
165 const gchar *alias = NULL; 182 if(json_object_has_member(contact_object, "alias")) {
166 183 value = json_object_get_string_member(contact_object, "alias");
167 alias = json_object_get_string_member(contact_object, "alias"); 184 if(!purple_strempty(value)) {
168 185 purple_contact_info_set_alias(info, value);
169 purple_meta_contact_set_alias(contact, alias); 186 }
170 } 187 }
171 188
172 /* Add the contact to the group. */ 189 /* Color */
173 purple_blist_add_contact(contact, group, NULL); 190 if(json_object_has_member(contact_object, "color")) {
174 191 value = json_object_get_string_member(contact_object, "color");
175 /* Finally add the buddies */ 192 if(!purple_strempty(value)) {
176 if(json_object_has_member(contact_object, "buddies")) { 193 purple_contact_info_set_color(info, value);
177 JsonArray *buddies_array = NULL; 194 }
178 GList *buddies = NULL; 195 }
179 196
180 buddies_array = json_object_get_array_member(contact_object, 197 /* Display Name */
181 "buddies"); 198 if(json_object_has_member(contact_object, "display_name")) {
182 buddies = json_array_get_elements(buddies_array); 199 value = json_object_get_string_member(contact_object, "display_name");
183 200 if(!purple_strempty(value)) {
184 purple_demo_protocol_load_buddies(account, group, contact, 201 purple_contact_info_set_display_name(info, value);
185 buddies); 202 }
186 } 203 }
187 204
188 contacts = g_list_delete_link(contacts, contacts); 205 /* Username */
189 } 206 if(json_object_has_member(contact_object, "username")) {
190 } 207 value = json_object_get_string_member(contact_object, "username");
191 208 if(!purple_strempty(value)) {
192 static void 209 purple_contact_info_set_username(info, value);
193 purple_demo_protocol_load_groups(PurpleAccount *account, 210
194 JsonObject *root_object) 211 purple_demo_contacts_load_contact_icon(info, value);
195 { 212 }
196 PurpleGroup *last = NULL; 213 }
197 GList *groups = NULL; 214
198 215 /* Load the person. */
199 /* Get the members of the root object, this is our list of group names. */ 216 if(json_object_has_member(contact_object, "person")) {
200 groups = json_object_get_members(root_object); 217 JsonObject *person_object = NULL;
201 218
202 while(groups != NULL) { 219 person_object = json_object_get_object_member(contact_object,
203 PurpleGroup *group = NULL; 220 "person");
204 JsonArray *group_array = NULL; 221
205 GList *contacts = NULL; 222 purple_demo_contacts_load_contact_person(person_object, info);
206 const gchar *group_name = (const gchar *)groups->data; 223 }
207 224
208 /* Add each group according to the json file. */ 225 /* Load the presence. */
209 group = purple_group_new(group_name); 226 if(json_object_has_member(contact_object, "presence")) {
210 purple_blist_add_group(group, PURPLE_BLIST_NODE(last)); 227 JsonObject *presence_object = NULL;
211 228
212 /* Now get the contacts and add them. */ 229 presence_object = json_object_get_object_member(contact_object,
213 group_array = json_object_get_array_member(root_object, group_name); 230 "presence");
214 contacts = json_array_get_elements(group_array); 231
215 232 purple_demo_contacts_load_contact_presence(presence_object, info);
216 purple_demo_protocol_load_contacts(account, group, contacts); 233 }
217 234
218 groups = g_list_delete_link(groups, groups); 235 /* Finally add the contact to the contact manager. */
219 236 purple_contact_manager_add(manager, contact);
220 last = group;
221 }
222 } 237 }
223 238
224 /****************************************************************************** 239 /******************************************************************************
225 * Local Exports 240 * Local Exports
226 *****************************************************************************/ 241 *****************************************************************************/
227 void 242 void
228 purple_demo_contacts_load(PurpleAccount *account) { 243 purple_demo_contacts_load(PurpleAccount *account) {
244 PurpleContactManager *manager = NULL;
245 GError *error = NULL;
229 GInputStream *istream = NULL; 246 GInputStream *istream = NULL;
230 GError *error = NULL; 247 GList *contacts = NULL;
248 JsonArray *contacts_array = NULL;
249 JsonNode *root_node = NULL;
231 JsonParser *parser = NULL; 250 JsonParser *parser = NULL;
232 JsonNode *root_node = NULL;
233 JsonObject *root_object = NULL;
234 251
235 /* get a stream to the contacts.json resource */ 252 /* get a stream to the contacts.json resource */
236 istream = g_resource_open_stream(purple_demo_get_resource(), 253 istream = g_resource_open_stream(purple_demo_get_resource(),
237 "/im/pidgin/purple/demo/contacts.json", 254 "/im/pidgin/purple/demo/contacts.json",
238 G_RESOURCE_LOOKUP_FLAGS_NONE, NULL); 255 G_RESOURCE_LOOKUP_FLAGS_NONE, NULL);
244 g_critical("%s", error->message); 261 g_critical("%s", error->message);
245 g_clear_error(&error); 262 g_clear_error(&error);
246 return; 263 return;
247 } 264 }
248 265
249 /* Load our data */
250 root_node = json_parser_get_root(parser); 266 root_node = json_parser_get_root(parser);
251 root_object = json_node_get_object(root_node); 267
252 268 manager = purple_contact_manager_get_default();
253 /* Load the groups! */ 269
254 purple_demo_protocol_load_groups(account, root_object); 270 /* Load the contacts! */
271 contacts_array = json_node_get_array(root_node);
272 contacts = json_array_get_elements(contacts_array);
273 while(contacts != NULL) {
274 JsonNode *contact_node = NULL;
275 JsonObject *contact_object = NULL;
276
277 contact_node = contacts->data;
278 contact_object = json_node_get_object(contact_node);
279
280 purple_demo_contacts_load_contact(manager, account, contact_object);
281
282 contacts = g_list_delete_link(contacts, contacts);
283 }
255 284
256 /* Clean up everything else... */ 285 /* Clean up everything else... */
257 g_clear_object(&parser); 286 g_clear_object(&parser);
258 287
259 g_input_stream_close(istream, NULL, NULL); 288 g_input_stream_close(istream, NULL, NULL);

mercurial