diff options
Diffstat (limited to 'plugins/helpers/xmlhelpers.cpp')
-rw-r--r-- | plugins/helpers/xmlhelpers.cpp | 418 |
1 files changed, 418 insertions, 0 deletions
diff --git a/plugins/helpers/xmlhelpers.cpp b/plugins/helpers/xmlhelpers.cpp new file mode 100644 index 0000000000..b6d3fa70c8 --- /dev/null +++ b/plugins/helpers/xmlhelpers.cpp @@ -0,0 +1,418 @@ +#include "commonheaders.h"
+#include "gen_helpers.h"
+
+char *XMLEncodeString(TCHAR *tszSrc) {
+
+ int cur, len;
+ TCHAR *tszEsc, *tszRep;
+ char *szRes;
+
+ if (tszSrc == NULL) {
+ return NULL;
+ }
+ tszEsc = _tcsdup(tszSrc);
+ cur = len = 0;
+ while (tszEsc[cur] != _T('\0')) {
+ tszRep = NULL;
+ switch (tszEsc[cur]) {
+ case _T('<'):
+ len = 1;
+ tszRep = _T("<");
+ break;
+ case _T('>'):
+ len = 1;
+ tszRep = _T(">");
+ break;
+ case _T('&'):
+ len = 1;
+ tszRep = _T("&");
+ break;
+ case _T('\''):
+ len = 1;
+ tszRep = _T("'");
+ break;
+ case _T('"'):
+ len = 1;
+ tszRep = _T(""");
+ break;
+ case _T('\r'):
+ if (tszEsc[cur+1] == _T('\n')) {
+ len = 2;
+ tszRep = _T("
");
+ }
+ break;
+ case _T('\n'):
+ len = 1;
+ tszRep = _T("
");
+ break;
+ }
+ // tszRep > len !!!
+ if (tszRep != NULL) {
+ tszEsc = realloc(tszEsc, (_tcslen(tszEsc) + _tcslen(tszRep) - len + 1)*sizeof(TCHAR));
+ MoveMemory(&tszEsc[cur+_tcslen(tszRep) - len], &tszEsc[cur], _tcslen(&tszEsc[cur]) + 1);
+ CopyMemory(&tszEsc[cur], tszRep, _tcslen(tszRep)*sizeof(TCHAR));
+ cur += _tcslen(tszRep);
+ }
+ else {
+ cur++;
+ }
+ }
+#ifdef UNICODE
+ szRes = Utf8EncodeUcs2(tszEsc);
+#else
+ szRes = Utf8Encode(tszEsc);
+#endif
+ free(tszEsc);
+
+ return szRes;
+}
+
+char *XMLEncodeStringA(char *szSrc) {
+
+ int cur, len;
+ char *szEsc, *szRep;
+
+ if (szSrc == NULL) {
+ return NULL;
+ }
+ szEsc = _strdup(szSrc);
+ cur = len = 0;
+ while (szEsc[cur] != '\0') {
+ szRep = NULL;
+ switch (szEsc[cur]) {
+ case '<':
+ len = 1;
+ szRep = "<";
+ break;
+ case '>':
+ len = 1;
+ szRep = ">";
+ break;
+ case '&':
+ len = 1;
+ szRep = "&";
+ break;
+ case '\'':
+ len = 1;
+ szRep = "'";
+ break;
+ case '"':
+ len = 1;
+ szRep = """;
+ break;
+ case '\r':
+ if (szEsc[cur+1] == '\n') {
+ len = 2;
+ szRep = "
";
+ }
+ break;
+ case '\n':
+ len = 1;
+ szRep = "
";
+ break;
+ }
+ if (szRep != NULL) {
+ szEsc = realloc(szEsc, (strlen(szEsc) + strlen(szRep) - len + 1));
+ MoveMemory(&szEsc[cur+strlen(szRep) - len], &szEsc[cur], strlen(&szEsc[cur]) + 1);
+ CopyMemory(&szEsc[cur], szRep, strlen(szRep));
+ cur+=strlen(szRep);
+ }
+ else {
+ cur++;
+ }
+ }
+
+ return szEsc;
+}
+
+TCHAR *DecodeXMLString(char *szSrc) {
+
+ int cur;
+ TCHAR *tszEsc, *tszRep, *tszTrans;
+ char *szEsc;
+#ifdef UNICODE
+ wchar_t *wszEsc;
+#endif
+
+ if (szSrc == NULL) {
+ return NULL;
+ }
+ szEsc = _strdup(szSrc);
+#ifdef UNICODE
+ Utf8Decode(szEsc, &wszEsc);
+ tszEsc = wszEsc;
+ free(szEsc);
+#else
+ Utf8Decode(szEsc, NULL);
+ tszEsc = szEsc;
+#endif
+ cur= 0;
+ while (tszEsc[cur] != _T('\0')) {
+ tszRep = NULL;
+ if (!_tcsncmp(&tszEsc[cur], _T("<"), 4)) {
+ tszRep = _T("<");
+ tszTrans = _T("<");
+ }
+ else if (!_tcsncmp(&tszEsc[cur], _T(">"), 4)) {
+ tszRep = _T(">");
+ tszTrans = _T(">");
+ }
+ else if (!_tcsncmp(&tszEsc[cur], _T("&"), 5)) {
+ tszRep = _T("&");
+ tszTrans = _T("&");
+ }
+ else if (!_tcsncmp(&tszEsc[cur], _T("'"), 6)) {
+ tszRep = _T("'");
+ tszTrans = _T("\'");
+ }
+ else if (!_tcsncmp(&tszEsc[cur], _T("""), 6)) {
+ tszRep = _T(""");
+ tszTrans = _T("&");
+ }
+ else if (!_tcsncmp(&tszEsc[cur], _T("
"), 5)) {
+ tszRep = _T("
");
+ tszTrans = _T("\r\n");
+ }
+ if (tszRep != NULL) {
+ tszEsc = realloc(tszEsc, (_tcslen(tszEsc) - _tcslen(tszRep) + _tcslen(tszTrans) + 1)*sizeof(TCHAR));
+ MoveMemory(&tszEsc[cur+_tcslen(tszTrans)], &tszEsc[cur+_tcslen(tszRep)], _tcslen(&tszEsc[cur+_tcslen(tszRep)]) + 1);
+ CopyMemory(&tszEsc[cur], tszTrans, _tcslen(tszTrans)*sizeof(TCHAR));
+ cur += _tcslen(tszTrans);
+ }
+ else {
+ cur++;
+ }
+ }
+
+ return tszEsc;
+}
+
+char *DecodeXMLStringA(char *szSrc, BOOL bUtfDecode) {
+
+ int cur;
+ char *szEsc, *szRep, *szTrans;
+
+ if (szSrc == NULL) {
+ return NULL;
+ }
+ szEsc = _strdup(szSrc);
+ if (bUtfDecode) {
+ Utf8Decode(szEsc, NULL);
+ }
+ cur= 0;
+ while (szEsc[cur] != '\0') {
+ szRep = NULL;
+ if (!strncmp(&szEsc[cur], "<", 4)) {
+ szRep = "<";
+ szTrans = "<";
+ }
+ else if (!strncmp(&szEsc[cur], ">", 4)) {
+ szRep = ">";
+ szTrans = ">";
+ }
+ else if (!strncmp(&szEsc[cur], "&", 5)) {
+ szRep = "&";
+ szTrans = "&";
+ }
+ else if (!strncmp(&szEsc[cur], "'", 6)) {
+ szRep = "'";
+ szTrans = "'";
+ }
+ else if (!strncmp(&szEsc[cur], """, 6)) {
+ szRep = """;
+ szTrans = "&";
+ }
+ else if (!strncmp(&szEsc[cur], "
", 5)) {
+ szRep = "
";
+ szTrans = "\r\n";
+ }
+ if (szRep != NULL) {
+ szEsc = realloc(szEsc, (strlen(szEsc) - strlen(szRep) + strlen(szTrans) + 1));
+ MoveMemory(&szEsc[cur+strlen(szTrans)], &szEsc[cur+strlen(szRep)], strlen(&szEsc[cur+strlen(szRep)]) + 1);
+ CopyMemory(&szEsc[cur], szTrans, strlen(szTrans));
+ cur += strlen(szTrans);
+ }
+ else {
+ cur++;
+ }
+ }
+
+ return szEsc;
+}
+
+void AppendXMLOpeningTag(char **szBuf, char *szTag, int *depth) {
+
+ char *cur;
+
+ *depth += 1;
+ *szBuf = realloc(*szBuf, strlen(*szBuf) + strlen(szTag) + *depth + 4);
+ cur = *szBuf+strlen(*szBuf);
+ *cur = '\n';
+ if (*depth > 0) {
+ memset(cur+1, ' ', *depth);
+ }
+ *(cur+1+*depth) = '\0';
+ sprintf(*szBuf+strlen(*szBuf), "<%s>", szTag);
+}
+
+void AppendXMLClosingTag(char **szBuf, char *szTag, int *depth) {
+
+ char *cur;
+
+ *depth -= 1;
+ *szBuf = realloc(*szBuf, strlen(*szBuf) + strlen(szTag) + *depth + 5);
+ cur = *szBuf+strlen(*szBuf);
+ *cur = '\n';
+ if (*depth > 0) {
+ memset(cur+1, ' ', *depth);
+ }
+ *(cur+1+*depth) = '\0';
+ sprintf(*szBuf+strlen(*szBuf), "</%s>", szTag);
+}
+
+void AppendXMLTag(char **szBuf, char *szTag, char *szAtts, int *depth) {
+
+ char *cur;
+
+ *depth += 1;
+ if (szAtts != NULL) {
+ *szBuf = realloc(*szBuf, strlen(*szBuf) + strlen(szTag) + strlen(szAtts) + *depth + 6);
+ }
+ else {
+ *szBuf = realloc(*szBuf, strlen(*szBuf) + strlen(szTag) + *depth + 5);
+ }
+ cur = *szBuf+strlen(*szBuf);
+ *cur = '\n';
+ if (*depth > 0) {
+ memset(cur+1, ' ', *depth);
+ }
+ *(cur+1+*depth) = '\0';
+ if (szAtts != NULL) {
+ sprintf(*szBuf+strlen(*szBuf), "<%s %s/>", szTag, szAtts);
+ }
+ else {
+ sprintf(*szBuf+strlen(*szBuf), "<%s/>", szTag);
+ }
+ *depth -= 1;
+}
+
+char *GetSettingType(BYTE type) {
+
+ switch (type) {
+ case DBVT_BYTE:
+ return "BYTE";
+ case DBVT_WORD:
+ return "WORD";
+ case DBVT_DWORD:
+ return "DWORD";
+ case DBVT_ASCIIZ:
+ return "ASCIIZ";
+ case DBVT_BLOB:
+ return "BLOB";
+ case DBVT_UTF8:
+ return "UTF8";
+ case DBVT_WCHAR:
+ return "WCHAR";
+ }
+ return "UNKNOWN";
+}
+
+void AppendXMLTagTString(char **szBuf, char *szTag, TCHAR *tszVal, int *depth) {
+
+ char *szVal, *szAtts, *szType;
+
+ szVal = XMLEncodeString(tszVal);
+#ifdef UNICODE
+ szType = GetSettingType(DBVT_WCHAR);
+#else
+ szType = GetSettingType(DBVT_ASCIIZ);
+#endif
+ szAtts = malloc(strlen(szVal) + strlen(szType) + 17);
+ sprintf(szAtts, "type=\"%s\" value=\"%s\"", szType, szVal);
+ AppendXMLTag(szBuf, szTag, szAtts, depth);
+ free(szAtts);
+ free(szVal);
+}
+
+void AppendXMLTagString(char **szBuf, char *szTag, char *szVal, int *depth) {
+
+ char *szEnc, *szAtts, *szType;
+
+ szEnc = XMLEncodeStringA(szVal);
+ szType = GetSettingType(DBVT_ASCIIZ);
+ szAtts = malloc(strlen(szEnc) + strlen(szType) + 17);
+ sprintf(szAtts, "type=\"%s\" value=\"%s\"", szType, szEnc);
+ AppendXMLTag(szBuf, szTag, szAtts, depth);
+ free(szAtts);
+ free(szEnc);
+}
+
+void AppendXMLTagUtfString(char **szBuf, char *szTag, char *szVal, int *depth) {
+
+ char *szEnc, *szAtts, *szType;
+
+ szEnc = XMLEncodeStringA(szVal);
+ szType = GetSettingType(DBVT_UTF8);
+ szAtts = malloc(strlen(szEnc) + strlen(szType) + 17);
+ sprintf(szAtts, "type=\"%s\" value=\"%s\"", szType, szEnc);
+ AppendXMLTag(szBuf, szTag, szAtts, depth);
+ free(szAtts);
+ free(szEnc);
+}
+
+void AppendXMLTagByte(char **szBuf, char *szTag, BYTE bVal, int *depth) {
+
+ char szVal[64], *szAtts, *szType;
+
+ mir_snprintf(szVal, sizeof(szVal), "0x%x", bVal);
+ szType = GetSettingType(DBVT_BYTE);
+ szAtts = malloc(strlen(szVal) + strlen(szType) + 17);
+ sprintf(szAtts, "type=\"%s\" value=\"%s\"", szType, szVal);
+ AppendXMLTag(szBuf, szTag, szAtts, depth);
+ free(szAtts);
+}
+
+void AppendXMLTagWord(char **szBuf, char *szTag, WORD wVal, int *depth) {
+
+ char szVal[64], *szAtts, *szType;
+
+ mir_snprintf(szVal, sizeof(szVal), "0x%x", wVal);
+ szType = GetSettingType(DBVT_WORD);
+ szAtts = malloc(strlen(szVal) + strlen(szType) + 17);
+ sprintf(szAtts, "type=\"%s\" value=\"%s\"", szType, szVal);
+ AppendXMLTag(szBuf, szTag, szAtts, depth);
+ free(szAtts);
+}
+
+void AppendXMLTagDword(char **szBuf, char *szTag, DWORD dVal, int *depth) {
+
+ char szVal[64], *szAtts, *szType;
+
+ mir_snprintf(szVal, sizeof(szVal), "0x%x", dVal);
+ szType = GetSettingType(DBVT_DWORD);
+ szAtts = malloc(strlen(szVal) + strlen(szType) + 17);
+ sprintf(szAtts, "type=\"%s\" value=\"%s\"", szType, szVal);
+ AppendXMLTag(szBuf, szTag, szAtts, depth);
+ free(szAtts);
+}
+
+void AppendXMLTagBlob(char **szBuf, char *szTag, BYTE *pBlob, int cbBlob, int *depth) {
+
+ int maxLen;
+ char *szType, *szVal, *szAtts;
+ NETLIBBASE64 nlb;
+
+ maxLen = Netlib_GetBase64EncodedBufferSize(cbBlob);
+ szVal = malloc(maxLen + 1);
+ ZeroMemory(&nlb, sizeof(NETLIBBASE64));
+ nlb.cbDecoded = cbBlob;
+ nlb.pbDecoded = pBlob;
+ nlb.cchEncoded = maxLen;
+ nlb.pszEncoded = szVal;
+ CallService(MS_NETLIB_BASE64ENCODE, 0, (LPARAM)&nlb);
+ szType = GetSettingType(DBVT_BLOB);
+ szAtts = malloc(strlen(szVal) + strlen(szType) + 17);
+ sprintf(szAtts, "type=\"%s\" value=\"%s\"", szType, szVal);
+ AppendXMLTag(szBuf, szTag, szAtts, depth);
+ free(szAtts);
+}
|