00001
00002
00014 #define CONFIG_C
00015
00016
00017
00018
00019
00020
00021 #include "config.h"
00022 #include "webprocess.h"
00023 #include "xml.h"
00024
00025
00026
00027
00028
00029
00030 #define EXEC_POSTCONFIG_NAME_LENGTH (20+1)
00031 #define EXEC_POSTCONFIG_VALUE_LENGTH (32+1)
00032
00033 #define EXEC_POSTCONFIG_NEEDED_SPACE (EXEC_POSTCONFIG_NAME_LENGTH+EXEC_POSTCONFIG_VALUE_LENGTH)
00034
00035
00036 #define SM_FILE_READ_SEPARATOR (0u)
00037 #define SM_FILE_SKIP_TO_DATA (1u)
00038 #define SM_FILE_PARSE_HEADER (2u)
00039 #define SM_FILE_PARSE_XML (3u)
00040 #define SM_FILE_POST_COMPLETE (4u)
00041 #define SM_FILE_PARSE_CONFIG (5u)
00042 #define SM_FILE_PARSE_SRCPPROTO (6u)
00043 #define SM_FILE_PARSE_SRCPDB (7u)
00044
00045
00046
00047
00048
00049 HTTP_IO_RESULT ConfigPostFile(BYTE * pu8Workspace)
00050 {
00051 auto BYTE * name = pu8Workspace;
00052 auto BYTE * value = &name[EXEC_POSTCONFIG_NAME_LENGTH];
00053
00054 WORD lenA, lenB;
00055
00056
00057
00058
00059 switch(curHTTP.smPost)
00060 {
00061
00062 case SM_FILE_READ_SEPARATOR:
00063
00064
00065 lenA = TCPFindROMArray(sktHTTP, (ROM BYTE*)"\r\n", 2, 0, FALSE);
00066 if(lenA == 0xffff)
00067 {
00068 return HTTP_IO_NEED_DATA;
00069 }
00070
00071
00072
00073 curHTTP.byteCount -= lenA + 6;
00074
00075
00076 curHTTP.byteCount -= TCPGetArray(sktHTTP, NULL, lenA+2);
00077
00078
00079 curHTTP.smPost = SM_FILE_SKIP_TO_DATA;
00080
00081
00082
00083
00084 case SM_FILE_SKIP_TO_DATA:
00085
00086 lenA = TCPFindROMArray(sktHTTP, (ROM BYTE*)"\r\n\r\n", 4, 0, FALSE);
00087
00088 if(lenA != 0xffff)
00089 {
00090
00091 lenA = TCPGetArray(sktHTTP, NULL, lenA+4);
00092 curHTTP.byteCount -= lenA;
00093 curHTTP.smPost = SM_FILE_PARSE_HEADER;
00094 }
00095 else
00096 {
00097
00098 lenA = TCPGetArray(sktHTTP, NULL, TCPIsGetReady(sktHTTP) - 4);
00099 curHTTP.byteCount -= lenA;
00100
00101
00102 return HTTP_IO_NEED_DATA;
00103 }
00104
00105
00106 InitXMLProcessor(XML_CONFIG_HANDLE, sktHTTP);
00107
00108
00109 case SM_FILE_PARSE_HEADER:
00110 case SM_FILE_PARSE_CONFIG:
00111 while(1)
00112 {
00113 continueXMLParsingLabel:
00114
00115 if (bXMLWalkTheTree(XML_CONFIG_HANDLE) == FALSE)
00116 {
00117
00118 return HTTP_IO_NEED_DATA;
00119 }
00120
00121 if (eXMLGetState(XML_CONFIG_HANDLE) == XML_ROOT_LEAVED)
00122 {
00123
00124 curHTTP.smPost = SM_FILE_POST_COMPLETE;
00125 return HTTP_IO_DONE;
00126 }
00127 else if (curHTTP.smPost == SM_FILE_PARSE_HEADER)
00128 {
00129 if (bXMLCheckForNode(XML_CONFIG_HANDLE, 0, (ROM char *)"config"))
00130 {
00131 curHTTP.smPost = SM_FILE_PARSE_CONFIG;
00132 }
00133 }
00134 else if (curHTTP.smPost == SM_FILE_PARSE_CONFIG)
00135 {
00136 if (bXMLCheckForNode(XML_CONFIG_HANDLE, 1, (ROM char *)"common"))
00137 {
00138 while (bXMLGetNextAttribute(XML_CONFIG_HANDLE, name, EXEC_POSTCONFIG_NAME_LENGTH, value, EXEC_POSTCONFIG_VALUE_LENGTH) == TRUE)
00139 {
00140 if (strcmppgm2ram(name, (ROM char *)"language") == 0)
00141 {
00142 strcpypgm2ram(name, (ROM char *)"ubg");
00143 }
00144 else if (strcmppgm2ram(name, (ROM char *)"lcdlight") == 0)
00145 {
00146 strcpypgm2ram(name, (ROM char *)"ubi");
00147 }
00148 else if (strcmppgm2ram(name, (ROM char *)"toggle") == 0)
00149 {
00150 strcpypgm2ram(name, (ROM char *)"ubt");
00151 }
00152 else if (strcmppgm2ram(name, (ROM char *)"autoip") == 0)
00153 {
00154 strcpypgm2ram(name, (ROM char *)"ubm");
00155 }
00156 else if (strcmppgm2ram(name, (ROM char *)"ip") == 0)
00157 {
00158 strcpypgm2ram(name, (ROM char *)"p");
00159 }
00160 else if (strcmppgm2ram(name, (ROM char *)"sub") == 0)
00161 {
00162 strcpypgm2ram(name, (ROM char *)"s");
00163 }
00164 else if (strcmppgm2ram(name, (ROM char *)"gate") == 0)
00165 {
00166 strcpypgm2ram(name, (ROM char *)"a");
00167 }
00168 else if (strcmppgm2ram(name, (ROM char *)"server") == 0)
00169 {
00170 strcpypgm2ram(name, (ROM char *)"x");
00171 }
00172 else
00173 {
00174 continue;
00175 }
00176
00177 ProcessCommonData(name, value);
00178 }
00179
00180 strcpypgm2ram(name, (ROM char *)"0");
00181 ProcessCommonData(name, NULL);
00182 }
00183 #ifdef _SRCP
00184 else if (bXMLCheckForNode(XML_CONFIG_HANDLE, 1, (ROM char *)"srcp"))
00185 {
00186 while (bXMLGetNextAttribute(XML_CONFIG_HANDLE, name, EXEC_POSTCONFIG_NAME_LENGTH, value, EXEC_POSTCONFIG_VALUE_LENGTH) == TRUE)
00187 {
00188 if (strcmppgm2ram(name, (ROM char *)"locoprotorequest") == 0)
00189 {
00190 strcpypgm2ram(name, (ROM char *)"ubL");
00191 }
00192 else if (strcmppgm2ram(name, (ROM char *)"accprotorequest") == 0)
00193 {
00194 strcpypgm2ram(name, (ROM char *)"ubA");
00195 }
00196 else if (strcmppgm2ram(name, (ROM char *)"locostandard") == 0)
00197 {
00198 strcpypgm2ram(name, (ROM char *)"ubB");
00199 }
00200 else if (strcmppgm2ram(name, (ROM char *)"accstandard") == 0)
00201 {
00202 strcpypgm2ram(name, (ROM char *)"ubD");
00203 }
00204 else if (strcmppgm2ram(name, (ROM char *)"accdelay") == 0)
00205 {
00206 strcpypgm2ram(name, (ROM char *)"dV");
00207 }
00208 else
00209 {
00210 continue;
00211 }
00212
00213 ProcessSRCPData(name, value);
00214 }
00215
00216 strcpypgm2ram(name, (ROM char *)"0");
00217 ProcessSRCPData(name, NULL);
00218 }
00219 else if (bXMLCheckForNode(XML_CONFIG_HANDLE, 1, (ROM char *)"srcpproto"))
00220 {
00221
00222 if (bXMLSearchAttribute(XML_CONFIG_HANDLE, (ROM char *)"id", value, EXEC_POSTCONFIG_VALUE_LENGTH) == FALSE)
00223 {
00224
00225 continue;
00226 }
00227
00228 name[0] = 'A';
00229 ProcessProtoData(&pu8Workspace[EXEC_POSTCONFIG_NEEDED_SPACE], name, value);
00230 name[0] = 'c';
00231 ProcessProtoData(&pu8Workspace[EXEC_POSTCONFIG_NEEDED_SPACE], name, NULL);
00232
00233
00234 curHTTP.smPost = SM_FILE_PARSE_SRCPPROTO;
00235 goto ParseSRCPProtoDataLabel;
00236 }
00237 else if (bXMLCheckForNode(XML_CONFIG_HANDLE, 1, (ROM char *)"srcpdb"))
00238 {
00239
00240 if (bXMLSearchAttribute(XML_CONFIG_HANDLE, (ROM char *)"id", value, EXEC_POSTCONFIG_VALUE_LENGTH) == FALSE)
00241 {
00242
00243 continue;
00244 }
00245
00246 name[0] = 'A';
00247 name[1] = 's';
00248 ProcessSetData(&pu8Workspace[EXEC_POSTCONFIG_NEEDED_SPACE], name, value);
00249
00250
00251 curHTTP.smPost = SM_FILE_PARSE_SRCPDB;
00252 goto ParseSRCPDBDataLabel;
00253 }
00254 #endif // #ifdef _SRCP
00255 }
00256 }
00257
00258
00259 break;
00260
00261
00262 #ifdef _SRCP
00263 case SM_FILE_PARSE_SRCPDB:
00264 ParseSRCPDBDataLabel:
00265
00266 while(1)
00267 {
00268 if (bXMLWalkTheTree(XML_CONFIG_HANDLE) == FALSE)
00269 {
00270
00271 return HTTP_IO_NEED_DATA;
00272 }
00273
00274 if (eXMLGetState(XML_CONFIG_HANDLE) == XML_LEVEL_LEAVED)
00275 {
00276 name[0] = 'E';
00277 ProcessSetData(&pu8Workspace[EXEC_POSTCONFIG_NEEDED_SPACE], name, NULL);
00278 curHTTP.smPost = SM_FILE_PARSE_CONFIG;
00279 goto continueXMLParsingLabel;
00280 }
00281
00282 if (bXMLCheckForNode(XML_CONFIG_HANDLE, 2, (ROM char *)"data"))
00283 {
00284 while (bXMLGetNextAttribute(XML_CONFIG_HANDLE, name, EXEC_POSTCONFIG_NAME_LENGTH, value, EXEC_POSTCONFIG_VALUE_LENGTH) == TRUE)
00285 {
00286 if (strcmppgm2ram(name, (ROM char *)"name") == 0)
00287 {
00288 name[0] = 'n';
00289 }
00290 else if (strcmppgm2ram(name, (ROM char *)"bus") == 0)
00291 {
00292 strcpypgm2ram(name, (ROM char *)"ubb");
00293 }
00294 else if (strcmppgm2ram(name, (ROM char *)"proto") == 0)
00295 {
00296 name[0] = 'p';
00297 }
00298 else if (strcmppgm2ram(name, (ROM char *)"add") == 0)
00299 {
00300 strcpypgm2ram(name, (ROM char *)"usm");
00301 }
00302 else if (strcmppgm2ram(name, (ROM char *)"maxspeed") == 0)
00303 {
00304 strcpypgm2ram(name, (ROM char *)"ush");
00305 }
00306 else if (strcmppgm2ram(name, (ROM char *)"steps") == 0)
00307 {
00308 strcpypgm2ram(name, (ROM char *)"ubs");
00309 }
00310 else if (strcmppgm2ram(name, (ROM char *)"funcs") == 0)
00311 {
00312 strcpypgm2ram(name, (ROM char *)"ubf");
00313 }
00314 else if (strcmppgm2ram(name, (ROM char *)"minport") == 0)
00315 {
00316 strcpypgm2ram(name, (ROM char *)"ubq");
00317 }
00318 else if (strcmppgm2ram(name, (ROM char *)"maxport") == 0)
00319 {
00320 strcpypgm2ram(name, (ROM char *)"ubr");
00321 }
00322 else if (strcmppgm2ram(name, (ROM char *)"togglemask") == 0)
00323 {
00324 strcpypgm2ram(name, (ROM char *)"uF");
00325 }
00326 else if (strcmppgm2ram(name, (ROM char *)"delay") == 0)
00327 {
00328 strcpypgm2ram(name, (ROM char *)"dd");
00329 }
00330 else
00331 {
00332 continue;
00333 }
00334
00335 ProcessSetData(&pu8Workspace[EXEC_POSTCONFIG_NEEDED_SPACE], name, value);
00336 }
00337 }
00338 }
00339 break;
00340
00341 case SM_FILE_PARSE_SRCPPROTO:
00342 ParseSRCPProtoDataLabel:
00343
00344 while(1)
00345 {
00346 if (bXMLWalkTheTree(XML_CONFIG_HANDLE) == FALSE)
00347 {
00348
00349 return HTTP_IO_NEED_DATA;
00350 }
00351
00352 if (eXMLGetState(XML_CONFIG_HANDLE) == XML_LEVEL_LEAVED)
00353 {
00354 name[0] = 'E';
00355 ProcessProtoData(&pu8Workspace[EXEC_POSTCONFIG_NEEDED_SPACE], name, NULL);
00356 curHTTP.smPost = SM_FILE_PARSE_CONFIG;
00357 goto continueXMLParsingLabel;
00358 }
00359
00360 if (bXMLCheckForNode(XML_CONFIG_HANDLE, 2, (ROM char *)"data"))
00361 {
00362 while (bXMLGetNextAttribute(XML_CONFIG_HANDLE, name, EXEC_POSTCONFIG_NAME_LENGTH, value, EXEC_POSTCONFIG_VALUE_LENGTH) == TRUE)
00363 {
00364 if (strcmppgm2ram(name, (ROM char *)"name") == 0)
00365 {
00366 name[0] = 'n';
00367 }
00368 else if (strcmppgm2ram(name, (ROM char *)"bus") == 0)
00369 {
00370 strcpypgm2ram(name, (ROM char *)"ubb");
00371 }
00372 else if (strcmppgm2ram(name, (ROM char *)"proto") == 0)
00373 {
00374 name[0] = 'p';
00375 }
00376 else if (strcmppgm2ram(name, (ROM char *)"minadd") == 0)
00377 {
00378 strcpypgm2ram(name, (ROM char *)"usm");
00379 }
00380 else if (strcmppgm2ram(name, (ROM char *)"maxadd") == 0)
00381 {
00382 strcpypgm2ram(name, (ROM char *)"usx");
00383 }
00384 else if (strcmppgm2ram(name, (ROM char *)"steps") == 0)
00385 {
00386 strcpypgm2ram(name, (ROM char *)"ubs");
00387 }
00388 else if (strcmppgm2ram(name, (ROM char *)"funcs") == 0)
00389 {
00390 strcpypgm2ram(name, (ROM char *)"ubf");
00391 }
00392 else if (strcmppgm2ram(name, (ROM char *)"minport") == 0)
00393 {
00394 strcpypgm2ram(name, (ROM char *)"ubq");
00395 }
00396 else if (strcmppgm2ram(name, (ROM char *)"maxport") == 0)
00397 {
00398 strcpypgm2ram(name, (ROM char *)"ubr");
00399 }
00400 else
00401 {
00402 continue;
00403 }
00404
00405 ProcessProtoData(&pu8Workspace[EXEC_POSTCONFIG_NEEDED_SPACE], name, value);
00406 }
00407 }
00408 }
00409 break;
00410 #endif // #ifdef _SRCP
00411
00412 }
00413
00414 return HTTP_IO_DONE;
00415 }