source: branches/work_311/doc/DocActionOpenWindowHelper.cpp @ 601

Revision 601, 9.6 KB checked in by jls17, 5 years ago (diff)
Line 
1//Copyright (C) 2009 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 Foobar.  If not, see <http://www.gnu.org/licenses/>.
16
17#include "stdafx.h"
18#include "DocActionOpenWindowHelper.h"
19
20CDocActionOpenWindowHelper::CDocActionOpenWindowHelper(char* reportString)
21{
22        isValid = false;
23        isParsed = false;
24        this->reportString = reportString;
25
26        reportType_Start = NULL;
27        reportType_End = NULL;
28        reportLocation_Start = NULL;
29        reportLocation_End = NULL;
30        reportName_Start = NULL;
31        reportName_End = NULL;
32        reportDestination_Start = NULL;
33        //reportDestination_End = NULL;
34        entryIds_Start = NULL;
35        entryIds_End = NULL;
36        queryOverride_Start = NULL;
37        queryOverride_End = NULL;
38        reportOperation_Start = NULL;
39        reportOperation_End = NULL;
40        charEncoding_Start = NULL;
41        charEncoding_End = NULL;
42        inlineForm_Start = NULL;
43        inlineForm_End = NULL;
44}
45
46CDocActionOpenWindowHelper::~CDocActionOpenWindowHelper()
47{
48}
49
50bool CDocActionOpenWindowHelper::GetSampleData(CARActiveLink& actLink, IfElseState ifElse, int nAction, string &server, string &schema)
51{
52        // ok, this is a very ugly design of the ARS api. The sample data of
53        // the action is stored within the object properties of the active-
54        // link. that wouldnt be that bad if we just need to read the data
55        // from there, but the data is something like an API structure and
56        // there is no ARDecode*** function. So we need to implement our
57        // own decode routine.
58
59        const ARPropList &propList = actLink.GetPropList();
60
61        // first, decide which property we are looking for
62        unsigned int PropID = (ifElse == IES_IF ? AR_OPROP_WINDOW_OPEN_IF_SAMPLE_SERVER_SCHEMA : AR_OPROP_WINDOW_OPEN_ELSE_SAMPLE_SERVER_SCHEMA);
63
64        // now find the index of the object property
65        int propIndex = -1;
66        for (unsigned int k=0; k < propList.numItems; ++k)
67        {
68                if (propList.props[k].prop == PropID)
69                {
70                        propIndex = k;
71                        break;
72                }
73        }
74
75        if (propIndex > -1 && propList.props[propIndex].value.dataType == AR_DATA_TYPE_CHAR)
76        {
77                // the property is found and has correct data type
78                char* propData = propList.props[propIndex].value.u.charVal;
79                unsigned int chrIndex = 0;      // this holds the current position within propData
80               
81                int listCount = atoi(propData); // retrieve lists item count
82                while (propData[chrIndex] != '\\' && propData[chrIndex] != 0) ++chrIndex;
83                if (listCount > 0 && propData[chrIndex] != 0)
84                {
85                        ++chrIndex; // skip last "\"
86                        // now we need to check each entry of the list against this actions index
87                        for (int listIndex = 0; listIndex < listCount; ++listIndex)
88                        {
89                                int propActionIndex = atoi(&propData[chrIndex]);
90                                while (propData[chrIndex] != '\\' && propData[chrIndex] != 0) ++chrIndex;
91                                if (propData[chrIndex] == '\\') ++chrIndex;
92
93                                if (propActionIndex == nAction && propData[chrIndex] != 0)
94                                {
95                                        // match! found the action we were looking for!
96                                        unsigned int strStart = chrIndex;
97                                        while (propData[chrIndex] != '\\' && propData[chrIndex] != 0) ++chrIndex;
98                                        if (propData[chrIndex] == 0) break;
99
100                                        unsigned int strLen = chrIndex - strStart;
101                                        server.resize(strLen);
102                                        strncpy(&server[0], &propData[strStart], chrIndex - strStart);
103
104                                        ++chrIndex; // skip last "\"
105                                        strStart = chrIndex;
106                                        while (propData[chrIndex] != '\\' && propData[chrIndex] != 0) ++chrIndex;
107                                        //if (propData[chrIndex] == 0) break;
108
109                                        strLen = chrIndex - strStart;
110                                        schema.resize(strLen);
111                                        strncpy(&schema[0], &propData[strStart], chrIndex - strStart);
112                                        return true;    // we are done
113                                }
114
115                                // skip next two data entries now
116                                for (int tmpDataCount = 0; tmpDataCount < 2; ++tmpDataCount)
117                                {
118                                        while(propData[chrIndex] != '\\' && propData[chrIndex] != 0) ++chrIndex;
119                                        if (propData[chrIndex] == 0) break;
120                                        ++chrIndex; // skip last "\"
121                                }
122                                if (propData[chrIndex] == 0) break;
123                        }
124                }
125        }
126        return false;
127}
128
129bool CDocActionOpenWindowHelper::GetReportData(char *reportStr, std::string &reportType, std::string &reportLocation, std::string &reportName, std::string &reportDestination, std::string &entryIDs, std::string &queryOverride, std::string &reportOperation, std::string &charEncoding, std::string &inlineForm)
130{
131        if (reportStr == NULL) return false;
132
133        bool found = false;
134        char *report = strstr(reportStr, "Report: \1"); 
135        if (report == NULL) return false;
136        report += 9;
137
138        while (report[0] != 0)
139        {
140                if (report[0] == 0x0A)
141                {
142                        ++report;
143                        reportDestination = report;
144                        return true;
145                }
146
147                int i = atoi(report);
148                report = strchr(report,'='); 
149                if (report == NULL) return found;
150                ++report;
151
152                string *value = NULL;
153                switch (i)
154                {
155                case AR_REPORT_ATTR_TYPE:
156                        value = &reportType;
157                        break;
158                case AR_REPORT_ATTR_FILENAME:
159                        value = &reportName;
160                        break;
161                case AR_REPORT_ATTR_LOCATION:
162                        value = &reportLocation;
163                        break;
164                case AR_REPORT_ATTR_CHAR_ENCODING:
165                        value = &charEncoding;
166                        break;
167                case AR_REPORT_ATTR_ENTRYIDS:
168                        value = &entryIDs;
169                        break;
170                case AR_REPORT_ATTR_QUERY_OVERRIDE:
171                        value = &queryOverride;
172                        break;
173                case AR_REPORT_ATTR_OPERATION:
174                        value = &reportOperation;
175                        break;
176#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
177                case AR_REPORT_ATTR_INLINE_FORM:
178                        value = &inlineForm;
179                        break;
180#endif
181                }
182
183                const char* pos = strchr(report,'\1');
184                if (pos == NULL) return found;
185                size_t len = (size_t)(pos - report);
186
187                if (value != NULL)
188                {
189                        value->resize(len);
190                        if (len > 0) strncpy(&(*value)[0], report, len);
191                }
192                report += len + 1;
193        }
194
195        return false;
196}
197
198bool CDocActionOpenWindowHelper::ParseReportData()
199{
200        isParsed = true;
201        if (reportString == NULL) return false;
202
203        bool found = false;
204        char *curScanPos = strstr(reportString, "Report: \1"); 
205        if (curScanPos == NULL) return false;
206        curScanPos += 9;
207
208        while (curScanPos[0] != 0)
209        {
210                if (curScanPos[0] == 0x0A)
211                {
212                        ++curScanPos;
213                        reportDestination_Start = curScanPos;
214                        return true;
215                }
216
217                // search for "=" character (the start of the value follows)
218                int reportAttribute = atoi(curScanPos);
219                curScanPos = strchr(curScanPos,'='); 
220                if (curScanPos == NULL) return found;
221                ++curScanPos;
222
223                // now search for \1, this marks the end of the value
224                const char* pos = strchr(curScanPos,'\1');
225                if (pos == NULL) return found;
226                size_t len = (size_t)(pos - curScanPos);
227
228                const char **start = NULL;
229                const char **end = NULL;
230
231                switch (reportAttribute)
232                {
233                case AR_REPORT_ATTR_TYPE:
234                        start = &reportType_Start;
235                        end = &reportType_End;
236                        break;
237                case AR_REPORT_ATTR_FILENAME:
238                        start = &reportName_Start;
239                        end = &reportName_End;
240                        break;
241                case AR_REPORT_ATTR_LOCATION:
242                        start = &reportLocation_Start;
243                        end = &reportLocation_End;
244                        break;
245                case AR_REPORT_ATTR_CHAR_ENCODING:
246                        start = &charEncoding_Start;
247                        end = &charEncoding_End;
248                        break;
249                case AR_REPORT_ATTR_ENTRYIDS:
250                        start = &entryIds_Start;
251                        end = &entryIds_End;
252                        break;
253                case AR_REPORT_ATTR_QUERY_OVERRIDE:
254                        start = &queryOverride_Start;
255                        end = &queryOverride_End;
256                        break;
257                case AR_REPORT_ATTR_OPERATION:
258                        start = &reportOperation_Start;
259                        end = &reportOperation_End;
260                        break;
261#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
262                case AR_REPORT_ATTR_INLINE_FORM:
263                        start = &inlineForm_Start;
264                        end = &inlineForm_End;
265                        break;
266#endif
267                }
268
269                if (start != NULL && end != NULL)
270                {
271                        *start = curScanPos;
272                        *end = pos;
273                }
274                curScanPos += len + 1;
275        }
276
277        return false;
278}
279
280void CDocActionOpenWindowHelper::CheckAlreadyParsed()
281{
282        if (!isParsed)
283                isValid = ParseReportData();
284}
285
286bool CDocActionOpenWindowHelper::IsValid()
287{
288        CheckAlreadyParsed();
289        return isValid;
290}
291
292string CDocActionOpenWindowHelper::getReportType()
293{
294        CheckAlreadyParsed();
295        if (!isValid) return "";
296
297        return string(reportType_Start, reportType_End);
298}
299
300string CDocActionOpenWindowHelper::getReportLocation()
301{
302        CheckAlreadyParsed();
303        if (!isValid) return "";
304
305        return string(reportLocation_Start, reportLocation_End);
306}
307
308string CDocActionOpenWindowHelper::getReportName()
309{
310        CheckAlreadyParsed();
311        if (!isValid) return "";
312
313        return string(reportName_Start, reportName_End);
314}
315
316string CDocActionOpenWindowHelper::getReportDestination()
317{
318        CheckAlreadyParsed();
319        if (!isValid) return "";
320
321        return reportDestination_Start;
322}
323
324string CDocActionOpenWindowHelper::getEntryIds()
325{
326        CheckAlreadyParsed();
327        if (!isValid) return "";
328
329        return string(entryIds_Start, entryIds_End);
330}
331
332string CDocActionOpenWindowHelper::getQueryOverride()
333{
334        CheckAlreadyParsed();
335        if (!isValid) return "";
336
337        return string(queryOverride_Start, queryOverride_End);
338}
339
340string CDocActionOpenWindowHelper::getReportOperation()
341{
342        CheckAlreadyParsed();
343        if (!isValid) return "";
344
345        return string(reportOperation_Start, reportOperation_End);
346}
347
348string CDocActionOpenWindowHelper::getCharEncoding()
349{
350        CheckAlreadyParsed();
351        if (!isValid) return "";
352
353        return string(charEncoding_Start, charEncoding_End);
354}
355
356string CDocActionOpenWindowHelper::getInlineForm()
357{
358        CheckAlreadyParsed();
359        if (!isValid) return "";
360
361        return string(inlineForm_Start, inlineForm_End);
362}
Note: See TracBrowser for help on using the repository browser.