source: branches/work_304/doc/DocActionOpenWindowHelper.cpp @ 300

Revision 300, 5.4 KB checked in by jls17, 7 years ago (diff)
  • fixed a build error and a few crashes when program was build using VS2010
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(/*CARActiveLink &arALObject, AROpenDlgStruct& oWndStruct, string& ifElse, int numAction*/)
21{
22}
23
24CDocActionOpenWindowHelper::~CDocActionOpenWindowHelper()
25{
26}
27
28bool CDocActionOpenWindowHelper::GetSampleData(CARActiveLink& actLink, IfElseState ifElse, int nAction, string &server, string &schema)
29{
30        // ok, this is a very ugly design of the ARS api. The sample data of
31        // the action is stored within the object properties of the active-
32        // link. that wouldnt be that bad if we just need to read the data
33        // from there, but the data is something like an API structure and
34        // there is no ARDecode*** function. So we need to implement our
35        // own decode routine.
36
37        const ARPropList &propList = actLink.GetPropList();
38
39        // first, decide which property we are looking for
40        unsigned int PropID = AR_OPROP_WINDOW_OPEN_IF_SAMPLE_SERVER_SCHEMA;
41        if (ifElse != IES_IF)
42                PropID = AR_OPROP_WINDOW_OPEN_ELSE_SAMPLE_SERVER_SCHEMA;
43
44        // now find the index of the object property
45        int propIndex = -1;
46        for (unsigned int k=0; k < propList.numItems; ++k)
47        {
48                if (propList.props[k].prop == PropID)
49                {
50                        propIndex = k;
51                        break;
52                }
53        }
54
55        if (propIndex > -1 && propList.props[propIndex].value.dataType == AR_DATA_TYPE_CHAR)
56        {
57                // the property is found and has correct data type
58                char* propData = propList.props[propIndex].value.u.charVal;
59                unsigned int chrIndex = 0;      // this holds the current position within propData
60               
61                int listCount = atoi(propData); // retrieve lists item count
62                while (propData[chrIndex] != '\\' && propData[chrIndex] != 0) ++chrIndex;
63                if (listCount > 0 && propData[chrIndex] != 0)
64                {
65                        ++chrIndex; // skip last "\"
66                        // now we need to check each entry of the list against this actions index
67                        for (int listIndex = 0; listIndex < listCount; ++listIndex)
68                        {
69                                int propActionIndex = atoi(&propData[chrIndex]);
70                                while (propData[chrIndex] != '\\' && propData[chrIndex] != 0) ++chrIndex;
71                                if (propData[chrIndex] == '\\') ++chrIndex;
72
73                                if (propActionIndex == nAction && propData[chrIndex] != 0)
74                                {
75                                        // match! whoooohooo!
76                                        unsigned int strStart = chrIndex;
77                                        while (propData[chrIndex] != '\\' && propData[chrIndex] != 0) ++chrIndex;
78                                        if (propData[chrIndex] == 0) break;
79
80                                        unsigned int strLen = chrIndex - strStart;
81                                        server.resize(strLen);
82                                        strncpy(&server[0], &propData[strStart], chrIndex - strStart);
83
84                                        ++chrIndex; // skip last "\"
85                                        strStart = chrIndex;
86                                        while (propData[chrIndex] != '\\' && propData[chrIndex] != 0) ++chrIndex;
87                                        //if (propData[chrIndex] == 0) break;
88
89                                        strLen = chrIndex - strStart;
90                                        schema.resize(strLen);
91                                        strncpy(&schema[0], &propData[strStart], chrIndex - strStart);
92                                        return true;    // we are done
93                                }
94
95                                // skip next two data entries now
96                                for (int tmpDataCount = 0; tmpDataCount < 2; ++tmpDataCount)
97                                {
98                                        while(propData[chrIndex] != '\\' && propData[chrIndex] != 0) ++chrIndex;
99                                        if (propData[chrIndex] == 0) break;
100                                        ++chrIndex; // skip last "\"
101                                }
102                                if (propData[chrIndex] == 0) break;
103                        }
104                }
105        }
106        return false;
107}
108
109bool 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)
110{
111        if (reportStr == NULL) return false;
112
113        bool found = false;
114        char *report = strstr(reportStr, "Report: \1"); 
115        if (report == NULL) return false;
116        report += 9;
117
118        while (report[0] != 0)
119        {
120                if (report[0] == 0x0A)
121                {
122                        ++report;
123                        reportDestination = report;
124                        return true;
125                }
126
127                int i = atoi(report);
128                report = strchr(report,'='); 
129                if (report == NULL) return found;
130                ++report;
131
132                string *value = NULL;
133                switch (i)
134                {
135                case AR_REPORT_ATTR_TYPE:
136                        value = &reportType;
137                        break;
138                case AR_REPORT_ATTR_FILENAME:
139                        value = &reportName;
140                        break;
141                case AR_REPORT_ATTR_LOCATION:
142                        value = &reportLocation;
143                        break;
144                case AR_REPORT_ATTR_CHAR_ENCODING:
145                        value = &charEncoding;
146                        break;
147                case AR_REPORT_ATTR_ENTRYIDS:
148                        value = &entryIDs;
149                        break;
150                case AR_REPORT_ATTR_QUERY_OVERRIDE:
151                        value = &queryOverride;
152                        break;
153                case AR_REPORT_ATTR_OPERATION:
154                        value = &reportOperation;
155                        break;
156                }
157
158                const char* pos = strchr(report,'\1');
159                if (pos == NULL) return found;
160                size_t len = (size_t)(pos - report);
161
162                if (value != NULL)
163                {
164                        value->resize(len);
165                        if (len > 0) strncpy(&(*value)[0], report, len);
166                }
167                report += len + 1;
168        }
169
170        return false;
171}
Note: See TracBrowser for help on using the repository browser.