GnuCash 2.4.99
gncAddress.c
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 }
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines