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

Revision 610, 7.9 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 "ARVUIList.h"
19#include "../ARInside.h"
20#include "../core/ARStatusList.h"
21
22///////////////////////////////////////////////////////////////////////////////
23// CARVUIListXML - implementation
24void CARVUIListXML::FinishLoading()
25{
26        if (sortedList.empty() && vuiList.numItems > 0)
27        {
28                for (unsigned int i = 0; i < vuiList.numItems; ++i)
29                        sortedList.push_back(i);
30        }
31
32        Sort();
33}
34
35void CARVUIListXML::Sort()
36{
37        if (GetCount() > 0)
38        {
39                GenerateSortableList sortableContent(vuiList);
40                std::sort(sortedList.begin(),sortedList.end(),SortByName(sortableContent));
41        }
42}
43
44int CARVUIListXML::Find(unsigned int vuiId)
45{
46        unsigned int count = GetCount();
47        for (unsigned int i = 0; i < count; ++i)
48        {
49                if (vuiList.vuiList[sortedList[i]].vuiId == vuiId)
50                        return i;
51        }
52        return -1;
53}
54
55const ARPropList& CARVUIListXML::VUIGetPropList(unsigned int index) const
56{
57#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
58        if (vuiList.numItems == 0)
59                return emptyPropList;
60        return vuiList.vuiList[sortedList[index]].smObjProp;
61#else
62        return emptyPropList;
63#endif
64}
65///////////////////////////////////////////////////////////////////////////////
66// CARVUIListServer - implementation
67CARVUIListServer::CARVUIListServer(unsigned int schemaInsideId) 
68{
69        schemaId = schemaInsideId;
70        ARZeroMemory(&ids);
71        ARZeroMemory(&names);
72        ARZeroMemory(&locales);
73        ARZeroMemory(&types);
74        ARZeroMemory(&dispProps);
75        ARZeroMemory(&helpTexts);
76        ARZeroMemory(&changedTimes);
77        ARZeroMemory(&owners);
78        ARZeroMemory(&changedUsers);
79        ARZeroMemory(&changeDiary);
80#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
81        ARZeroMemory(&objProps);
82#endif
83}
84
85CARVUIListServer::~CARVUIListServer()
86{
87        FreeARInternalIdList(&ids, false);
88        FreeARNameList(&names, false);
89        FreeARLocaleList(&locales, false);
90        FreeARUnsignedIntList(&types, false);
91        FreeARPropListList(&dispProps, false);
92        FreeARTextStringList(&helpTexts, false);
93        FreeARTimestampList(&changedTimes, false);
94        FreeARAccessNameList(&owners, false);
95        FreeARAccessNameList(&changedUsers, false);
96        FreeARTextStringList(&changeDiary, false);
97#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
98        FreeARPropListList(&objProps, false);
99#endif
100}
101
102bool CARVUIListServer::LoadFromServer()
103{
104        ARBooleanList   vuiExists;
105        ARStatusList    status;
106        CARInside*      arIn = CARInside::GetInstance();
107        ARNameType                      schemaName; memcpy(schemaName, arIn->schemaList.SchemaGetName(schemaId), sizeof(ARNameType));
108
109        memset(&vuiExists, 0, sizeof(ARBooleanList));
110        memset(&status, 0, sizeof(status));
111
112        if (arIn->CompareServerVersion(6,3) < 0)
113        {
114                ARInternalIdList        vuiIdList;
115                ARZeroMemory(&vuiIdList);
116                if (ARGetListVUI(&arIn->arControl, schemaName, 0, 
117#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
118                        NULL,
119#endif                 
120                        &vuiIdList, &status) == AR_RETURN_OK)
121                {
122                        Reserve(vuiIdList.numItems);
123
124                        unsigned int currentWriteIndex = 0;
125                        for (unsigned int idx = 0; idx < vuiIdList.numItems; ++idx)
126                        {
127                                if (ARGetVUI(&arIn->arControl,
128                                        schemaName,
129                                        vuiIdList.internalIdList[idx],
130                                        names.nameList[currentWriteIndex],
131                                        locales.localeList[currentWriteIndex],
132                                        &types.intList[currentWriteIndex],
133                                        &dispProps.propsList[currentWriteIndex],
134                                        &helpTexts.stringList[currentWriteIndex],
135                                        &changedTimes.timestampList[currentWriteIndex],
136                                        owners.nameList[currentWriteIndex],
137                                        changedUsers.nameList[currentWriteIndex],
138                                        &changeDiary.stringList[currentWriteIndex],
139#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
140                                        &objProps.propsList[currentWriteIndex],
141#endif
142                                        &status) == AR_RETURN_OK)
143                                {
144                                        ids.internalIdList[currentWriteIndex++] = vuiIdList.internalIdList[idx];
145                                }
146                                else
147                                        cerr << BuildMessageAndFreeStatus(status);
148                        }
149                        SetNumItems(currentWriteIndex);
150                        BuildIndex();
151                        return true;
152                }
153                else
154                {
155                        cerr << BuildMessageAndFreeStatus(status);
156                        return false;
157                }
158        }
159        else
160        {
161                // ok, get all informations of the fields we need
162                if (ARGetMultipleVUIs(&arIn->arControl,
163                        schemaName, 
164                        NULL, // all field ids
165                        0,    // no changed since restriction
166                        &vuiExists,
167                        &ids,
168                        &names,
169                        &locales,
170                        &types,
171                        &dispProps,
172                        &helpTexts,
173                        &changedTimes,
174                        &owners,
175                        &changedUsers,
176                        &changeDiary,
177        #if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
178                        &objProps,
179        #endif
180                        &status) == AR_RETURN_OK)
181                {
182                        FreeARBooleanList(&vuiExists, false);
183                        BuildIndex();
184                        return true;
185                }
186                else
187                {
188                        cerr << BuildMessageAndFreeStatus(status);
189                        return false;
190                }
191        }
192}
193
194int CARVUIListServer::Find(unsigned int vuiId)
195{
196        unsigned int vuiCount = GetCount();
197        for (unsigned int i = 0; i < vuiCount; ++i)
198        {
199                if (ids.internalIdList[i] == vuiId)
200                        return i;
201        }
202        return -1;
203}
204
205void CARVUIListServer::Sort()
206{
207        if (GetCount() > 0)
208        {
209                GenerateSortableList sortableContent(names);
210                std::sort(sortedList.begin(),sortedList.end(),SortByName(sortableContent));
211        }
212}
213
214const ARPropList& CARVUIListServer::VUIGetPropList(unsigned int index) const
215{
216#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
217        if (objProps.numItems == 0)
218                return emptyPropList;
219        return objProps.propsList[sortedList[index]];
220#else
221        return emptyPropList;
222#endif
223}
224
225void CARVUIListServer::Reserve(unsigned int amount)
226{
227        ids.internalIdList = new ARInternalId[amount];
228        ARZeroMemory(ids.internalIdList, sizeof(ARInternalId) * amount);
229
230        names.nameList = new ARNameType[amount];
231        ARZeroMemory(names.nameList, sizeof(ARNameType) * amount);
232
233        locales.localeList = new ARLocaleType[amount];
234        ARZeroMemory(locales.localeList, sizeof(ARLocaleType) * amount);
235
236        types.intList = new unsigned int[amount];
237        ARZeroMemory(types.intList, sizeof(unsigned int) * amount);
238
239        dispProps.propsList = new ARPropList[amount];
240        ARZeroMemory(dispProps.propsList, sizeof(ARPropList) * amount);
241       
242        helpTexts.stringList = new char*[amount];
243        ARZeroMemory(helpTexts.stringList, sizeof(char*) * amount);
244
245        changedTimes.timestampList = new ARTimestamp[amount];
246        ARZeroMemory(changedTimes.timestampList, sizeof(ARTimestamp) * amount);
247       
248        owners.nameList = new ARAccessNameType[amount];
249        ARZeroMemory(owners.nameList, sizeof(ARAccessNameType) * amount);
250       
251        changedUsers.nameList = new ARAccessNameType[amount];
252        ARZeroMemory(changedUsers.nameList, sizeof(ARAccessNameType) * amount);
253       
254        changeDiary.stringList = new char*[amount];
255        ARZeroMemory(changeDiary.stringList, sizeof(char*) * amount);
256
257#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
258        objProps.propsList = new ARPropList[amount];
259        ARZeroMemory(objProps.propsList, sizeof(ARPropList) * amount);
260#endif
261}
262
263void CARVUIListServer::SetNumItems(unsigned int amount)
264{
265        ids.numItems = amount;
266        names.numItems = amount;
267        locales.numItems = amount;
268        types.numItems = amount;
269        dispProps.numItems = amount;
270        helpTexts.numItems = amount;
271        changedTimes.numItems = amount;
272        owners.numItems = amount;
273        changedUsers.numItems = amount;
274        changeDiary.numItems = amount;
275#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
276        objProps.numItems = amount;
277#endif
278}
279
280void CARVUIListServer::BuildIndex()
281{
282        sortedList.reserve(names.numItems);
283        for (unsigned int i=0; i<names.numItems; ++i)
284        {
285                sortedList.push_back(i);
286        }
287}
Note: See TracBrowser for help on using the repository browser.