|
GnuCash 2.4.99
|
00001 /********************************************************************\ 00002 * gncAddress.c -- an Address object * 00003 * * 00004 * This program is free software; you can redistribute it and/or * 00005 * modify it under the terms of the GNU General Public License as * 00006 * published by the Free Software Foundation; either version 2 of * 00007 * the License, or (at your option) any later version. * 00008 * * 00009 * This program is distributed in the hope that it will be useful, * 00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00012 * GNU General Public License for more details. * 00013 * * 00014 * You should have received a copy of the GNU General Public License* 00015 * along with this program; if not, contact: * 00016 * * 00017 * Free Software Foundation Voice: +1-617-542-5942 * 00018 * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 * 00019 * Boston, MA 02110-1301, USA gnu@gnu.org * 00020 * * 00021 \********************************************************************/ 00022 00023 /* 00024 * Copyright (C) 2001 Derek Atkins 00025 * Author: Derek Atkins <warlord@MIT.EDU> 00026 */ 00027 00028 #include "config.h" 00029 00030 #include <glib.h> 00031 00032 #include "gncAddress.h" 00033 #include "gncAddressP.h" 00034 #include "gncCustomerP.h" 00035 00036 struct _gncAddress 00037 { 00038 QofInstance inst; 00039 00040 QofBook * book; 00041 QofInstance * parent; 00042 gboolean dirty; 00043 char * name; 00044 char * addr1; 00045 char * addr2; 00046 char * addr3; 00047 char * addr4; 00048 char * phone; 00049 char * fax; 00050 char * email; 00051 }; 00052 00053 struct _gncAddressClass 00054 { 00055 QofInstanceClass parent_class; 00056 }; 00057 00058 static QofLogModule log_module = GNC_MOD_BUSINESS; 00059 00060 #define _GNC_MOD_NAME GNC_ADDRESS_MODULE_NAME 00061 00062 G_INLINE_FUNC void mark_address (GncAddress *address); 00063 void mark_address (GncAddress *address) 00064 { 00065 address->dirty = TRUE; 00066 00067 qof_event_gen (QOF_INSTANCE(address), QOF_EVENT_MODIFY, address->parent); 00068 qof_event_gen (address->parent, QOF_EVENT_MODIFY, NULL); 00069 } 00070 00071 enum 00072 { 00073 PROP_0, 00074 PROP_NAME, 00075 PROP_ADDR1, 00076 PROP_ADDR2, 00077 PROP_ADDR3, 00078 PROP_ADDR4, 00079 PROP_PHONE, 00080 PROP_FAX, 00081 PROP_EMAIL 00082 }; 00083 00084 /* GObject Initialization */ 00085 G_DEFINE_TYPE(GncAddress, gnc_address, QOF_TYPE_INSTANCE); 00086 00087 static void 00088 gnc_address_init(GncAddress* addr) 00089 { 00090 } 00091 00092 static void 00093 gnc_address_dispose(GObject *addrp) 00094 { 00095 G_OBJECT_CLASS(gnc_address_parent_class)->dispose(addrp); 00096 } 00097 00098 static void 00099 gnc_address_finalize(GObject* addrp) 00100 { 00101 G_OBJECT_CLASS(gnc_address_parent_class)->finalize(addrp); 00102 } 00103 00104 static void 00105 gnc_address_get_property (GObject *object, 00106 guint prop_id, 00107 GValue *value, 00108 GParamSpec *pspec) 00109 { 00110 GncAddress *address; 00111 00112 g_return_if_fail(GNC_IS_ADDRESS(object)); 00113 00114 address = GNC_ADDRESS(object); 00115 switch (prop_id) 00116 { 00117 case PROP_NAME: 00118 g_value_set_string(value, address->name); 00119 break; 00120 case PROP_ADDR1: 00121 g_value_set_string(value, address->addr1); 00122 break; 00123 case PROP_ADDR2: 00124 g_value_set_string(value, address->addr2); 00125 break; 00126 case PROP_ADDR3: 00127 g_value_set_string(value, address->addr3); 00128 break; 00129 case PROP_ADDR4: 00130 g_value_set_string(value, address->addr4); 00131 break; 00132 case PROP_PHONE: 00133 g_value_set_string(value, address->phone); 00134 break; 00135 case PROP_FAX: 00136 g_value_set_string(value, address->fax); 00137 break; 00138 case PROP_EMAIL: 00139 g_value_set_string(value, address->email); 00140 break; 00141 default: 00142 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); 00143 break; 00144 } 00145 } 00146 00147 static void 00148 gnc_address_set_property (GObject *object, 00149 guint prop_id, 00150 const GValue *value, 00151 GParamSpec *pspec) 00152 { 00153 GncAddress *address; 00154 00155 g_return_if_fail(GNC_IS_ADDRESS(object)); 00156 00157 address = GNC_ADDRESS(object); 00158 switch (prop_id) 00159 { 00160 case PROP_NAME: 00161 gncAddressSetName(address, g_value_get_string(value)); 00162 break; 00163 case PROP_ADDR1: 00164 gncAddressSetAddr1(address, g_value_get_string(value)); 00165 break; 00166 case PROP_ADDR2: 00167 gncAddressSetAddr2(address, g_value_get_string(value)); 00168 break; 00169 case PROP_ADDR3: 00170 gncAddressSetAddr3(address, g_value_get_string(value)); 00171 break; 00172 case PROP_ADDR4: 00173 gncAddressSetAddr4(address, g_value_get_string(value)); 00174 break; 00175 case PROP_PHONE: 00176 gncAddressSetPhone(address, g_value_get_string(value)); 00177 break; 00178 case PROP_FAX: 00179 gncAddressSetFax(address, g_value_get_string(value)); 00180 break; 00181 case PROP_EMAIL: 00182 gncAddressSetEmail(address, g_value_get_string(value)); 00183 break; 00184 default: 00185 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); 00186 break; 00187 } 00188 } 00189 00196 static GList* 00197 impl_get_typed_referring_object_list(const QofInstance* inst, const QofInstance* ref) 00198 { 00199 /* Refers to nothing. The parent field doesn't really count since the parent knows which address 00200 belongs to it. */ 00201 return NULL; 00202 } 00203 00204 static void 00205 gnc_address_class_init (GncAddressClass *klass) 00206 { 00207 GObjectClass *gobject_class = G_OBJECT_CLASS (klass); 00208 QofInstanceClass* qof_class = QOF_INSTANCE_CLASS(klass); 00209 00210 gobject_class->dispose = gnc_address_dispose; 00211 gobject_class->finalize = gnc_address_finalize; 00212 gobject_class->set_property = gnc_address_set_property; 00213 gobject_class->get_property = gnc_address_get_property; 00214 00215 qof_class->get_display_name = NULL; 00216 qof_class->refers_to_object = NULL; 00217 qof_class->get_typed_referring_object_list = impl_get_typed_referring_object_list; 00218 00219 g_object_class_install_property 00220 (gobject_class, 00221 PROP_NAME, 00222 g_param_spec_string ("name", 00223 "Address Name", 00224 "The address name is an arbitrary string " 00225 "assigned by the user. It is intended to " 00226 "a short string to identify the address.", 00227 NULL, 00228 G_PARAM_READWRITE)); 00229 00230 g_object_class_install_property 00231 (gobject_class, 00232 PROP_ADDR1, 00233 g_param_spec_string ("addr1", 00234 "Address Line 1", 00235 "The address line 1 is an arbitrary string " 00236 "assigned by the user. It is the first " 00237 "line of the address.", 00238 NULL, 00239 G_PARAM_READWRITE)); 00240 00241 g_object_class_install_property 00242 (gobject_class, 00243 PROP_ADDR2, 00244 g_param_spec_string ("addr2", 00245 "Address Line 2", 00246 "The address line 2 is an arbitrary string " 00247 "assigned by the user. It is the second " 00248 "line of the address.", 00249 NULL, 00250 G_PARAM_READWRITE)); 00251 00252 g_object_class_install_property 00253 (gobject_class, 00254 PROP_ADDR3, 00255 g_param_spec_string ("addr3", 00256 "Address Line 3", 00257 "The address line 3 is an arbitrary string " 00258 "assigned by the user. It is the third " 00259 "line of the address.", 00260 NULL, 00261 G_PARAM_READWRITE)); 00262 00263 g_object_class_install_property 00264 (gobject_class, 00265 PROP_ADDR4, 00266 g_param_spec_string ("addr4", 00267 "Address Line 4", 00268 "The address line 4 is an arbitrary string " 00269 "assigned by the user. It is the fourth " 00270 "line of the address.", 00271 NULL, 00272 G_PARAM_READWRITE)); 00273 00274 g_object_class_install_property 00275 (gobject_class, 00276 PROP_PHONE, 00277 g_param_spec_string ("phone", 00278 "Phone", 00279 "The phone number is the number at this address.", 00280 NULL, 00281 G_PARAM_READWRITE)); 00282 00283 g_object_class_install_property 00284 (gobject_class, 00285 PROP_FAX, 00286 g_param_spec_string ("fax", 00287 "Fax", 00288 "The fax number at this address.", 00289 NULL, 00290 G_PARAM_READWRITE)); 00291 00292 g_object_class_install_property 00293 (gobject_class, 00294 PROP_EMAIL, 00295 g_param_spec_string ("email", 00296 "E-mail address", 00297 "The e-mail address at this address.", 00298 NULL, 00299 G_PARAM_READWRITE)); 00300 } 00301 00302 /* Create/Destroy functions */ 00303 00304 GncAddress * 00305 gncAddressCreate (QofBook *book, QofInstance *prnt) 00306 { 00307 GncAddress *addr; 00308 00309 if (!book) return NULL; 00310 00311 addr = g_object_new (GNC_TYPE_ADDRESS, NULL); 00312 qof_instance_init_data(&addr->inst, GNC_ID_ADDRESS, book); 00313 addr->book = book; 00314 addr->dirty = FALSE; 00315 addr->parent = prnt; 00316 00317 addr->name = CACHE_INSERT (""); 00318 addr->addr1 = CACHE_INSERT (""); 00319 addr->addr2 = CACHE_INSERT (""); 00320 addr->addr3 = CACHE_INSERT (""); 00321 addr->addr4 = CACHE_INSERT (""); 00322 addr->phone = CACHE_INSERT (""); 00323 addr->fax = CACHE_INSERT (""); 00324 addr->email = CACHE_INSERT (""); 00325 00326 return addr; 00327 } 00328 00329 static GncAddress * 00330 qofAddressCreate (QofBook *book) 00331 { 00332 /* The address will get set later by another function */ 00333 return gncAddressCreate(book, NULL); 00334 } 00335 00336 static void 00337 qofAddressSetOwner(GncAddress *addr, QofInstance *ent) 00338 { 00339 if (!addr || !ent) 00340 { 00341 return; 00342 } 00343 if (addr->parent == NULL) 00344 { 00345 addr->parent = ent; 00346 } 00347 } 00348 00349 static QofInstance* 00350 qofAddressGetOwner(const GncAddress *addr) 00351 { 00352 00353 if (!addr) 00354 { 00355 return NULL; 00356 } 00357 return addr->parent; 00358 } 00359 00360 void 00361 gncAddressDestroy (GncAddress *addr) 00362 { 00363 if (!addr) return; 00364 qof_instance_set_destroying(addr, TRUE); 00365 gncAddressCommitEdit (addr); 00366 } 00367 00368 static void 00369 gncAddressFree (GncAddress *addr) 00370 { 00371 if (!addr) return; 00372 00373 qof_event_gen (&addr->inst, QOF_EVENT_DESTROY, NULL); 00374 00375 CACHE_REMOVE (addr->name); 00376 CACHE_REMOVE (addr->addr1); 00377 CACHE_REMOVE (addr->addr2); 00378 CACHE_REMOVE (addr->addr3); 00379 CACHE_REMOVE (addr->addr4); 00380 CACHE_REMOVE (addr->phone); 00381 CACHE_REMOVE (addr->fax); 00382 CACHE_REMOVE (addr->email); 00383 00384 /* qof_instance_release (&addr->inst); */ 00385 g_object_unref (addr); 00386 } 00387 00388 00389 /* Set functions */ 00390 00391 #define SET_STR(obj, member, str) { \ 00392 char * tmp; \ 00393 \ 00394 if (member == str) return; \ 00395 if (!safe_strcmp (member, str)) return; \ 00396 gncAddressBeginEdit (obj); \ 00397 tmp = CACHE_INSERT (str); \ 00398 CACHE_REMOVE (member); \ 00399 member = tmp; \ 00400 } 00401 00402 void gncAddressSetName (GncAddress *addr, const char *name) 00403 { 00404 if (!addr) return; 00405 if (!name) return; 00406 SET_STR(addr, addr->name, name); 00407 mark_address (addr); 00408 gncAddressCommitEdit (addr); 00409 } 00410 00411 void gncAddressSetAddr1 (GncAddress *addr, const char *addr1) 00412 { 00413 if (!addr) return; 00414 if (!addr1) return; 00415 SET_STR(addr, addr->addr1, addr1); 00416 mark_address (addr); 00417 gncAddressCommitEdit (addr); 00418 } 00419 00420 void gncAddressSetAddr2 (GncAddress *addr, const char *addr2) 00421 { 00422 if (!addr) return; 00423 if (!addr2) return; 00424 SET_STR(addr, addr->addr2, addr2); 00425 mark_address (addr); 00426 gncAddressCommitEdit (addr); 00427 } 00428 00429 void gncAddressSetAddr3 (GncAddress *addr, const char *addr3) 00430 { 00431 if (!addr) return; 00432 if (!addr3) return; 00433 SET_STR(addr, addr->addr3, addr3); 00434 mark_address (addr); 00435 gncAddressCommitEdit (addr); 00436 } 00437 00438 void gncAddressSetAddr4 (GncAddress *addr, const char *addr4) 00439 { 00440 if (!addr) return; 00441 if (!addr4) return; 00442 SET_STR(addr, addr->addr4, addr4); 00443 mark_address (addr); 00444 gncAddressCommitEdit (addr); 00445 } 00446 00447 void gncAddressSetPhone (GncAddress *addr, const char *phone) 00448 { 00449 if (!addr) return; 00450 if (!phone) return; 00451 SET_STR(addr, addr->phone, phone); 00452 mark_address (addr); 00453 gncAddressCommitEdit (addr); 00454 } 00455 00456 void gncAddressSetFax (GncAddress *addr, const char *fax) 00457 { 00458 if (!addr) return; 00459 if (!fax) return; 00460 SET_STR(addr, addr->fax, fax); 00461 mark_address (addr); 00462 gncAddressCommitEdit (addr); 00463 } 00464 00465 void gncAddressSetEmail (GncAddress *addr, const char *email) 00466 { 00467 if (!addr) return; 00468 if (!email) return; 00469 SET_STR(addr, addr->email, email); 00470 mark_address (addr); 00471 gncAddressCommitEdit (addr); 00472 } 00473 00474 void gncAddressBeginEdit (GncAddress *addr) 00475 { 00476 qof_begin_edit (&addr->inst); 00477 } 00478 00479 static void gncAddressOnError (QofInstance *inst, QofBackendError errcode) 00480 { 00481 PERR("Address QofBackend Failure: %d", errcode); 00482 gnc_engine_signal_commit_error( errcode ); 00483 } 00484 00485 static void gncAddressOnDone (QofInstance *addr) { } 00486 00487 static void address_free (QofInstance *inst) 00488 { 00489 GncAddress *addr = (GncAddress *) inst; 00490 gncAddressFree (addr); 00491 } 00492 00493 void gncAddressCommitEdit (GncAddress *addr) 00494 { 00495 if (!qof_commit_edit (QOF_INSTANCE(addr))) return; 00496 qof_commit_edit_part2 (&addr->inst, gncAddressOnError, 00497 gncAddressOnDone, address_free); 00498 } 00499 00500 00501 /* Get Functions */ 00502 00503 const char * gncAddressGetName (const GncAddress *addr) 00504 { 00505 if (!addr) return NULL; 00506 return addr->name; 00507 } 00508 00509 const char * gncAddressGetAddr1 (const GncAddress *addr) 00510 { 00511 if (!addr) return NULL; 00512 return addr->addr1; 00513 } 00514 00515 const char * gncAddressGetAddr2 (const GncAddress *addr) 00516 { 00517 if (!addr) return NULL; 00518 return addr->addr2; 00519 } 00520 00521 const char * gncAddressGetAddr3 (const GncAddress *addr) 00522 { 00523 if (!addr) return NULL; 00524 return addr->addr3; 00525 } 00526 00527 const char * gncAddressGetAddr4 (const GncAddress *addr) 00528 { 00529 if (!addr) return NULL; 00530 return addr->addr4; 00531 } 00532 00533 const char * gncAddressGetPhone (const GncAddress *addr) 00534 { 00535 if (!addr) return NULL; 00536 return addr->phone; 00537 } 00538 00539 const char * gncAddressGetFax (const GncAddress *addr) 00540 { 00541 if (!addr) return NULL; 00542 return addr->fax; 00543 } 00544 00545 const char * gncAddressGetEmail (const GncAddress *addr) 00546 { 00547 if (!addr) return NULL; 00548 return addr->email; 00549 } 00550 00551 gboolean gncAddressIsDirty (const GncAddress *addr) 00552 { 00553 if (!addr) return FALSE; 00554 return addr->dirty; 00555 } 00556 00557 void gncAddressClearDirty (GncAddress *addr) 00558 { 00559 if (!addr) return; 00560 addr->dirty = FALSE; 00561 } 00562 00563 int gncAddressCompare (const GncAddress *a, const GncAddress *b) 00564 { 00565 if (!a && !b) return 0; 00566 if (!a && b) return 1; 00567 if (a && !b) return -1; 00568 00569 return safe_strcmp (a->name, b->name); 00570 } 00571 00572 gboolean 00573 gncAddressEqual(const GncAddress* a, const GncAddress* b) 00574 { 00575 if (a == NULL && b == NULL) return TRUE; 00576 if (a == NULL || b == NULL) return FALSE; 00577 00578 g_return_val_if_fail(GNC_IS_ADDRESS(a), FALSE); 00579 g_return_val_if_fail(GNC_IS_ADDRESS(b), FALSE); 00580 00581 if (safe_strcmp(a->name, b->name) != 0) 00582 { 00583 PWARN("names differ: %s vs %s", a->name, b->name); 00584 return FALSE; 00585 } 00586 if (safe_strcmp(a->addr1, b->addr1) != 0) 00587 { 00588 PWARN("address lines 1 differ: %s vs %s", a->addr1, b->addr1); 00589 return FALSE; 00590 } 00591 if (safe_strcmp(a->addr2, b->addr2) != 0) 00592 { 00593 PWARN("address lines 2 differ: %s vs %s", a->addr2, b->addr1); 00594 return FALSE; 00595 } 00596 if (safe_strcmp(a->addr3, b->addr3) != 0) 00597 { 00598 PWARN("address lines 3 differ: %s vs %s", a->addr3, b->addr3); 00599 return FALSE; 00600 } 00601 if (safe_strcmp(a->addr4, b->addr4) != 0) 00602 { 00603 PWARN("address lines 4 differ: %s vs %s", a->addr4, b->addr4); 00604 return FALSE; 00605 } 00606 if (safe_strcmp(a->phone, b->phone) != 0) 00607 { 00608 PWARN("phone numbers differ: %s vs %s", a->phone, b->phone); 00609 return FALSE; 00610 } 00611 if (safe_strcmp(a->fax, b->fax) != 0) 00612 { 00613 PWARN("fax numbers differ: %s vs %s", a->fax, b->fax); 00614 return FALSE; 00615 } 00616 if (safe_strcmp(a->email, b->email) != 0) 00617 { 00618 PWARN("email addresses differ: %s vs %s", a->email, b->email); 00619 return FALSE; 00620 } 00621 00622 return TRUE; 00623 } 00624 00625 static QofObject GncAddressDesc = 00626 { 00627 DI(.interface_version = ) QOF_OBJECT_VERSION, 00628 DI(.e_type = ) GNC_ID_ADDRESS, 00629 DI(.type_label = ) "Address", 00630 DI(.create = ) (gpointer)qofAddressCreate, 00631 DI(.book_begin = ) NULL, 00632 DI(.book_end = ) NULL, 00633 DI(.is_dirty = ) qof_collection_is_dirty, 00634 DI(.mark_clean = ) qof_collection_mark_clean, 00635 DI(.foreach = ) qof_collection_foreach, 00636 DI(.printable = ) NULL, 00637 DI(.version_cmp = ) (int (*)(gpointer, gpointer)) qof_instance_version_cmp, 00638 }; 00639 00640 gboolean gncAddressRegister (void) 00641 { 00642 static QofParam params[] = 00643 { 00644 00645 { ADDRESS_NAME, QOF_TYPE_STRING, (QofAccessFunc)gncAddressGetName, (QofSetterFunc)gncAddressSetName }, 00646 { ADDRESS_ONE, QOF_TYPE_STRING, (QofAccessFunc)gncAddressGetAddr1, (QofSetterFunc)gncAddressSetAddr1 }, 00647 { ADDRESS_TWO, QOF_TYPE_STRING, (QofAccessFunc)gncAddressGetAddr2, (QofSetterFunc)gncAddressSetAddr2 }, 00648 { ADDRESS_THREE, QOF_TYPE_STRING, (QofAccessFunc)gncAddressGetAddr3, (QofSetterFunc)gncAddressSetAddr3 }, 00649 { ADDRESS_FOUR, QOF_TYPE_STRING, (QofAccessFunc)gncAddressGetAddr4, (QofSetterFunc)gncAddressSetAddr4 }, 00650 { ADDRESS_PHONE, QOF_TYPE_STRING, (QofAccessFunc)gncAddressGetPhone, (QofSetterFunc)gncAddressSetPhone }, 00651 { ADDRESS_FAX, QOF_TYPE_STRING, (QofAccessFunc)gncAddressGetFax, (QofSetterFunc)gncAddressSetFax }, 00652 { ADDRESS_EMAIL, QOF_TYPE_STRING, (QofAccessFunc)gncAddressGetEmail, (QofSetterFunc)gncAddressSetEmail }, 00653 { ADDRESS_OWNER, QOF_TYPE_CHOICE, (QofAccessFunc)qofAddressGetOwner, (QofSetterFunc)qofAddressSetOwner }, 00654 { QOF_PARAM_BOOK, QOF_ID_BOOK, (QofAccessFunc)qof_instance_get_book, NULL }, 00655 { QOF_PARAM_GUID, QOF_TYPE_GUID, (QofAccessFunc)qof_instance_get_guid, NULL }, 00656 { NULL }, 00657 }; 00658 00659 qof_class_register (GNC_ID_ADDRESS, (QofSortFunc)gncAddressCompare, params); 00660 if (!qof_choice_add_class(GNC_ID_CUSTOMER, GNC_ID_ADDRESS, ADDRESS_OWNER)) 00661 { 00662 return FALSE; 00663 } 00664 00665 return qof_object_register(&GncAddressDesc); 00666 }
1.7.4