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

Revision 623, 8.1 KB checked in by jls17, 5 years ago (diff)
  • program switches to slow object loading automatically if server version is below 6.3
  • changed CARFieldListServer and CARVUIListServer to take slowObjectLoading option into account
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->appConfig.slowObjectLoading && ARGetMultipleVUIs(&arIn->arControl,
113                schemaName, 
114                NULL, // all field ids
115                0,    // no changed since restriction
116                &vuiExists,
117                &ids,
118                &names,
119                &locales,
120                &types,
121                &dispProps,
122                &helpTexts,
123                &changedTimes,
124                &owners,
125                &changedUsers,
126                &changeDiary,
127#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
128                &objProps,
129#endif
130                &status) == AR_RETURN_OK)
131        {
132                FreeARBooleanList(&vuiExists, false);
133                BuildIndex();
134                return true;
135        }
136        else
137        {
138                cerr << BuildMessageAndFreeStatus(status);
139
140                // ok, fallback to slow data retrieval
141                // this could be necessaray if there is a corrupt vui that keeps us from getting all vuis at once
142                if (!arIn->appConfig.slowObjectLoading)
143                        cout << "WARN: switching to slow vui loading for: " << schemaName << endl;
144
145                ARInternalIdList        vuiIdList;
146                ARZeroMemory(&vuiIdList);
147                if (ARGetListVUI(&arIn->arControl, schemaName, 0, 
148#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
149                        NULL,
150#endif                 
151                        &vuiIdList, &status) == AR_RETURN_OK)
152                {
153                        Reserve(vuiIdList.numItems);
154
155                        unsigned int currentWriteIndex = 0;
156                        for (unsigned int idx = 0; idx < vuiIdList.numItems; ++idx)
157                        {
158                                if (ARGetVUI(&arIn->arControl,
159                                        schemaName,
160                                        vuiIdList.internalIdList[idx],
161                                        names.nameList[currentWriteIndex],
162                                        locales.localeList[currentWriteIndex],
163                                        &types.intList[currentWriteIndex],
164                                        &dispProps.propsList[currentWriteIndex],
165                                        &helpTexts.stringList[currentWriteIndex],
166                                        &changedTimes.timestampList[currentWriteIndex],
167                                        owners.nameList[currentWriteIndex],
168                                        changedUsers.nameList[currentWriteIndex],
169                                        &changeDiary.stringList[currentWriteIndex],
170#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
171                                        &objProps.propsList[currentWriteIndex],
172#endif
173                                        &status) == AR_RETURN_OK)
174                                {
175                                        ids.internalIdList[currentWriteIndex++] = vuiIdList.internalIdList[idx];
176                                }
177                                else
178                                        cerr << "Schema: " << schemaName << " -- Failed to load vui " << vuiIdList.internalIdList[idx] << ": " << BuildMessageAndFreeStatus(status);
179                        }
180                        SetNumItems(currentWriteIndex);
181                        BuildIndex();
182                        return true;
183                }
184                else
185                {
186                        cerr << BuildMessageAndFreeStatus(status);
187                        return false;
188                }
189        }
190}
191
192int CARVUIListServer::Find(unsigned int vuiId)
193{
194        unsigned int vuiCount = GetCount();
195        for (unsigned int i = 0; i < vuiCount; ++i)
196        {
197                if (ids.internalIdList[i] == vuiId)
198                        return i;
199        }
200        return -1;
201}
202
203void CARVUIListServer::Sort()
204{
205        if (GetCount() > 0)
206        {
207                GenerateSortableList sortableContent(names);
208                std::sort(sortedList.begin(),sortedList.end(),SortByName(sortableContent));
209        }
210}
211
212const ARPropList& CARVUIListServer::VUIGetPropList(unsigned int index) const
213{
214#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
215        if (objProps.numItems == 0)
216                return emptyPropList;
217        return objProps.propsList[sortedList[index]];
218#else
219        return emptyPropList;
220#endif
221}
222
223void CARVUIListServer::Reserve(unsigned int amount)
224{
225        ids.internalIdList = new ARInternalId[amount];
226        ARZeroMemory(ids.internalIdList, sizeof(ARInternalId) * amount);
227
228        names.nameList = new ARNameType[amount];
229        ARZeroMemory(names.nameList, sizeof(ARNameType) * amount);
230
231        locales.localeList = new ARLocaleType[amount];
232        ARZeroMemory(locales.localeList, sizeof(ARLocaleType) * amount);
233
234        types.intList = new unsigned int[amount];
235        ARZeroMemory(types.intList, sizeof(unsigned int) * amount);
236
237        dispProps.propsList = new ARPropList[amount];
238        ARZeroMemory(dispProps.propsList, sizeof(ARPropList) * amount);
239       
240        helpTexts.stringList = new char*[amount];
241        ARZeroMemory(helpTexts.stringList, sizeof(char*) * amount);
242
243        changedTimes.timestampList = new ARTimestamp[amount];
244        ARZeroMemory(changedTimes.timestampList, sizeof(ARTimestamp) * amount);
245       
246        owners.nameList = new ARAccessNameType[amount];
247        ARZeroMemory(owners.nameList, sizeof(ARAccessNameType) * amount);
248       
249        changedUsers.nameList = new ARAccessNameType[amount];
250        ARZeroMemory(changedUsers.nameList, sizeof(ARAccessNameType) * amount);
251       
252        changeDiary.stringList = new char*[amount];
253        ARZeroMemory(changeDiary.stringList, sizeof(char*) * amount);
254
255#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
256        objProps.propsList = new ARPropList[amount];
257        ARZeroMemory(objProps.propsList, sizeof(ARPropList) * amount);
258#endif
259}
260
261void CARVUIListServer::SetNumItems(unsigned int amount)
262{
263        ids.numItems = amount;
264        names.numItems = amount;
265        locales.numItems = amount;
266        types.numItems = amount;
267        dispProps.numItems = amount;
268        helpTexts.numItems = amount;
269        changedTimes.numItems = amount;
270        owners.numItems = amount;
271        changedUsers.numItems = amount;
272        changeDiary.numItems = amount;
273#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
274        objProps.numItems = amount;
275#endif
276}
277
278void CARVUIListServer::BuildIndex()
279{
280        sortedList.reserve(names.numItems);
281        for (unsigned int i=0; i<names.numItems; ++i)
282        {
283                sortedList.push_back(i);
284        }
285}
Note: See TracBrowser for help on using the repository browser.