1 /* liblivejournal - a client library for LiveJournal.
2 * Copyright (C) 2003 Evan Martin <evan@livejournal.com>
4 * vim: tabstop=4 shiftwidth=4 noexpandtab :
8 #include <stdlib.h> /* atoi */
10 #include "liblj/protocol.h"
11 #include "liblj/serveruser.h"
12 #include "liblj/friends.h"
13 #include "liblj/login.h"
16 read_moods(LJResult
*result
, LJServer
*s
) {
23 moodcount
= lj_result_get_int(result
, "mood_count");
25 for (i
= 1; i
< moodcount
+1; i
++) { /* 1-based list */
26 id
= lj_result_getf(result
, "mood_%d_id", i
);
28 name
= lj_result_getf(result
, "mood_%d_name", i
);
30 /* work around LiveJournal bug: sometimes returns unnamed moods. */
31 if (!name
|| !name
[0]) continue;
35 m
->name
= g_strdup(name
);
36 m
->parentid
= lj_result_getf_int(result
, "mood_%d_parent", i
);
38 s
->moods
= g_slist_insert_sorted(s
->moods
, m
,
39 (GCompareFunc
)lj_mood_compare
);
44 read_pickws(LJResult
*result
, LJUser
*u
) {
48 /* first, free all existing pickws. */
50 g_slist_foreach(u
->pickws
, (GFunc
)g_free
, NULL
);
51 g_slist_free(u
->pickws
);
55 /* grab picture keywords */
56 pickwcount
= lj_result_get_int(result
, "pickw_count");
58 for (i
= 1; i
< pickwcount
+1; i
++) { /* 1-based list */
59 char *kw
= lj_result_getf(result
, "pickw_%d", i
);
62 if (lj_server_unicode(u
->server
))
63 kw
= g_utf8_normalize(kw
, -1, G_NORMALIZE_DEFAULT
);
67 u
->pickws
= g_slist_insert_sorted(u
->pickws
, kw
,
68 (GCompareFunc
)g_utf8_collate
);
73 read_friendgroups(LJResult
*result
, LJUser
*u
) {
80 /* first, free all existing friendgroups. */
81 if (u
->friendgroups
) {
82 g_slist_foreach(u
->friendgroups
, (GFunc
)lj_friend_group_free
, NULL
);
83 g_slist_free(u
->friendgroups
);
84 u
->friendgroups
= NULL
;
87 /* then read the new ones. */
88 fgmax
= lj_result_get_int(result
, "frgrp_maxnum");
90 for (i
= 1; i
<= fgmax
; i
++) {
91 fgname
= lj_result_getf(result
, "frgrp_%d_name", i
);
92 if (!fgname
) continue;
94 fg
= lj_friendgroup_new();
96 fg
->name
= g_strdup(fgname
);
97 pub
= lj_result_getf(result
, "frgrp_%d_public", i
);
98 fg
->ispublic
= pub
&& !(g_ascii_strcasecmp(pub
, "1"));
100 u
->friendgroups
= g_slist_append(u
->friendgroups
, fg
);
105 read_usejournals(LJResult
*result
, LJUser
*u
) {
109 /* first, free all existing usejournals. */
110 if (u
->usejournals
) {
111 g_slist_foreach(u
->usejournals
, (GFunc
)g_free
, NULL
);
112 g_slist_free(u
->usejournals
);
113 u
->usejournals
= NULL
;
116 /* then read the new ones. */
117 accesscount
= lj_result_get_int(result
, "access_count");
119 for (i
= 1; i
< accesscount
+1; i
++) {
120 journal
= lj_result_getf(result
, "access_%d", i
);
121 if (!journal
) continue;
123 u
->usejournals
= g_slist_append(u
->usejournals
, g_strdup(journal
));
127 static LJWebMenuItem
* webmenuitem_build(LJResult
*result
, int base
, int i
);
130 webmenu_build_submenu(LJResult
*result
, int base
) {
136 str
= lj_result_getf(result
, "menu_%d_count", base
);
138 g_warning("menu with no elements?");
143 for (i
= 1; i
<= count
; i
++) {
144 wmi
= webmenuitem_build(result
, base
, i
);
146 list
= g_slist_append(list
, wmi
);
151 static LJWebMenuItem
*
152 webmenuitem_build(LJResult
*result
, int base
, int i
) {
154 char *text
, *url
, *sub
;
156 text
= lj_result_getf(result
, "menu_%d_%d_text", base
, i
);
158 g_warning("menu item has no text?");
161 url
= lj_result_getf(result
, "menu_%d_%d_url", base
, i
);
162 sub
= lj_result_getf(result
, "menu_%d_%d_sub", base
, i
);
164 wmi
= g_new0(LJWebMenuItem
, 1);
166 if (text
[0] == '-' && text
[1] == 0) { /* separator */
167 ; /* empty item is separator. */
168 } else if (url
!= NULL
) { /* url menu item */
169 wmi
->text
= g_strdup(text
);
170 wmi
->url
= g_strdup(url
);
171 } else if (sub
!= NULL
) { /* submenu */
174 wmi
->text
= g_strdup(text
);
175 wmi
->subitems
= webmenu_build_submenu(result
, subbase
);
177 g_warning("unknown menu item type...");
185 read_webmenu(LJResult
*result
, LJUser
*u
) {
186 lj_webmenu_free(u
->webmenu
);
187 u
->webmenu
= webmenu_build_submenu(result
, 0);
191 read_message(LJLogin
*login
, LJResult
*result
) {
193 if ((value
= lj_result_get(result
, "message")) != NULL
)
194 login
->message
= g_strdup(value
);
198 read_user(LJResult
*result
, LJUser
*u
) {
200 read_pickws(result
, u
);
201 read_friendgroups(result
, u
);
202 read_usejournals(result
, u
);
203 read_webmenu(result
, u
);
204 if ((value
= lj_result_get(result
, "name"))) {
206 u
->fullname
= g_strdup(value
);
211 parse_result(LJVerb
*verb
) {
212 LJLogin
*login
= (LJLogin
*)verb
;
213 LJUser
*u
= lj_request_get_user(verb
->request
);
214 LJServer
*s
= u
->server
;
215 LJResult
*result
= verb
->result
;
216 read_moods(result
, s
);
217 read_user(result
, u
);
218 read_message(login
, result
);
222 lj_login_new(LJUser
*user
, const char *clientversion
) {
223 LJLogin
*login
= g_new0(LJLogin
, 1);
224 LJVerb
*verb
= (LJVerb
*)login
;
227 lj_verb_init(verb
, user
, "login", FALSE
, parse_result
);
228 request
= verb
->request
;
230 lj_request_add(request
, "clientversion", clientversion
);
231 lj_request_add_int(request
, "getmoods", lj_server_get_last_cached_moodid(user
->server
));
232 lj_request_add_int(request
, "getmenus", 1);
233 lj_request_add_int(request
, "getpickws", 1);
239 lj_login_free(LJLogin
*login
) {
240 lj_verb_free_contents((LJVerb
*)login
);
241 g_free(login
->message
);