network*: cosmetix
[k8lowj.git] / src / host.c
blobf07244e9175fd1649f7eb3976370162f95e223a6
1 /* logjam - a GTK client for LiveJournal.
2 * Copyright (C) 2000-2003 Gaal Yahas <gaal@forum2.org>
3 */
5 #include "glib-all.h"
7 #include <string.h>
9 #include "account.h"
10 #include "conf_xml.h"
11 #include "jamdoc.h"
12 #include "jam_xml.h"
13 #include "util.h"
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;
23 GSList *l;
24 for (l = host->accounts; l != NULL; l = l->next) {
25 acc = l->data;
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);
30 return NULL;
34 void jam_host_add_account (JamHost *host, JamAccount *acc) {
35 acc->host = host;
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) {
46 JamHost *host = NULL;
47 char *username = NULL;
48 char *userspath;
49 JamHostClass *klass;
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)));
54 } else {
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);
69 g_free(userspath);
71 /* after we've parsed all of the users, scan for the current one. */
72 if (username) {
73 host->lastaccount = jam_host_get_account_by_username(host, username, FALSE);
74 g_free(username);
77 return host;
81 gboolean jam_host_write (JamHost *host, GError **err) {
82 xmlDocPtr doc = NULL;
83 GSList *l;
84 char *path;
85 xmlNodePtr servernode;
86 GError *terr = NULL;
87 gboolean ret = FALSE;
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);
100 g_error_free(terr);
101 terr = NULL;
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);
111 goto out;
113 ret = TRUE;
115 out:
116 if (path) g_free(path);
117 if (doc) xmlFreeDoc(doc);
119 return ret;
123 GType jam_host_get_type (void) {
124 static GType new_type = 0;
125 if (!new_type) {
126 const GTypeInfo new_info = {
127 sizeof(JamHostClass),
128 NULL,
129 NULL,
130 NULL,
131 NULL,
132 NULL,
133 sizeof(JamHost),
135 NULL
137 new_type = g_type_register_static(G_TYPE_OBJECT, "JamHost", &new_info, G_TYPE_FLAG_ABSTRACT);
139 return new_type;
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);