diff options
author | Christian Gromm <christian.gromm@microchip.com> | 2016-12-08 13:51:04 +0100 |
---|---|---|
committer | Christian Gromm <christian.gromm@microchip.com> | 2016-12-08 13:51:04 +0100 |
commit | 8c5f2324d7aa61669324aec1a0ad091fe1379489 (patch) | |
tree | 29cbdcdbe3657e1400d596ec3d560a2573d80817 /Src/ScriptXml.cpp | |
parent | e89ba11bd9111f02a940f227cf979f1947e975ac (diff) |
src: unicens: import sources
This patch adds the source tree of the NetworkManager v3.0.4.
Additionally, it provides the needed configuration scripts.
Change-Id: I23778b51423b51a4f87741957e0fb208bceb79b3
Signed-off-by: Christian Gromm <christian.gromm@microchip.com>
Diffstat (limited to 'Src/ScriptXml.cpp')
-rw-r--r-- | Src/ScriptXml.cpp | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/Src/ScriptXml.cpp b/Src/ScriptXml.cpp new file mode 100644 index 0000000..94c7ae3 --- /dev/null +++ b/Src/ScriptXml.cpp @@ -0,0 +1,200 @@ +/* + * Video On Demand Samples + * + * Copyright (C) 2015 Microchip Technology Germany II GmbH & Co. KG + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * You may also obtain this software under a propriety license from Microchip. + * Please contact Microchip for further information. + * + */ + +#include "SafeVector.h" +#include "Console.h" +#include "ScriptXml.h" + +#define TAG_SCRIPT ((xmlChar *)"script") +#define TAG_ACTION ((xmlChar *)"action") +#define TAG_NAME ((xmlChar *)"name") +#define TAG_TYPE ((xmlChar *)"type") +#define TAG_FBLOCK_ID_HEX ((xmlChar *)"fblock_id_hex") +#define TAG_FUNCTION_ID_HEX ((xmlChar *)"function_id_hex") +#define TAG_OP_TYPE_REQUEST_HEX ((xmlChar *)"op_type_request_hex") +#define TAG_OP_TYPE_RESPONSE_HEX ((xmlChar *)"op_type_response_hex") +#define TAG_PAYLOAD_HEX ((xmlChar *)"payload_hex") +#define TAG_PAUSE_MS ((xmlChar *)"pause_ms") + +#define VAL_SEND_MCM ((char*)"SEND_MCM") +#define VAL_PAUSE ((char*)"PAUSE") + +#define XML_STRCMP(x,y) (strcmp(reinterpret_cast< const char* >(x), reinterpret_cast< const char* >(y)) == 0) + +CSciptXml::CSciptXml( const char *szFile ) : CXml( szFile ) +{ + +} + +CSciptXml::CSciptXml( const char *szBuffer, uint32_t nBufferLen ) : CXml( szBuffer, nBufferLen ) +{ + +} + +bool CSciptXml::GetScripts( CSafeVector<CScript *> &allChannels ) +{ + xmlChar szTmp[XML_DEFAULT_VALUE_LEN]; + bool success = false; + CXml Xml( *( ( CXml * )this ) ); + success = Xml.SetToTopNode(); + + while( success && Xml.FindNode( TAG_ACTION ) ) + { + ConsolePrintf( PRIO_LOW, BLUE"--NEW ACTION--"RESETCOLOR"\n" ); + CScript *script = new CScript(); + if( NULL == script ) + break; + + szTmp[0] = '\0'; + success &= Xml.GetChildValue( TAG_NAME, szTmp, XML_DEFAULT_VALUE_LEN ); + if( success ) + { + ConsolePrintf( PRIO_LOW, BLUE"Name: '%s'"RESETCOLOR"\n", szTmp ); + int nameLen = sizeof( xmlChar ) * ( xmlStrlen( szTmp ) + 1 ); + if( nameLen >= MAX_SCRIPT_NAME_LENGTH ) + nameLen = MAX_SCRIPT_NAME_LENGTH - 1; + memcpy( script->scriptName, szTmp, nameLen ); + script->scriptName[nameLen] = '\0'; //Terminate string in any case + } + + szTmp[0] = '\0'; + success &= Xml.GetChildValue( TAG_TYPE, szTmp ); + if( success ) + { + ConsolePrintf( PRIO_LOW, BLUE"Type: %s"RESETCOLOR"\n", szTmp ); + if( XML_STRCMP(szTmp, VAL_SEND_MCM) ) + { + script->scriptType = SCRIPT_MCM_SEND; + } + else if( XML_STRCMP(szTmp, VAL_PAUSE) ) + { + script->scriptType = SCRIPT_PAUSE; + } + else + { + //Be tolerant to new types + ConsolePrintf( PRIO_ERROR, YELLOW"CSciptXml: Ignoring unknown TYPE:'%s'"RESETCOLOR"\n", szTmp ); + delete script; + Xml.FindNextNode(); + continue; + } + } + + if( SCRIPT_MCM_SEND == script->scriptType ) + { + szTmp[0] = '\0'; + success &= Xml.GetChildValue( TAG_FBLOCK_ID_HEX, szTmp, XML_DEFAULT_VALUE_LEN ); + if( success ) + { + script->fblockId = ConvertToInt( szTmp ); + ConsolePrintf( PRIO_LOW, BLUE"FBlock-ID: '%s=%d'"RESETCOLOR"\n", szTmp, script->fblockId ); + } + + szTmp[0] = '\0'; + success &= Xml.GetChildValue( TAG_FUNCTION_ID_HEX, szTmp, XML_DEFAULT_VALUE_LEN ); + if( success ) + { + script->functionId = ConvertToInt( szTmp ); + ConsolePrintf( PRIO_LOW, BLUE"Function-ID: '%s=%d'"RESETCOLOR"\n", szTmp, script->functionId ); + } + + szTmp[0] = '\0'; + success &= Xml.GetChildValue( TAG_OP_TYPE_REQUEST_HEX, szTmp, + XML_DEFAULT_VALUE_LEN ); + if( success ) + { + script->opTypeRequest = ConvertToInt( szTmp ); + ConsolePrintf( PRIO_LOW, BLUE"OP-Type Request: '%s=%d'"RESETCOLOR"\n", szTmp, script->opTypeRequest ); + } + + szTmp[0] = '\0'; + if( Xml.GetChildValue( TAG_OP_TYPE_RESPONSE_HEX, szTmp, + XML_DEFAULT_VALUE_LEN ) ) + { + script->opTypeResponse = ConvertToInt( szTmp ); + ConsolePrintf( PRIO_LOW, BLUE"OP-Type Response: '%s=%d'"RESETCOLOR"\n", szTmp, + script->opTypeResponse ); + } + else + { + script->opTypeResponse = 0xFF; + ConsolePrintf( PRIO_LOW, BLUE"OP-Type Response was not defined"RESETCOLOR"\n" ); + } + + szTmp[0] = '\0'; + //Payload is optional + if( Xml.GetChildValue( TAG_PAYLOAD_HEX, szTmp, XML_DEFAULT_VALUE_LEN ) ) + { + ConsolePrintf( PRIO_LOW, BLUE"Payload: '%s'"RESETCOLOR"\n", szTmp ); + StorePayload( szTmp, script ); + } + } + else if( SCRIPT_PAUSE == script->scriptType ) + { + szTmp[0] = '\0'; + success &= Xml.GetChildValue( TAG_PAUSE_MS, szTmp, XML_DEFAULT_VALUE_LEN ); + if( success ) + { + script->pauseInMillis = strtol( ( char * )szTmp, NULL, 10 ); + ConsolePrintf( PRIO_LOW, BLUE"FBlock-ID: '%s=%d'"RESETCOLOR"\n", szTmp, script->fblockId ); + } + } + if( success ) + { + allChannels.PushBack( script ); + } + else + { + delete script; + } + Xml.FindNextNode(); + } + return success; +} + +void CSciptXml::StorePayload( xmlChar *xString, CScript *script ) +{ + char *cString = ( char * )xString; //Convertion may be needed.. + script->payloadLength = 0; + for( uint32_t i = 0; i < strlen( cString ); i++ ) + { + if( cString[i] >= 65 && cString[i] <= 90 ) + { + //convert upper case to lower case + cString[i] += 32; + } + } + char *tkPtr; + char *token = strtok_r( cString, " ,.-", &tkPtr ); + while( NULL != token ) + { + if( script->payloadLength >= MAX_PAYLOAD_LENGTH ) + { + ConsolePrintf( PRIO_ERROR, + "CSciptXml::ConvertToByteArray, MAX_PAYLOAD_LENGTH is defined too low. Please increase value!" ); + break; + } + script->payload[script->payloadLength++] = strtol( token, NULL, 16 ); + token = strtok_r( NULL, " ,.-", &tkPtr ); + } +} |