music.c: cosmetix
[k8lowj.git] / src / liblj / login.c
blob6953344a0b4e1befcd81764b832426b37c8ab992
1 /* liblivejournal - a client library for LiveJournal.
2 * Copyright (C) 2003 Evan Martin <evan@livejournal.com>
4 * vim: tabstop=4 shiftwidth=4 noexpandtab :
5 */
7 #include <glib.h>
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"
15 static void
16 read_moods(LJResult *result, LJServer *s) {
17 LJMood *m;
18 char *id, *name;
19 int moodcount;
20 int i;
22 /* grab moods */
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);
27 if (!id) continue;
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;
33 m = lj_mood_new();
34 m->id = atoi(id);
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);
43 static void
44 read_pickws(LJResult *result, LJUser *u) {
45 int pickwcount;
46 int i;
48 /* first, free all existing pickws. */
49 if (u->pickws) {
50 g_slist_foreach(u->pickws, (GFunc)g_free, NULL);
51 g_slist_free(u->pickws);
52 u->pickws = NULL;
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);
60 if (!kw) continue;
62 if (lj_server_unicode(u->server))
63 kw = g_utf8_normalize(kw, -1, G_NORMALIZE_DEFAULT);
64 else
65 kw = g_strdup(kw);
67 u->pickws = g_slist_insert_sorted(u->pickws, kw,
68 (GCompareFunc)g_utf8_collate);
72 static void
73 read_friendgroups(LJResult *result, LJUser *u) {
74 int fgmax;
75 int i;
76 char *fgname;
77 LJFriendGroup *fg;
78 char *pub;
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();
95 fg->id = i;
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);
104 static void
105 read_usejournals(LJResult *result, LJUser *u) {
106 int i, accesscount;
107 char *journal;
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);
129 static GSList*
130 webmenu_build_submenu(LJResult *result, int base) {
131 char *str;
132 int i, count;
133 LJWebMenuItem *wmi;
134 GSList *list = NULL;
136 str = lj_result_getf(result, "menu_%d_count", base);
137 if (str == NULL) {
138 g_warning("menu with no elements?");
139 return NULL;
141 count = atoi(str);
143 for (i = 1; i <= count; i++) {
144 wmi = webmenuitem_build(result, base, i);
145 if (wmi)
146 list = g_slist_append(list, wmi);
148 return list;
151 static LJWebMenuItem*
152 webmenuitem_build(LJResult *result, int base, int i) {
153 LJWebMenuItem *wmi;
154 char *text, *url, *sub;
156 text = lj_result_getf(result, "menu_%d_%d_text", base, i);
157 if (text == NULL) {
158 g_warning("menu item has no text?");
159 return NULL;
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 */
172 int subbase;
173 subbase = atoi(sub);
174 wmi->text = g_strdup(text);
175 wmi->subitems = webmenu_build_submenu(result, subbase);
176 } else {
177 g_warning("unknown menu item type...");
178 g_free(wmi);
179 return NULL;
181 return wmi;
184 static void
185 read_webmenu(LJResult *result, LJUser *u) {
186 lj_webmenu_free(u->webmenu);
187 u->webmenu = webmenu_build_submenu(result, 0);
190 static void
191 read_message(LJLogin *login, LJResult *result) {
192 char *value;
193 if ((value = lj_result_get(result, "message")) != NULL)
194 login->message = g_strdup(value);
197 static void
198 read_user(LJResult *result, LJUser *u) {
199 char *value;
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"))) {
205 g_free(u->fullname);
206 u->fullname = g_strdup(value);
210 static void
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);
221 LJLogin*
222 lj_login_new(LJUser *user, const char *clientversion) {
223 LJLogin *login = g_new0(LJLogin, 1);
224 LJVerb *verb = (LJVerb*)login;
225 LJRequest *request;
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);
235 return login;
238 void
239 lj_login_free(LJLogin *login) {
240 lj_verb_free_contents((LJVerb*)login);
241 g_free(login->message);
242 g_free(login);