QOF  0.7.5
qofinstance.c
1 /********************************************************************\
2  * qofinstance.c -- handler for fields common to all objects *
3  * *
4  * This program is free software; you can redistribute it and/or *
5  * modify it under the terms of the GNU General Public License as *
6  * published by the Free Software Foundation; either version 2 of *
7  * the License, or (at your option) any later version. *
8  * *
9  * This program is distributed in the hope that it will be useful, *
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12  * GNU General Public License for more details. *
13  * *
14  * You should have received a copy of the GNU General Public License*
15  * along with this program; if not, contact: *
16  * *
17  * Free Software Foundation Voice: +1-617-542-5942 *
18  * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
19  * Boston, MA 02110-1301, USA gnu@gnu.org *
20  * *
21 \********************************************************************/
22 
23 /*
24  * Object instance holds many common fields that most
25  * gnucash objects use.
26  *
27  * Copyright (C) 2003 Linas Vepstas <linas@linas.org>
28  */
29 
30 #include "config.h"
31 #include <glib.h>
32 #include "qof.h"
33 #include "kvputil-p.h"
34 #include "qofbook-p.h"
35 #include "qofid-p.h"
36 #include "qofinstance-p.h"
37 
38 static QofLogModule log_module = QOF_MOD_ENGINE;
39 
40 /* ========================================================== */
41 
43 qof_instance_create (QofIdType type, QofBook * book)
44 {
45  QofInstance *inst;
46 
47  inst = g_new0 (QofInstance, 1);
48  qof_instance_init (inst, type, book);
49  return inst;
50 }
51 
52 void
54 {
55  QofCollection *col;
56 
57  inst->book = book;
58  inst->kvp_data = kvp_frame_new ();
60  inst->editlevel = 0;
61  inst->do_free = FALSE;
62  inst->dirty = FALSE;
63 
64  col = qof_book_get_collection (book, type);
65  qof_entity_init (&inst->entity, type, col);
66 }
67 
68 void
70 {
71  kvp_frame_delete (inst->kvp_data);
72  inst->editlevel = 0;
73  inst->do_free = FALSE;
74  inst->dirty = FALSE;
75  qof_entity_release (&inst->entity);
76 }
77 
78 const GUID *
80 {
81  if (!inst)
82  return NULL;
83  return &inst->entity.guid;
84 }
85 
86 QofBook *
88 {
89  if (!inst)
90  return NULL;
91  return inst->book;
92 }
93 
94 KvpFrame *
96 {
97  if (!inst)
98  return NULL;
99  return inst->kvp_data;
100 }
101 
102 QofTime *
104 {
105  if (!inst)
106  {
107  QofTime *time;
108 
109  time = qof_time_get_current ();
110  return time;
111  }
112  return inst->update_time;
113 }
114 
115 int
117 {
118  if (!left && !right)
119  return 0;
120  if (!left)
121  return -1;
122  if (!right)
123  return +1;
124  return qof_time_cmp (left->update_time, right->update_time);
125 }
126 
127 gboolean
129 {
130  QofCollection *coll;
131 
132  if (!inst)
133  {
134  return FALSE;
135  }
136  coll = inst->entity.collection;
137  if (qof_collection_is_dirty (coll))
138  {
139  return inst->dirty;
140  }
141  inst->dirty = FALSE;
142  return FALSE;
143 }
144 
145 void
147 {
148  QofCollection *coll;
149 
150  inst->dirty = TRUE;
151  coll = inst->entity.collection;
152  qof_collection_mark_dirty (coll);
153 }
154 
155 gboolean
156 qof_instance_check_edit (QofInstance * inst)
157 {
158  if (inst->editlevel > 0)
159  {
160  return TRUE;
161  }
162  return FALSE;
163 }
164 
165 gboolean
166 qof_instance_do_free (QofInstance * inst)
167 {
168  return inst->do_free;
169 }
170 
171 void
172 qof_instance_mark_free (QofInstance * inst)
173 {
174  inst->do_free = TRUE;
175 }
176 
177 /* ========================================================== */
178 /* setters */
179 
180 void
181 qof_instance_mark_clean (QofInstance * inst)
182 {
183  if (!inst)
184  return;
185  inst->dirty = FALSE;
186 }
187 
188 void
189 qof_instance_set_slots (QofInstance * inst, KvpFrame * frm)
190 {
191  if (!inst)
192  return;
193  if (inst->kvp_data && (inst->kvp_data != frm))
194  {
195  kvp_frame_delete (inst->kvp_data);
196  }
197 
198  inst->dirty = TRUE;
199  inst->kvp_data = frm;
200 }
201 
202 void
203 qof_instance_set_update_time (QofInstance * inst, QofTime * time)
204 {
205  if (!inst)
206  return;
207  qof_time_free (inst->update_time);
208  inst->update_time = time;
209 }
210 
211 void
213 {
214  QofTime *qt;
215 
216  /* Books must differ for a gemini to be meaningful */
217  if (!from || !to || (from->book == to->book))
218  return;
219 
220  qt = qof_time_get_current ();
221 
222  /* Make a note of where the copy came from */
223  qof_kvp_bag_add (to->kvp_data, "gemini", qt,
224  "inst_guid", &from->entity.guid,
225  "book_guid", &from->book->inst.entity.guid, NULL);
226  qof_kvp_bag_add (from->kvp_data, "gemini", qt,
227  "inst_guid", &to->entity.guid,
228  "book_guid", &to->book->inst.entity.guid, NULL);
229 
230  to->dirty = TRUE;
231 }
232 
233 QofInstance *
235 {
236  QofCollection *col;
237  KvpFrame *fr;
238  GUID *twin_guid;
239  QofInstance *twin;
240 
241  if (!src || !target_book)
242  return NULL;
243  ENTER (" ");
244 
245  fr = qof_kvp_bag_find_by_guid (src->kvp_data, "gemini",
246  "book_guid", &target_book->inst.entity.guid);
247 
248  twin_guid = kvp_frame_get_guid (fr, "inst_guid");
249 
250  col = qof_book_get_collection (target_book, src->entity.e_type);
251  twin = (QofInstance *) qof_collection_lookup_entity (col, twin_guid);
252 
253  LEAVE (" found twin=%p", twin);
254  return twin;
255 }
256 
257 /* ========================== END OF FILE ======================= */