winamp/Src/Plugins/General/gen_crasher/config.cpp
2024-09-24 14:54:57 +02:00

308 lines
7.1 KiB
C++

#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;
}