GnuCash  2.6.99
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
gnc-address-xml-v2.c
1 /********************************************************************\
2  * gnc-address-xml-v2.c -- address xml i/o implementation *
3  * *
4  * Copyright (C) 2002 Derek Atkins <[email protected]> *
5  * *
6  * This program is free software; you can redistribute it and/or *
7  * modify it under the terms of the GNU General Public License as *
8  * published by the Free Software Foundation; either version 2 of *
9  * the License, or (at your option) any later version. *
10  * *
11  * This program is distributed in the hope that it will be useful, *
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14  * GNU General Public License for more details. *
15  * *
16  * You should have received a copy of the GNU General Public License*
17  * along with this program; if not, contact: *
18  * *
19  * Free Software Foundation Voice: +1-617-542-5942 *
20  * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
21  * Boston, MA 02110-1301, USA [email protected] *
22  * *
23 \********************************************************************/
24 
25 #include "config.h"
26 
27 #include <glib.h>
28 #include <stdlib.h>
29 #include <string.h>
30 
31 #include "gnc-xml-helper.h"
32 
33 #include "sixtp.h"
34 #include "sixtp-utils.h"
35 #include "sixtp-parsers.h"
36 #include "sixtp-utils.h"
37 #include "sixtp-dom-parsers.h"
38 #include "sixtp-dom-generators.h"
39 
40 #include "gnc-xml.h"
41 #include "io-gncxml-gen.h"
42 #include "io-gncxml-v2.h"
43 
44 #include "gnc-address-xml-v2.h"
45 
46 static QofLogModule log_module = GNC_MOD_IO;
47 
48 const gchar *address_version_string = "2.0.0";
49 
50 /* ids */
51 #define addr_name_string "addr:name"
52 #define addr_addr1_string "addr:addr1"
53 #define addr_addr2_string "addr:addr2"
54 #define addr_addr3_string "addr:addr3"
55 #define addr_addr4_string "addr:addr4"
56 #define addr_phone_string "addr:phone"
57 #define addr_fax_string "addr:fax"
58 #define addr_email_string "addr:email"
59 #define addr_slots_string "addr:slots"
60 
61 /* EFFECTIVE FRIEND FUNCTION */
62 extern KvpFrame *qof_instance_get_slots (const QofInstance*);
63 
64 static void
65 maybe_add_string (xmlNodePtr ptr, const char *tag, const char *str)
66 {
67  if (str && strlen(str) > 0)
68  xmlAddChild (ptr, text_to_dom_tree (tag, str));
69 }
70 
71 xmlNodePtr
72 gnc_address_to_dom_tree (const char *tag, GncAddress *addr)
73 {
74  xmlNodePtr ret;
75  KvpFrame *kf;
76 
77  ret = xmlNewNode(NULL, BAD_CAST tag);
78  xmlSetProp(ret, BAD_CAST "version", BAD_CAST address_version_string);
79 
80  maybe_add_string (ret, addr_name_string, gncAddressGetName (addr));
81 
82  maybe_add_string (ret, addr_addr1_string, gncAddressGetAddr1 (addr));
83  maybe_add_string (ret, addr_addr2_string, gncAddressGetAddr2 (addr));
84  maybe_add_string (ret, addr_addr3_string, gncAddressGetAddr3 (addr));
85  maybe_add_string (ret, addr_addr4_string, gncAddressGetAddr4 (addr));
86 
87  maybe_add_string (ret, addr_phone_string, gncAddressGetPhone (addr));
88  maybe_add_string (ret, addr_fax_string, gncAddressGetFax (addr));
89  maybe_add_string (ret, addr_email_string, gncAddressGetEmail (addr));
90 
91  kf = qof_instance_get_slots (QOF_INSTANCE(addr));
92  if (kf)
93  {
94  xmlNodePtr kvpnode = kvp_frame_to_dom_tree(addr_slots_string, kf);
95  if (kvpnode)
96  {
97  xmlAddChild(ret, kvpnode);
98  }
99  }
100 
101  return ret;
102 }
103 
104 /***********************************************************************/
105 
107 {
108  GncAddress *address;
109 };
110 
111 static gboolean
112 set_string(xmlNodePtr node, GncAddress* addr,
113  void (*func)(GncAddress *addr, const char *txt))
114 {
115  gchar* txt = dom_tree_to_text(node);
116  g_return_val_if_fail(txt, FALSE);
117 
118  func(addr, txt);
119 
120  g_free(txt);
121 
122  return TRUE;
123 }
124 
125 static gboolean
126 address_name_handler (xmlNodePtr node, gpointer addr_pdata)
127 {
128  struct address_pdata *pdata = addr_pdata;
129 
130  return set_string(node, pdata->address, gncAddressSetName);
131 }
132 
133 static gboolean
134 address_addr1_handler (xmlNodePtr node, gpointer addr_pdata)
135 {
136  struct address_pdata *pdata = addr_pdata;
137 
138  return set_string(node, pdata->address, gncAddressSetAddr1);
139 }
140 
141 static gboolean
142 address_addr2_handler (xmlNodePtr node, gpointer addr_pdata)
143 {
144  struct address_pdata *pdata = addr_pdata;
145 
146  return set_string(node, pdata->address, gncAddressSetAddr2);
147 }
148 
149 static gboolean
150 address_addr3_handler (xmlNodePtr node, gpointer addr_pdata)
151 {
152  struct address_pdata *pdata = addr_pdata;
153 
154  return set_string(node, pdata->address, gncAddressSetAddr3);
155 }
156 
157 static gboolean
158 address_addr4_handler (xmlNodePtr node, gpointer addr_pdata)
159 {
160  struct address_pdata *pdata = addr_pdata;
161 
162  return set_string(node, pdata->address, gncAddressSetAddr4);
163 }
164 
165 static gboolean
166 address_phone_handler (xmlNodePtr node, gpointer addr_pdata)
167 {
168  struct address_pdata *pdata = addr_pdata;
169 
170  return set_string(node, pdata->address, gncAddressSetPhone);
171 }
172 
173 static gboolean
174 address_fax_handler (xmlNodePtr node, gpointer addr_pdata)
175 {
176  struct address_pdata *pdata = addr_pdata;
177 
178  return set_string(node, pdata->address, gncAddressSetFax);
179 }
180 
181 static gboolean
182 address_email_handler (xmlNodePtr node, gpointer addr_pdata)
183 {
184  struct address_pdata *pdata = addr_pdata;
185 
186  return set_string(node, pdata->address, gncAddressSetEmail);
187 }
188 
189 static gboolean
190 address_slots_handler (xmlNodePtr node, gpointer addr_pdata)
191 {
192  struct address_pdata *pdata = addr_pdata;
193 
194  return dom_tree_to_kvp_frame_given
195  (node, qof_instance_get_slots (QOF_INSTANCE (pdata->address)));
196 }
197 
198 static struct dom_tree_handler address_handlers_v2[] =
199 {
200  { addr_name_string, address_name_handler, 0, 0 },
201  { addr_addr1_string, address_addr1_handler, 0, 0 },
202  { addr_addr2_string, address_addr2_handler, 0, 0 },
203  { addr_addr3_string, address_addr3_handler, 0, 0 },
204  { addr_addr4_string, address_addr4_handler, 0, 0 },
205  { addr_phone_string, address_phone_handler, 0, 0 },
206  { addr_fax_string, address_fax_handler, 0, 0 },
207  { addr_email_string, address_email_handler, 0, 0 },
208  { addr_slots_string, address_slots_handler, 0, 0 },
209  { NULL, 0, 0, 0 }
210 };
211 
212 gboolean
213 gnc_dom_tree_to_address (xmlNodePtr node, GncAddress *address)
214 {
215  struct address_pdata addr_pdata;
216  gboolean successful;
217 
218  addr_pdata.address = address;
219 
220  successful = dom_tree_generic_parse (node, address_handlers_v2,
221  &addr_pdata);
222 
223  if (!successful)
224  {
225  PERR ("failed to parse address tree");
226  }
227 
228  return successful;
229 }
230 
231 static gboolean
232 address_ns(FILE *out)
233 {
234  g_return_val_if_fail(out, FALSE);
235  return gnc_xml2_write_namespace_decl(out, "addr");
236 }
237 
238 void
239 gnc_address_xml_initialize (void)
240 {
241  static GncXmlDataType_t be_data =
242  {
243  GNC_FILE_BACKEND_VERS,
244  "gnc:Address",
245  NULL, /* parser_create */
246  NULL, /* add_item */
247  NULL, /* get_count */
248  NULL, /* write */
249  NULL, /* scrub */
250  address_ns,
251  };
252 
253  qof_object_register_backend ("gnc:Address",
255  &be_data);
256 }
gboolean qof_object_register_backend(QofIdTypeConst type_name, const char *backend_name, gpointer be_data)
#define GNC_FILE_BACKEND
Definition: io-gncxml-v2.h:99
#define PERR(format, args...)
Definition: qoflog.h:237
api for GnuCash version 2 XML-based file format
gboolean gnc_xml2_write_namespace_decl(FILE *out, const char *name_space)
struct KvpFrameImpl KvpFrame
Definition: kvp_frame.h:76
const gchar * QofLogModule
Definition: qofid.h:89