1 /* logjam - a GTK client for LiveJournal.
2 * Copyright (C) 2000-2003 Gaal Yahas <gaal@forum2.org>
16 const char *jam_host_get_stock_icon (JamHost
*host
) {
17 return JAM_HOST_GET_CLASS(host
)->get_stock_icon();
21 JamAccount
*jam_host_get_account_by_username (JamHost
*host
, const char *username
, gboolean create
) {
22 JamAccount
*acc
= NULL
;
24 for (l
= host
->accounts
; l
!= NULL
; l
= l
->next
) {
26 if (strcmp(username
, jam_account_get_username(acc
)) == 0) return acc
;
28 /* this is a previously-unknown account. */
29 if (create
) return JAM_HOST_GET_CLASS(host
)->make_account(host
, username
);
34 void jam_host_add_account (JamHost
*host
, JamAccount
*acc
) {
36 host
->accounts
= g_slist_append(host
->accounts
, acc
);
40 static void *parseuserdir (const char *dirname
, void *host
) {
41 return conf_parsedirxml(dirname
, (conf_parsedirxml_fn
) jam_account_from_xml
, host
);
45 JamHost
*jam_host_from_xml (xmlDocPtr doc
, xmlNodePtr node
, void *data
) {
47 char *username
= NULL
;
51 xmlChar
*protocol
= xmlGetProp(node
, BAD_CAST
"protocol");
52 if (!protocol
|| xmlStrcmp(protocol
, BAD_CAST
"livejournal") == 0) {
53 host
= JAM_HOST(jam_host_lj_new(lj_server_new(NULL
)));
55 g_error("unknown protocol '%s'\n", protocol
);
57 if (protocol
) xmlFree(protocol
);
58 klass
= JAM_HOST_GET_CLASS(host
);
60 for (node
= node
->xmlChildrenNode
; node
!= NULL
; node
= node
->next
) {
61 XML_GET_STR("name", host
->name
)
62 XML_GET_STR("currentuser", username
)
63 XML_GET_SUB(host
, klass
->load_xml
)
64 XML_GET_END("jam_host_from_xml")
67 userspath
= g_build_filename(data
, "users", NULL
);
68 host
->accounts
= conf_parsedirlist(userspath
, parseuserdir
, host
);
71 /* after we've parsed all of the users, scan for the current one. */
73 host
->lastaccount
= jam_host_get_account_by_username(host
, username
, FALSE
);
81 gboolean
jam_host_write (JamHost
*host
, GError
**err
) {
85 xmlNodePtr servernode
;
89 path
= g_build_filename(app
.conf_dir
, "servers", host
->name
, "conf.xml", NULL
);
90 if (!verify_path(path
, FALSE
, err
)) goto out
;
92 jam_xmlNewDoc(&doc
, &servernode
, "server");
94 xmlNewTextChild(servernode
, NULL
, BAD_CAST
"name", BAD_CAST host
->name
);
96 for (l
= host
->accounts
; l
!= NULL
; l
= l
->next
) {
97 JamAccount
*acc
= l
->data
;
98 if (!jam_account_write(acc
, &terr
)) {
99 g_printerr("Error writing account: %s\n", terr
->message
);
105 if (host
->lastaccount
) xmlNewTextChild(servernode
, NULL
, BAD_CAST
"currentuser", BAD_CAST
jam_account_get_username(host
->lastaccount
));
107 JAM_HOST_GET_CLASS(host
)->save_xml(host
, servernode
);
109 if (xmlSaveFormatFile(path
, doc
, TRUE
) < 0) {
110 g_set_error(err
, 0, 0, "xmlSaveFormatFile error saving to %s.\n", path
);
116 if (path
) g_free(path
);
117 if (doc
) xmlFreeDoc(doc
);
123 GType
jam_host_get_type (void) {
124 static GType new_type
= 0;
126 const GTypeInfo new_info
= {
127 sizeof(JamHostClass
),
137 new_type
= g_type_register_static(G_TYPE_OBJECT
, "JamHost", &new_info
, G_TYPE_FLAG_ABSTRACT
);
143 /* protocol functions. */
144 gboolean
jam_host_do_post (JamHost
*host
, NetContext
*ctx
, void *doc
, GError
**err
) {
145 if (ctx
->title
) ctx
->title(ctx
, _("Submitting Entry"));
146 return JAM_HOST_GET_CLASS(host
)->do_post(host
, ctx
, doc
, err
);
150 gboolean
jam_host_do_edit (JamHost
*host
, NetContext
*ctx
, void *doc
, GError
**err
) {
151 if (ctx
->title
) ctx
->title(ctx
, _("Saving Changes"));
152 return JAM_HOST_GET_CLASS(host
)->do_edit(host
, ctx
, doc
, err
);
156 gboolean
jam_host_do_delete (JamHost
*host
, NetContext
*ctx
, void *doc
, GError
**err
) {
157 if (ctx
->title
) ctx
->title(ctx
, _("Deleting Entry"));
158 return JAM_HOST_GET_CLASS(host
)->do_delete(host
, ctx
, doc
, err
);