//============================================================================ // NDataEncoder::Decode : Decode from text. //---------------------------------------------------------------------------- NData NDataEncoder::Decode(const NString &theValue, NDataEncoding theEncoding) { NData theResult; // Decode the string switch (theEncoding) { case kNDataEncodingHex: theResult = Hex_Decode(theValue); break; case kNDataEncodingB64: theResult = B64_Decode(theValue); break; default: NN_LOG("Unknown encoding: %d", theEncoding); break; } return(theResult); }
// Decode from Safe64 UINT DecodeSafe64(void *dst, char *src, UINT src_strlen) { char *tmp; UINT ret; if (dst == NULL || src == NULL) { return 0; } if (src_strlen == 0) { src_strlen = StrLen(src); } tmp = Malloc(src_strlen + 1); Copy(tmp, src, src_strlen); tmp[src_strlen] = 0; Safe64ToBase64(tmp); ret = B64_Decode(dst, tmp, src_strlen); Free(tmp); return ret; }
// Read the text stream bool CfgReadNextTextBUF(BUF *b, FOLDER *current) { char *buf; TOKEN_LIST *token; char *name; char *string; char *data; bool ret; FOLDER *f; // Validate arguments if (b == NULL || current == NULL) { return false; } ret = true; // Read one line buf = CfgReadNextLine(b); if (buf == NULL) { return false; } // Analyze this line token = ParseToken(buf, "\t "); if (token == NULL) { Free(buf); return false; } if (token->NumTokens >= 1) { if (!StrCmpi(token->Token[0], TAG_DECLARE)) { if (token->NumTokens >= 2) { // declare name = CfgUnescape(token->Token[1]); // Create a folder f = CfgCreateFolder(current, name); // Read the next folder while (true) { if (CfgReadNextTextBUF(b, f) == false) { break; } } Free(name); } } if (!StrCmpi(token->Token[0], "}")) { // end ret = false; } if (token->NumTokens >= 3) { name = CfgUnescape(token->Token[1]); data = token->Token[2]; if (!StrCmpi(token->Token[0], TAG_STRING)) { // string wchar_t *uni; UINT uni_size; string = CfgUnescape(data); uni_size = CalcUtf8ToUni(string, StrLen(string)); if (uni_size != 0) { uni = Malloc(uni_size); Utf8ToUni(uni, uni_size, string, StrLen(string)); CfgAddUniStr(current, name, uni); Free(uni); } Free(string); } if (!StrCmpi(token->Token[0], TAG_INT)) { // uint CfgAddInt(current, name, ToInt(data)); } if (!StrCmpi(token->Token[0], TAG_INT64)) { // uint64 CfgAddInt64(current, name, ToInt64(data)); } if (!StrCmpi(token->Token[0], TAG_BOOL)) { // bool bool b = false; if (!StrCmpi(data, TAG_TRUE)) { b = true; } else if (ToInt(data) != 0) { b = true; } CfgAddBool(current, name, b); } if (!StrCmpi(token->Token[0], TAG_BYTE)) { // byte char *unescaped_b64 = CfgUnescape(data); void *tmp = Malloc(StrLen(unescaped_b64) * 4 + 64); int size = B64_Decode(tmp, unescaped_b64, StrLen(unescaped_b64)); CfgAddByte(current, name, tmp, size); Free(tmp); Free(unescaped_b64); } Free(name); } } // Release of the token FreeToken(token); Free(buf); return ret; }