Add GNU LGPL headers to all .c .C and .h files
[oweals/cde.git] / cde / programs / dtinfo / DtMmdb / oliasdb / c_api_toc.C
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
6  * These libraries and programs are free software; you can
7  * redistribute them and/or modify them under the terms of the GNU
8  * Lesser General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * These libraries and programs are distributed in the hope that
13  * they will be useful, but WITHOUT ANY WARRANTY; without even the
14  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15  * PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with these librararies and programs; if not, write
20  * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21  * Floor, Boston, MA 02110-1301 USA
22  */
23 // $XConsortium: c_api_toc.cc /main/4 1996/06/11 17:28:18 cde-hal $
24
25 #include "oliasdb/c_api_common.h"
26
27 static toc_smart_ptr*
28 getTocUsingProid(DtMmdbInfoRequest* request)
29 {
30    try {
31       info_base* x = getBookCase(request -> bookcase_descriptor);
32       if ( x == 0 ) return 0;
33
34       oid_t * id = getPrimiaryOid(request);
35
36       if ( id == 0 ) return 0;
37
38       return new toc_smart_ptr(x, *id);
39    }
40
41    catch (mmdbException &,e)
42    {
43      return 0;
44    } end_try;
45      return 0;
46 }
47
48
49 DtMmdbHandle*
50 DtMmdbTocGetParentId(DtMmdbInfoRequest* request)
51 {
52    try {
53       toc_smart_ptr* x = getTocUsingProid(request);
54       if ( x == 0 ) return 0;
55
56       DtMmdbHandle *z = 0;
57
58       if ( x -> parent() == ground )
59         z = DtMmdbGroundId;
60       else
61         z = newDtMmdbHandle(x -> parent());
62
63       delete x;
64       return z; 
65    }
66
67    catch (mmdbException &,e)
68    {
69      return 0;
70    } end_try;
71      return 0;
72 }
73
74 DtMmdbHandle**
75 DtMmdbTocGetChildIds(
76         DtMmdbInfoRequest* request,
77         unsigned int* list_length
78         )
79 {
80    try {
81       toc_smart_ptr* x = getTocUsingProid(request);
82       if ( x == 0 ) return 0;
83
84       oid_list_handler* y = x -> children();
85       if ( y == 0 ) return 0;
86
87       int count = (*y) -> count();
88 //fprintf(stderr, "count=%d\n", count);
89
90       DtMmdbHandle** z = (DtMmdbHandle**)malloc(sizeof(DtMmdbHandle*) * (count+1));
91
92 //fprintf(stderr, "z=%x\n", (void*)z);
93       if ( z == 0 ) return 0;
94     
95       for (int i=0; i<count; i++) { 
96          z[i] = newDtMmdbHandle(oid_t(OLIAS_NODE_CODE, ((*y) -> operator()(i+1)).icode()));
97       }
98
99       z[i] = 0;
100
101       delete y;
102       delete x;
103
104       if ( list_length ) 
105          *list_length = count;
106
107       return z;
108    }
109
110    catch (mmdbException &,e)
111    {
112      return 0;
113    } end_try;
114      return 0;
115 }
116
117 int DtMmdbTocGetNumOfChildren( DtMmdbInfoRequest* request)
118 {
119    try {
120       toc_smart_ptr* x = getTocUsingProid(request);
121       if ( x == 0 ) return -1;
122       int y = x -> subtree_size();
123       delete x;
124       return y; 
125    }
126
127    catch (mmdbException &,e)
128    {
129      return -1;
130    } end_try;
131      return -1;
132 }
133