aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/General/gen_crasher/config.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/General/gen_crasher/config.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Plugins/General/gen_crasher/config.cpp')
-rw-r--r--Src/Plugins/General/gen_crasher/config.cpp308
1 files changed, 308 insertions, 0 deletions
diff --git a/Src/Plugins/General/gen_crasher/config.cpp b/Src/Plugins/General/gen_crasher/config.cpp
new file mode 100644
index 00000000..9196bdd1
--- /dev/null
+++ b/Src/Plugins/General/gen_crasher/config.cpp
@@ -0,0 +1,308 @@
+#include <shlwapi.h>
+#include "..\..\..\nu\ns_wc.h"
+#include "config.h"
+#include <strsafe.h>
+
+///////////////////
+///
+/// UNICODE VERSION
+///
+/////
+ConfigW::ConfigW()
+{
+ emptyBOM = FALSE;
+ buff[0] = 0;
+ buffA = NULL;
+ fileName = NULL;
+ defSection = NULL;
+}
+
+ConfigW::ConfigW(const wchar_t *ini, const wchar_t *section)
+{
+ emptyBOM = FALSE;
+ buff[0] = 0;
+ buffA = NULL;
+ fileName = NULL;
+ defSection = NULL;
+ if (SetIniFile(ini)) SetSection(section);
+}
+
+ConfigW::~ConfigW()
+{
+ if (fileName) free(fileName);
+ if (defSection) free(defSection);
+ if (buffA) free(buffA);
+ if (emptyBOM) RemoveEmptyFile();
+}
+
+void ConfigW::Flush(void)
+{
+ return;
+}
+
+BOOL ConfigW::Write(const wchar_t *section, const wchar_t *name, const wchar_t *value)
+{
+ return (fileName) ? WritePrivateProfileString(section, name, value, fileName) : FALSE;
+}
+
+BOOL ConfigW::Write(const wchar_t *section, const wchar_t *name, double value)
+{
+ wchar_t tmp[48] = {0};
+ if (S_OK != StringCchPrintf(tmp, 48, L"%g", value)) return FALSE;
+ return Write(section, name, tmp);
+}
+
+BOOL ConfigW::Write(const wchar_t *section, const wchar_t *name, long long value)
+{
+ wchar_t tmp[32] = {0};
+ if (S_OK != StringCchPrintf(tmp, 32, L"%I64d", value)) return FALSE;
+ return Write(section,name, tmp);
+}
+
+BOOL ConfigW::Write(const wchar_t *section, const wchar_t *name, int value)
+{
+ wchar_t tmp[16] = {0};
+ if (S_OK != StringCchPrintf(tmp, 16, L"%d", value)) return FALSE;
+ return Write(section,name, tmp);
+}
+
+BOOL ConfigW::Write(const wchar_t *section, const wchar_t *name, const char *value)
+{
+ int len = (int)strlen(value) + 1;
+ wchar_t *tmp = (wchar_t*)malloc(len*sizeof(wchar_t));
+ if (!tmp) return FALSE;
+
+ BOOL ret = FALSE;
+ if (MultiByteToWideCharSZ(CP_ACP, 0, value, -1, tmp, len))
+ {
+ ret = Write(section,name, tmp);
+ }
+ free(tmp);
+ return ret;
+}
+
+BOOL ConfigW::Write(const wchar_t *name, int value)
+{
+ if(!defSection) return FALSE;
+ return Write(defSection, name, value);
+}
+
+BOOL ConfigW::Write(const wchar_t *name, long long value)
+{
+ if(!defSection) return FALSE;
+ return Write(defSection, name, value);
+}
+
+BOOL ConfigW::Write(const wchar_t *name, double value)
+{
+ if(!defSection) return FALSE;
+ return Write(defSection, name, value);
+}
+
+BOOL ConfigW::Write(const wchar_t *name, const wchar_t *value)
+{
+ if(!defSection) return FALSE;
+ return Write(defSection, name, value);
+}
+
+BOOL ConfigW::Write(const wchar_t *name, const char value)
+{
+ if(!defSection) return FALSE;
+ return Write(defSection, name, value);
+}
+
+int ConfigW::ReadInt(const wchar_t *section, const wchar_t *name, int defvalue)
+{
+ if (!fileName) return defvalue;
+ return GetPrivateProfileInt(section, name, defvalue, fileName);
+}
+
+long long ConfigW::ReadInt64(const wchar_t *section, const wchar_t *name, long long defvalue)
+{
+ if (!fileName) return defvalue;
+ wchar_t tmp[32] = {0};
+ if (S_OK != StringCchPrintf(tmp, 32, L"%I64d", defvalue)) return defvalue;
+ const wchar_t *ret = ReadStringW(section, name, tmp);
+ return _wtoi64(ret);
+}
+
+double ConfigW::ReadDouble(const wchar_t *section, const wchar_t *name, double defvalue)
+{
+ if (!fileName) return defvalue;
+ wchar_t tmp[32] = {0};
+ if (S_OK != StringCchPrintf(tmp, 32, L"%g", defvalue)) return defvalue;
+ const wchar_t *ret = ReadStringW(section, name, tmp);
+ return _wtof(ret);
+}
+
+const char* ConfigW::ReadStringA(const wchar_t *section, const wchar_t *name, const char *defvalue)
+{
+ if (buffA) free(buffA);
+ if (!fileName) return defvalue;
+
+ int len = (int)strlen(defvalue) + 1;
+ wchar_t *tmp = (wchar_t*)malloc(len *sizeof(wchar_t));
+ if (!tmp) return defvalue;
+
+ if (!MultiByteToWideCharSZ(CP_ACP, 0, defvalue, -1, tmp, len))
+ {
+ free(tmp);
+ return defvalue;
+ }
+ const wchar_t *ret = ReadStringW(section, name, tmp);
+ if (!ret || lstrcmp(ret, tmp) == 0)
+ {
+ free(tmp);
+ return defvalue;
+ }
+ free(tmp);
+
+ len = (int)lstrlen(ret) + 1;
+
+ buffA = (char*)malloc(len*sizeof(char));
+ if (!buffA) return defvalue;
+ if (WideCharToMultiByteSZ(CP_ACP, 0, ret, -1, buffA, len, NULL, NULL))
+ {
+ free(buffA);
+ buffA = NULL;
+ return defvalue;
+ }
+ return buffA;
+}
+
+const wchar_t* ConfigW::ReadStringW(const wchar_t *section, const wchar_t *name, const wchar_t *defvalue)
+{
+ if (!fileName) return defvalue;
+ static wchar_t def[] = L"_$~$_";
+ buff[0] = 0;
+ int len = GetPrivateProfileString(section, name, def, buff, BUFF_SIZE, fileName);
+ if (!len || !lstrcmp(def,buff)) return defvalue;
+ buff[BUFF_SIZE-1]=0;
+ return buff;
+}
+
+int ConfigW::ReadInt(const wchar_t *name, int defvalue)
+{
+ if(!defSection) return defvalue;
+ return ReadInt(defSection, name, defvalue);
+}
+
+long long ConfigW::ReadInt64(const wchar_t *name, long long defvalue)
+{
+ if(!defSection) return defvalue;
+ return ReadInt64(defSection, name, defvalue);
+}
+
+double ConfigW::ReadDouble(const wchar_t *name, double defvalue)
+{
+ if(!defSection) return defvalue;
+ return ReadDouble(defSection, name, defvalue);
+}
+
+const char* ConfigW::ReadStringA(const wchar_t *name, const char *defvalue)
+{
+ if(!defSection) return defvalue;
+ return ReadStringA(defSection, name, defvalue);
+}
+
+const wchar_t* ConfigW::ReadStringW(const wchar_t *name, const wchar_t *defvalue)
+{
+ if(!defSection) return defvalue;
+ return ReadStringW(defSection, name, defvalue);
+}
+
+BOOL ConfigW::SetSection(const wchar_t *section)
+{
+ if (defSection)
+ {
+ free(defSection);
+ defSection = NULL;
+ }
+ size_t len;
+ len = lstrlen(section) + 1;
+ defSection = (wchar_t*)malloc(len*sizeof(wchar_t));
+ if (NULL == defSection)
+ {
+ return FALSE;
+ }
+
+ if (S_OK != StringCchCopy(defSection, len, section))
+ {
+ free(defSection);
+ defSection = NULL;
+ return FALSE;
+ }
+ return TRUE;
+}
+
+BOOL ConfigW::SetIniFile(const wchar_t *file)
+{
+ if (fileName)
+ {
+ if (emptyBOM) RemoveEmptyFile();
+ free(fileName);
+ fileName = NULL;
+ }
+ size_t len;
+ len = lstrlen(file) + 1;
+ fileName = (wchar_t*)malloc(len*sizeof(wchar_t));
+ if (NULL == fileName) return FALSE;
+
+ if (S_OK != StringCchCopy(fileName, len, file))
+ {
+ free(fileName);
+ fileName = NULL;
+ return FALSE;
+ }
+ if (fileName) CreateFileWithBOM();
+ return TRUE;
+}
+
+const wchar_t* ConfigW::GetSection(void)
+{
+ return defSection;
+}
+
+const wchar_t* ConfigW::GetFile(void)
+{
+ return fileName;
+}
+
+void ConfigW::CreateFileWithBOM(void)
+{
+ // benski> this doesn't seem to be working on win9x
+ HANDLE hFile = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (INVALID_HANDLE_VALUE == hFile)
+ {
+ WORD wBOM = 0xFEFF;
+ DWORD num = 0;
+ hFile = CreateFile(fileName, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
+ WriteFile(hFile, &wBOM, sizeof(WORD), &num, NULL);
+ emptyBOM = TRUE;
+ }
+ CloseHandle(hFile);
+}
+
+void ConfigW::RemoveEmptyFile(void)
+{
+ emptyBOM = FALSE;
+ HANDLE hFile = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (INVALID_HANDLE_VALUE == hFile) return;
+ DWORD fsize;
+ fsize = GetFileSize(hFile, NULL);
+ CloseHandle(hFile);
+ if (fsize == 2) DeleteFile(fileName);
+ return;
+}
+
+BOOL ConfigW::IsFileExist(void)
+{
+ HANDLE hFile = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ BOOL exist = (INVALID_HANDLE_VALUE != hFile);
+ if (exist)
+ {
+ exist = (GetFileSize(hFile, NULL) != 2);
+ CloseHandle(hFile);
+ }
+ return exist;
+} \ No newline at end of file