| 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); |