source: branches/work_311/lists/ARFieldList.cpp @ 610

Revision 610, 11.7 KB checked in by jls17, 5 years ago (diff)
  • moved ARZeroMemory function to Memory.cpp/.h
  • added new ARZeroMemory function which has a size parameter to replace ZeroMemory? (which is only available on windows)
  • replaced all ZeroMemory? calls with ARZeroMemory
  • fixed some gcc compiler warnings
  • now ARQualification throws AppException? instead of exception, because in the standard implementation there is no constructor to pass a message to exception class (this MSVC specific)
Line 
1//Copyright (C) 2010 John Luthgers | jls17
2//
3//This file is part of ARInside.
4//
5//    ARInside is free software: you can redistribute it and/or modify
6//    it under the terms of the GNU General Public License as published by
7//    the Free Software Foundation, version 2 of the License.
8//
9//    ARInside 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 ARInside.  If not, see <http://www.gnu.org/licenses/>.
16
17#include "stdafx.h"
18#include "ARFieldList.h"
19#include "../ARInside.h"
20#include "../core/ARStatusList.h"
21#include "../util/RefItem.h"
22
23///////////////////////////////////////////////////////////////////////////////
24// CARFieldList implementation
25bool CARFieldList::FieldReferenceExists(unsigned int index, const CRefItem& refItem)
26{
27        ReferenceList::iterator curIt = workflowReferences[index].begin();
28        ReferenceList::iterator endIt = workflowReferences[index].end();
29
30        for (; curIt != endIt; ++curIt)
31        {
32                if (*curIt == refItem)
33                {
34                        return true;
35                }
36        }       
37        return false;
38}
39
40bool CARFieldList::FieldReferenceAdd(unsigned int index, const CRefItem &refItem)
41{
42        if (refItem.GetObjectType() != AR_STRUCT_ITEM_XML_NONE)
43        {
44                workflowReferences[index].push_back(refItem);
45                return true;
46        }
47        return false;
48}
49
50size_t CARFieldList::FieldReferenceCount(unsigned int index)
51{
52        return workflowReferences[index].size();
53}
54
55const CARFieldList::ReferenceList& CARFieldList::FieldReferenceList(unsigned int index)
56{
57        return workflowReferences[index];
58}
59
60///////////////////////////////////////////////////////////////////////////////
61// CARFieldListXML implementation
62void CARFieldListXML::FinishLoading()
63{
64        if (sortedList.empty() && fieldInfo.numItems > 0)
65        {
66                for (unsigned int i = 0; i < fieldInfo.numItems; ++i)
67                        sortedList.push_back(i);
68        }
69
70        workflowReferences.resize(fieldInfo.numItems);
71
72        Sort();
73}
74
75void CARFieldListXML::Sort()
76{
77        if (GetCount() > 0)
78        {
79                GenerateSortableList sortableContent(this->fieldInfo);
80                std::sort(sortedList.begin(),sortedList.end(),SortByName(sortableContent));
81        }
82}
83
84
85int CARFieldListXML::Find(const char *name)
86{
87        unsigned int count = GetCount();
88        for (unsigned int i = 0; i < count; ++i)
89        {
90                int result = strcoll(fieldInfo.fieldList[sortedList[i]].fieldName, name);
91                if (result == 0)
92                {
93                        return i;
94                }
95                else if (result > 0)
96                        // the current string in the sorted list is greater as the string we are looking for.
97                        // stop searching here.
98                        break;
99        }
100        return -1;
101}
102
103int CARFieldListXML::Find(unsigned int fieldId)
104{
105        unsigned int count = GetCount();
106        for (unsigned int i = 0; i < count; ++i)
107        {
108                if (fieldInfo.fieldList[sortedList[i]].fieldId == fieldId)
109                        return i;
110        }
111        return -1;
112}
113
114const ARPropList& CARFieldListXML::FieldGetPropList(unsigned int index) const
115{
116#if AR_CURRENT_API_VERSION < AR_API_VERSION_763
117        return emptyPropList;
118#else
119        return fieldInfo.fieldList[sortedList[index]].objPropList; 
120#endif
121}
122
123///////////////////////////////////////////////////////////////////////////////
124// CARFieldListServer implementation
125CARFieldListServer::CARFieldListServer(unsigned int schemaInsideId)
126{
127        schemaId = schemaInsideId;
128        ARZeroMemory(&names);
129        ARZeroMemory(&fieldIds);
130        ARZeroMemory(&fieldMaps);
131        ARZeroMemory(&dataTypes);
132        ARZeroMemory(&options);
133        ARZeroMemory(&createModes);
134        ARZeroMemory(&fieldOptions);
135        ARZeroMemory(&defaultValues);
136        ARZeroMemory(&permLists);
137        ARZeroMemory(&limits);
138        ARZeroMemory(&dInstanceLists);
139        ARZeroMemory(&helpTexts);
140        ARZeroMemory(&changedTimes);
141        ARZeroMemory(&owners);
142        ARZeroMemory(&changedUsers);
143        ARZeroMemory(&changeDiary);
144}
145
146CARFieldListServer::~CARFieldListServer()
147{
148        FreeARNameList(&names, false);
149        FreeARInternalIdList(&fieldIds, false);
150        FreeARFieldMappingList(&fieldMaps, false);
151        FreeARUnsignedIntList(&dataTypes, false);
152        FreeARUnsignedIntList(&options, false);
153        FreeARUnsignedIntList(&createModes, false);
154        FreeARUnsignedIntList(&fieldOptions, false);
155        FreeARValueList(&defaultValues, false);
156        FreeARPermissionListList(&permLists, false);
157        FreeARFieldLimitList(&limits, false);
158        FreeARDisplayInstanceListList(&dInstanceLists, false);
159        FreeARTextStringList(&helpTexts, false);
160        FreeARTimestampList(&changedTimes, false);
161        FreeARAccessNameList(&owners, false);
162        FreeARAccessNameList(&changedUsers, false);
163        FreeARTextStringList(&changeDiary, false);
164}
165
166bool CARFieldListServer::LoadFromServer()
167{
168        ARBooleanList   fldExists;
169        ARStatusList    status;
170        CARInside*      arIn = CARInside::GetInstance();
171        ARNameType                      schemaName; memcpy(schemaName, arIn->schemaList.SchemaGetName(schemaId), sizeof(ARNameType));
172
173        memset(&fldExists, 0, sizeof(ARBooleanList));
174        memset(&status, 0, sizeof(status));
175
176        if (arIn->CompareServerVersion(6,3) < 0)
177        {
178                ARInternalIdList fieldIdList;
179                ARZeroMemory(&fieldIdList);
180
181                if (ARGetListField(&arIn->arControl, schemaName, AR_FIELD_TYPE_ALL, 0, 
182#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
183                        NULL, 
184#endif
185                        &fieldIdList, &status) == AR_RETURN_OK)
186                {
187                        Reserve(fieldIdList.numItems);
188
189                        unsigned int currentWriteIndex = 0;
190                        for (unsigned int idx = 0; idx < fieldIdList.numItems; ++idx)
191                        {
192                                if (ARGetField(&arIn->arControl, schemaName, fieldIdList.internalIdList[idx],
193                                        names.nameList[currentWriteIndex],
194                                        &fieldMaps.mappingList[currentWriteIndex],
195                                        &dataTypes.intList[currentWriteIndex],
196                                        &options.intList[currentWriteIndex],
197                                        &createModes.intList[currentWriteIndex],
198                                        &fieldOptions.intList[currentWriteIndex],
199                                        &defaultValues.valueList[currentWriteIndex],
200#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
201                                        NULL,
202#endif
203                                        &permLists.permissionList[currentWriteIndex],
204                                        &limits.fieldLimitList[currentWriteIndex],
205                                        &dInstanceLists.dInstanceList[currentWriteIndex],
206                                        &helpTexts.stringList[currentWriteIndex],
207                                        &changedTimes.timestampList[currentWriteIndex],
208                                        owners.nameList[currentWriteIndex],
209                                        changedUsers.nameList[currentWriteIndex],
210                                        &changeDiary.stringList[currentWriteIndex],
211#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
212                                        &objProps.propsList[currentWriteIndex],
213#endif
214                                        &status) == AR_RETURN_OK)
215                                {
216                                        fieldIds.internalIdList[currentWriteIndex++] = fieldIdList.internalIdList[idx];
217                                }
218                                else
219                                        cerr << BuildMessageAndFreeStatus(status);
220                        }
221                        SetNumItems(currentWriteIndex);
222                        BuildIndex();
223                        return true;
224                }
225                else
226                {
227                        cerr << BuildMessageAndFreeStatus(status);
228                        return false;
229                }
230        }
231        else
232        {
233                // ok, get all informations of the fields we need
234                if (ARGetMultipleFields(&arIn->arControl,
235                        schemaName, 
236                        NULL, // all field ids
237                        &fldExists,
238                        &fieldIds,
239                        &names,
240                        &fieldMaps,
241                        &dataTypes,
242                        &options,
243                        &createModes,
244                        &fieldOptions,
245                        &defaultValues,
246        #if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
247                        NULL, // groupListList // TODO: support static inherited permissions
248        #endif
249                        &permLists,
250                        &limits,
251                        &dInstanceLists,
252                        &helpTexts,
253                        &changedTimes,
254                        &owners,
255                        &changedUsers,
256                        &changeDiary,
257        #if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
258                        &objProps,
259        #endif
260                        &status) == AR_RETURN_OK)
261                {
262                        FreeARBooleanList(&fldExists, false);
263                        BuildIndex();
264                        return true;
265                }
266                else
267                {
268                        cerr << BuildMessageAndFreeStatus(status);
269                        return false;
270                }
271        }
272}
273
274int CARFieldListServer::Find(const char *name)
275{
276        unsigned int count = GetCount();
277        for (unsigned int i = 0; i < count; ++i)
278        {
279                int result = strcoll(names.nameList[sortedList[i]], name);
280                if (result == 0)
281                {
282                        return i;
283                }
284                else if (result > 0)
285                        // the current string in the sorted list is greater as the string we are looking for.
286                        // stop searching here.
287                        break;
288        }
289        return -1;
290}
291
292int CARFieldListServer::Find(unsigned int fieldId)
293{
294        unsigned int count = GetCount();
295        for (unsigned int i = 0; i < count; ++i)
296        {
297                if (fieldIds.internalIdList[sortedList[i]] == fieldId)
298                        return i;
299        }
300        return -1;
301}
302
303void CARFieldListServer::Sort()
304{
305        if (GetCount() > 0)
306        {
307                GenerateSortableList sortableContent(names);
308                std::sort(sortedList.begin(),sortedList.end(),SortByName(sortableContent));
309        }
310}
311
312const ARPropList& CARFieldListServer::FieldGetPropList(unsigned int index) const
313{
314#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
315        if (objProps.numItems == 0)
316                return emptyPropList;
317        return objProps.propsList[sortedList[index]];
318#else
319        return emptyPropList;
320#endif
321}
322
323void CARFieldListServer::Reserve(unsigned int amount)
324{
325        names.nameList = new ARNameType[amount];
326        ARZeroMemory(names.nameList, sizeof(ARNameType) * amount);
327
328        fieldIds.internalIdList = new ARInternalId[amount];
329        ARZeroMemory(fieldIds.internalIdList, sizeof(ARInternalId) * amount);
330
331        fieldMaps.mappingList = new ARFieldMappingStruct[amount];
332        ARZeroMemory(fieldMaps.mappingList, sizeof(ARFieldMappingStruct) * amount);
333
334        dataTypes.intList = new unsigned int[amount];
335        ARZeroMemory(dataTypes.intList, sizeof(unsigned int) * amount);
336
337        options.intList = new unsigned int[amount];
338        ARZeroMemory(options.intList, sizeof(unsigned int) * amount);
339
340        createModes.intList = new unsigned int[amount];
341        ARZeroMemory(createModes.intList, sizeof(unsigned int) * amount);
342       
343        fieldOptions.intList = new unsigned int[amount];
344        ARZeroMemory(fieldOptions.intList, sizeof(unsigned int) * amount);
345
346        defaultValues.valueList = new ARValueStruct[amount];
347        ARZeroMemory(defaultValues.valueList, sizeof(ARValueStruct) * amount);
348
349        permLists.permissionList = new ARPermissionList[amount];
350        ARZeroMemory(permLists.permissionList, sizeof(ARPermissionList) * amount);
351
352        limits.fieldLimitList = new ARFieldLimitStruct[amount];
353        ARZeroMemory(limits.fieldLimitList, sizeof(ARFieldLimitStruct) * amount);
354
355        dInstanceLists.dInstanceList = new ARDisplayInstanceList[amount];
356        ARZeroMemory(dInstanceLists.dInstanceList, sizeof(ARDisplayInstanceList) * amount);
357
358        helpTexts.stringList = new char*[amount];
359        ARZeroMemory(helpTexts.stringList, sizeof(char*) * amount);
360
361        changedTimes.timestampList = new ARTimestamp[amount];
362        ARZeroMemory(changedTimes.timestampList, sizeof(ARTimestamp) * amount);
363
364        owners.nameList = new ARAccessNameType[amount];
365        ARZeroMemory(owners.nameList, sizeof(ARAccessNameType) * amount);
366
367        changedUsers.nameList = new ARAccessNameType[amount];
368        ARZeroMemory(changedUsers.nameList, sizeof(ARAccessNameType) * amount);
369
370        changeDiary.stringList = new char*[amount];
371        ARZeroMemory(changeDiary.stringList, sizeof(char*) * amount);
372
373#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
374        objProps.propsList = new ARPropList[amount];
375        ARZeroMemory(objProps.propsList, sizeof(ARPropList) * amount);
376#endif
377}
378
379void CARFieldListServer::SetNumItems(unsigned int amount)
380{
381        names.numItems = amount;
382        fieldIds.numItems = amount;
383        fieldMaps.numItems = amount;
384        dataTypes.numItems = amount;
385        options.numItems = amount;
386        createModes.numItems = amount;
387        fieldOptions.numItems = amount;
388        defaultValues.numItems = amount;
389        permLists.numItems = amount;
390        limits.numItems = amount;
391        dInstanceLists.numItems = amount;
392        helpTexts.numItems = amount;
393        changedTimes.numItems = amount;
394        owners.numItems = amount;
395        changedUsers.numItems = amount;
396        changeDiary.numItems = amount;
397#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
398        objProps.numItems = amount;
399#endif
400}
401
402void CARFieldListServer::BuildIndex()
403{
404        sortedList.reserve(names.numItems);
405        for (unsigned int i=0; i<names.numItems; ++i)
406        {
407                sortedList.push_back(i);
408        }
409        workflowReferences.resize(names.numItems);
410}
Note: See TracBrowser for help on using the repository browser.