config.c

Go to the documentation of this file.
00001 // ////////////////////////////////////////////////////////////////////////////
00002 // ////////////////////////////////////////////////////////////////////////////
00014     #define     CONFIG_C
00015 
00016 
00017 // ////////////////////////////////////////////////////////////////////////////
00018 // Includes
00019 // ////////////////////////////////////////////////////////////////////////////
00020 
00021     #include    "config.h"
00022     #include    "webprocess.h"
00023     #include    "xml.h"
00024 
00025 
00026 // ////////////////////////////////////////////////////////////////////////////
00027 // Defines
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     // Don't care about curHTTP.data at this point, so use that for buffer
00059     switch(curHTTP.smPost)
00060     {
00061         // Just started, so try to find the separator string
00062         case SM_FILE_READ_SEPARATOR:
00063 
00064             // See if a CRLF is in the buffer
00065             lenA = TCPFindROMArray(sktHTTP, (ROM BYTE*)"\r\n", 2, 0, FALSE);
00066             if(lenA == 0xffff)
00067             {//if not, ask for more data
00068                 return HTTP_IO_NEED_DATA;
00069             }
00070         
00071             // If so, figure out where the last byte of data is
00072             // Data ends at CRLFseparator--CRLF, so 6+len bytes
00073             curHTTP.byteCount -= lenA + 6;
00074             
00075             // Read past the CRLF
00076             curHTTP.byteCount -= TCPGetArray(sktHTTP, NULL, lenA+2);
00077             
00078             // Save the next state (skip to CRLFCRLF)
00079             curHTTP.smPost = SM_FILE_SKIP_TO_DATA;
00080             
00081             // No break...continue reading the headers if possible
00082                 
00083         // Skip the headers
00084         case SM_FILE_SKIP_TO_DATA:
00085             // Look for the CRLFCRLF
00086             lenA = TCPFindROMArray(sktHTTP, (ROM BYTE*)"\r\n\r\n", 4, 0, FALSE);
00087     
00088             if(lenA != 0xffff)
00089             {
00090                 // Found it, so remove all data up to and including
00091                 lenA = TCPGetArray(sktHTTP, NULL, lenA+4);
00092                 curHTTP.byteCount -= lenA;
00093                 curHTTP.smPost = SM_FILE_PARSE_HEADER;
00094             }
00095             else
00096             {
00097                 // Otherwise, remove as much as possible
00098                 lenA = TCPGetArray(sktHTTP, NULL, TCPIsGetReady(sktHTTP) - 4);
00099                 curHTTP.byteCount -= lenA;
00100             
00101                 // Return the need more data flag
00102                 return HTTP_IO_NEED_DATA;
00103             }
00104             
00105             // No break if we found the header terminator
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                     // Ask for more data
00118                     return HTTP_IO_NEED_DATA;
00119                 }
00120 
00121                 if (eXMLGetState(XML_CONFIG_HANDLE) == XML_ROOT_LEAVED)
00122                 {
00123                     // Root level leaved: file completely processed!
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                         // Fetch Id into value...
00222                         if (bXMLSearchAttribute(XML_CONFIG_HANDLE, (ROM char *)"id", value, EXEC_POSTCONFIG_VALUE_LENGTH) == FALSE)
00223                         {
00224                             // Invalid proto tag (no id given)
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                         // Fetch the given parameters:
00234                         curHTTP.smPost = SM_FILE_PARSE_SRCPPROTO;
00235                         goto ParseSRCPProtoDataLabel;
00236                     }
00237                     else if (bXMLCheckForNode(XML_CONFIG_HANDLE, 1, (ROM char *)"srcpdb"))
00238                     {
00239                         // Fetch Id into value...
00240                         if (bXMLSearchAttribute(XML_CONFIG_HANDLE, (ROM char *)"id", value, EXEC_POSTCONFIG_VALUE_LENGTH) == FALSE)
00241                         {
00242                             // Invalid proto tag (no id given)
00243                             continue;
00244                         }
00245                         
00246                         name[0] = 'A';
00247                         name[1] = 's';
00248                         ProcessSetData(&pu8Workspace[EXEC_POSTCONFIG_NEEDED_SPACE], name, value);
00249 
00250                         // Fetch the given parameters:
00251                         curHTTP.smPost = SM_FILE_PARSE_SRCPDB;
00252                         goto ParseSRCPDBDataLabel;
00253                     }
00254 #endif  // #ifdef _SRCP
00255                 }
00256             }
00257 
00258             // We never should come in here!
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                     // Ask for more data
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                     // Ask for more data
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 }

Generated on Sun Nov 27 20:02:38 2011 for eWicht by  doxygen 1.5.5