1 : /**********************************************************************
2 : * $Id: iom_basket.cpp 12582 2007-10-29 09:38:21Z pka $
3 : *
4 : * Project: iom - The INTERLIS Object Model
5 : * Purpose: For more information, please see <http://iom.sourceforge.net>
6 : * Author: Claude Eisenhut
7 : *
8 : **********************************************************************
9 : * Copyright (c) 2007, Claude Eisenhut
10 : *
11 : * Permission is hereby granted, free of charge, to any person obtaining a
12 : * copy of this software and associated documentation files (the "Software"),
13 : * to deal in the Software without restriction, including without limitation
14 : * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15 : * and/or sell copies of the Software, and to permit persons to whom the
16 : * Software is furnished to do so, subject to the following conditions:
17 : *
18 : * The above copyright notice and this permission notice shall be included
19 : * in all copies or substantial portions of the Software.
20 : *
21 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 : * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27 : * DEALINGS IN THE SOFTWARE.
28 : ****************************************************************************/
29 :
30 :
31 : /** @file
32 : * implementation of object basket
33 : * @defgroup basket basket functions
34 : * @{
35 : */
36 :
37 : #include <iom/iom_p.h>
38 :
39 : /** gets an iterator to walk threw all objects of a basket.
40 : * The list includes embedded link(-objects), but no structures.
41 : */
42 51 : extern "C" IOM_ITERATOR iom_iteratorobject(IOM_BASKET basket)
43 : {
44 51 : return (dbgnew iom_iterator(basket))->getRef();
45 : }
46 :
47 : /** gets the next object.
48 : * Returns 0 if no more objects.
49 : */
50 13710 : extern "C" IOM_OBJECT iom_nextobject(IOM_ITERATOR iterator)
51 : {
52 13710 : IomObject ret=iterator->next_object();
53 13710 : return ret.isNull() ? 0 : ret->getRef();
54 : }
55 :
56 : /** create a new object.
57 : */
58 0 : extern "C" IOM_OBJECT iom_newobject(IOM_BASKET basket,IOM_TAG type,IOM_OID oid)
59 : {
60 0 : IomObject ret=new iom_object();
61 0 : ret->setOid(X(oid));
62 0 : ret->setTag(ParserHandler::getTagId(type));
63 0 : basket->addObject(ret);
64 0 : return ret->getRef();
65 : }
66 :
67 :
68 : /**
69 : * release handle
70 : */
71 11 : extern "C" int iom_releasebasket(IOM_BASKET basket)
72 : {
73 11 : if(!basket->freeRef()){
74 11 : delete basket;
75 : }
76 11 : return 0;
77 : }
78 :
79 : // Basket löschen (Basket aus Datei entfernen)
80 : extern "C" int iom_deletebasket(IOM_BASKET basket);
81 :
82 :
83 : /** gets OID of a basket.
84 : * return value is valid until iom_setbasketoid() or iom_close()
85 : */
86 0 : extern "C" IOM_OID iom_getbasketoid(IOM_BASKET basket)
87 : {
88 0 : return basket->getOid_c();
89 : }
90 :
91 : /** sets OID of a basket.
92 : */
93 0 : extern "C" void iom_setbasketoid(IOM_BASKET basket,IOM_OID oid){
94 0 : basket->setOid(X(oid));
95 0 : }
96 :
97 :
98 : /** gets the consistency of a basket.
99 : */
100 0 : extern "C" int iom_getbasketconsistency(IOM_BASKET basket)
101 : {
102 0 : return basket->getConsistency();
103 : }
104 :
105 : /** sets the consistency of a basket.
106 : */
107 0 : extern "C" void iom_setbasketconsistency(IOM_BASKET basket,int consistency)
108 : {
109 0 : basket->setConsistency(consistency);
110 0 : }
111 :
112 : /** gets xml element name of a basket.
113 : * return value is valid until iom_close() or iom_setbaskettag().
114 : */
115 0 : extern "C" IOM_TAG iom_getbaskettag(IOM_BASKET basket)
116 : {
117 0 : return basket->getTag_c();
118 : }
119 :
120 : /** sets xml element name of a basket.
121 : */
122 0 : extern "C" void iom_setbaskettag(IOM_BASKET basket,IOM_TAG topic)
123 : {
124 0 : basket->setTag(ParserHandler::getTagId(topic));
125 0 : }
126 :
127 : /** get xmlfile line number of a basket.
128 : */
129 0 : extern "C" int iom_getbasketline(IOM_BASKET basket)
130 : {
131 0 : return basket->getXMLLineNumber();
132 : }
133 :
134 : /** get xmlfile column number of a basket.
135 : */
136 0 : extern "C" int iom_getbasketcol(IOM_BASKET basket)
137 : {
138 0 : return basket->getXMLColumnNumber();
139 : }
140 :
141 : /** gets object with a given OID or 0.
142 : */
143 1779 : extern "C" IOM_OBJECT iom_getobject(IOM_BASKET basket,IOM_OID oid)
144 : {
145 1779 : IomObject ret=basket->getObject(X(oid));
146 1779 : return ret.isNull() ? 0 : ret->getRef();
147 : }
148 :
149 : // Objekt in einen anderen Basket verschieben
150 : extern "C" int iom_relocateobject(IOM_BASKET basket,IOM_OBJECT object);
151 :
152 :
153 : // seit dem letzten Lesen/Schreiben geänderte Objekte
154 : extern "C" IOM_ITERATOR iom_iteratorchgobject(IOM_BASKET basket);
155 : extern "C" IOM_OBJECT iom_nextchgobject(IOM_ITERATOR iterator);
156 :
157 : // seit dem letzten Lesen/Schreiben gelöschte Objekte
158 : extern "C" IOM_ITERATOR iom_iteratordelobject(IOM_BASKET basket);
159 : extern "C" IOM_OBJECT iom_nextdelobject(IOM_ITERATOR iterator);
160 :
161 :
162 : /** @}
163 : */
164 :
165 12 : iom_basket::iom_basket() :
166 : file()
167 : ,tag(0)
168 : ,tag_c(0)
169 : ,xmlLine(0)
170 : ,xmlCol(0)
171 : ,consistency(IOM_COMPLETE)
172 : ,kind(IOM_FULL)
173 : ,oid_w(0)
174 : ,oid_c(0)
175 : ,startstate_w(0)
176 : ,startstate_c(0)
177 : ,endstate_w(0)
178 : ,endstate_c(0)
179 : ,topics_w(0)
180 : ,topics_c(0)
181 12 : ,useCount(0)
182 : {
183 12 : }
184 :
185 11 : iom_basket::~iom_basket()
186 : {
187 11 : if(tag_c)XMLString::release(&tag_c);
188 11 : if(oid_c)XMLString::release(&oid_c);
189 11 : if(oid_w)XMLString::release(&oid_w);
190 11 : if(startstate_c)XMLString::release(&startstate_c);
191 11 : if(startstate_w)XMLString::release(&startstate_w);
192 11 : if(endstate_c)XMLString::release(&endstate_c);
193 11 : if(endstate_w)XMLString::release(&endstate_w);
194 11 : if(topics_c)XMLString::release(&topics_c);
195 11 : if(topics_w)XMLString::release(&topics_w);
196 11 : }
197 :
198 12 : void iom_basket::setTag(int tag1)
199 : {
200 12 : if(tag_c)tag_c=0;
201 12 : tag=tag1;
202 12 : }
203 0 : int iom_basket::getTag()
204 : {
205 0 : return tag;
206 : }
207 0 : const char *iom_basket::getTag_c()
208 : {
209 0 : if(!tag){
210 0 : return 0;
211 : }
212 0 : if(!tag_c){
213 0 : const XMLCh *const tag_w=ParserHandler::getTagName(tag);
214 0 : tag_c=XMLString::transcode(tag_w);
215 : }
216 0 : return tag_c;
217 : }
218 :
219 12 : void iom_basket::setXMLLineNumber(int line)
220 : {
221 12 : xmlLine=line;
222 12 : }
223 0 : int iom_basket::getXMLLineNumber()
224 : {
225 0 : return xmlLine;
226 : }
227 :
228 12 : void iom_basket::setXMLColumnNumber(int col)
229 : {
230 12 : xmlCol=col;
231 12 : }
232 :
233 0 : int iom_basket::getXMLColumnNumber()
234 : {
235 0 : return xmlCol;
236 : }
237 :
238 0 : void iom_basket::setConsistency(int cons)
239 : {
240 0 : consistency=cons;
241 0 : }
242 :
243 0 : int iom_basket::getConsistency()
244 : {
245 0 : return consistency;
246 : }
247 :
248 0 : void iom_basket::setKind(int kind1)
249 : {
250 0 : kind=kind1;
251 0 : }
252 :
253 0 : int iom_basket::getKind()
254 : {
255 0 : return kind;
256 : }
257 :
258 12 : void iom_basket::setOid(const XMLCh *oid)
259 : {
260 12 : if(oid_c)XMLString::release(&oid_c);
261 12 : if(oid_w)XMLString::release(&oid_w);
262 12 : oid_w=XMLString::replicate(oid);
263 12 : }
264 0 : const XMLCh *iom_basket::getOid()
265 : {
266 0 : return oid_w;
267 : }
268 0 : const char *iom_basket::getOid_c()
269 : {
270 0 : if(!oid_w){
271 0 : return 0;
272 : }
273 0 : if(!oid_c){
274 0 : oid_c=XMLString::transcode(oid_w);
275 : }
276 0 : return oid_c;
277 : }
278 :
279 0 : void iom_basket::setStartState(const XMLCh *startstate)
280 : {
281 0 : if(startstate_c)XMLString::release(&startstate_c);
282 0 : if(startstate_w)XMLString::release(&startstate_w);
283 0 : startstate_w=XMLString::replicate(startstate);
284 0 : }
285 0 : const XMLCh *iom_basket::getStartState()
286 : {
287 0 : return startstate_w;
288 : }
289 0 : const char *iom_basket::getStartState_c()
290 : {
291 0 : if(!startstate_w){
292 0 : return 0;
293 : }
294 0 : if(!startstate_c){
295 0 : startstate_c=XMLString::transcode(startstate_w);
296 : }
297 0 : return startstate_c;
298 : }
299 :
300 :
301 0 : void iom_basket::setEndState(const XMLCh *endstate)
302 : {
303 0 : if(endstate_c)XMLString::release(&endstate_c);
304 0 : if(endstate_w)XMLString::release(&endstate_w);
305 0 : endstate_w=XMLString::replicate(endstate);
306 0 : }
307 0 : const XMLCh *iom_basket::getEndState()
308 : {
309 0 : return endstate_w;
310 : }
311 0 : const char *iom_basket::getEndState_c()
312 : {
313 0 : if(!endstate_w){
314 0 : return 0;
315 : }
316 0 : if(!endstate_c){
317 0 : endstate_c=XMLString::transcode(endstate_w);
318 : }
319 0 : return endstate_c;
320 : }
321 :
322 :
323 0 : void iom_basket::setTopics(const XMLCh *topics)
324 : {
325 0 : if(topics_c)XMLString::release(&topics_c);
326 0 : if(topics_w)XMLString::release(&topics_w);
327 0 : topics_w=XMLString::replicate(topics);
328 0 : }
329 0 : const XMLCh *iom_basket::getTopics()
330 : {
331 0 : return topics_w;
332 : }
333 0 : const char *iom_basket::getTopics_c()
334 : {
335 0 : if(!topics_w){
336 0 : return 0;
337 : }
338 0 : if(!topics_c){
339 0 : topics_c=XMLString::transcode(topics_w);
340 : }
341 0 : return topics_c;
342 : }
343 :
344 :
345 3167 : void iom_basket::addObject(IomObject object)
346 : {
347 3167 : objectv.push_back(object);
348 3167 : object->setBasket(this);
349 3167 : }
350 :
351 1779 : IomObject iom_basket::getObject(const XMLCh *oid)
352 : {
353 1779 : std::vector<IomObject>::iterator it;
354 1779 : for(it=objectv.begin();it!=objectv.end();it++){
355 158788 : IomObject obj=*it;
356 158788 : if(!XMLString::compareString(oid,obj->getOid())){
357 1779 : return obj;
358 : }
359 : }
360 0 : return IomObject();
361 : }
362 :
363 :
364 3254 : IomBasket::IomBasket(struct iom_basket *pointee1)
365 3254 : : pointee(pointee1 ? pointee1->getRef() : 0){
366 3254 : }
367 87 : IomBasket::IomBasket(const IomBasket& src)
368 87 : : pointee(src.pointee ? src.pointee->getRef() : 0){
369 87 : }
370 24 : IomBasket& IomBasket::operator=(const IomBasket& src){
371 24 : if(this!=&src){
372 24 : if(pointee && !pointee->freeRef()){
373 0 : delete pointee;
374 : }
375 24 : pointee=src.pointee ? src.pointee->getRef() :0;
376 : }
377 24 : return *this;
378 : }
379 4078 : IomBasket::~IomBasket(){
380 4078 : if(pointee && !pointee->freeRef()){
381 0 : delete pointee;
382 : }
383 6217 : }
|