diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/Library/ml_online/config.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/Plugins/Library/ml_online/config.cpp')
-rw-r--r-- | Src/Plugins/Library/ml_online/config.cpp | 304 |
1 files changed, 304 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_online/config.cpp b/Src/Plugins/Library/ml_online/config.cpp new file mode 100644 index 00000000..c6e87cb2 --- /dev/null +++ b/Src/Plugins/Library/ml_online/config.cpp @@ -0,0 +1,304 @@ +#include "main.h" +#include "./config.h" +#include "./api__ml_online.h" + +#include <shlwapi.h> +#include <strsafe.h> + +#define CONFIG_SUFFIX L"Plugins\\ml" +#define CONFIG_SECTION "ml_online_config" + +void C_Config::Flush(void) +{ +#ifndef C_CONFIG_WIN32NATIVE + if (!m_dirty) return; + FILE *fp=fopen(m_inifile,"wt"); + if (!fp) return; + + fprintf(fp,"[ml_online_config]\n"); + int x; + if (m_strs) + { + for (x = 0; x < m_num_strs; x ++) + { + char name[17] = {0}; + memcpy(name,m_strs[x].name,16); + name[16]=0; + if (m_strs[x].value) fprintf(fp,"%s=%s\n",name,m_strs[x].value); + } + } + fclose(fp); + m_dirty=0; +#endif +} + +C_Config::~C_Config() +{ +#ifndef C_CONFIG_WIN32NATIVE + int x; + Flush(); + if (m_strs) for (x = 0; x < m_num_strs; x ++) free(m_strs[x].value); + free(m_strs); +#endif + + Plugin_FreeAnsiString(m_inifile); +} + +C_Config::C_Config(char *ini) +{ + memset(m_strbuf,0,sizeof(m_strbuf)); + m_inifile= Plugin_CopyAnsiString(ini); + +#ifndef C_CONFIG_WIN32NATIVE + m_dirty=0; + m_strs=NULL; + m_num_strs=m_num_strs_alloc=0; + + // read config + FILE *fp=fopen(m_inifile,"rt"); + if (!fp) return; + + for (;;) + { + char buf[4096] = {0}; + fgets(buf,sizeof(buf),fp); + if (!buf[0] || feof(fp)) break; + for (;;) + { + int l=strlen(buf); + if (l > 0 && (buf[l-1] == '\n' || buf[l-1] == '\r')) buf[l-1]=0; + else break; + } + if (buf[0] != '[') + { + char *p=strstr(buf,"="); + if (p) + { + *p++=0; + WriteString(buf,p); + } + } + } + m_dirty=0; + fclose(fp); +#endif +} + +void C_Config::WriteInt(char *name, int value) +{ + char buf[32] = {0}; + StringCchPrintfA(buf, ARRAYSIZE(buf), "%d",value); + WriteString(name,buf); +} + +int C_Config::ReadInt(char *name, int defvalue) +{ +#ifndef C_CONFIG_WIN32NATIVE + char *t=ReadString(name,""); + if (*t) return atoi(t); + return defvalue; +#else + return GetPrivateProfileIntA("ml_online_config",name,defvalue,m_inifile); +#endif +} + +char *C_Config::WriteString(char *name, char *string) +{ +#ifndef C_CONFIG_WIN32NATIVE + m_dirty=1; + for (int x = 0; x < m_num_strs; x ++) + { + if (m_strs[x].value && !strncmp(name,m_strs[x].name,16)) + { + unsigned int l=(strlen(m_strs[x].value)+16)&~15; + if (strlen(string)<l) + { + strcpy(m_strs[x].value,string); + } + else + { + free(m_strs[x].value); + m_strs[x].value = (char *)malloc((strlen(string)+16)&~15); + strcpy(m_strs[x].value,string); + } + return m_strs[x].value; + } + } + + // not already in there + if (m_num_strs >= m_num_strs_alloc || !m_strs) + { + m_old_num_strs_alloc = m_num_strs_alloc; + m_num_strs_alloc=m_num_strs*3/2+8; + strType *data = (strType*)::realloc(m_strs, sizeof(strType) * m_num_strs_alloc); + if (data) + { + m_strs = data; + } + else + { + data = (strType*)::malloc(sizeof(strType) * m_num_strs_alloc); + if (data) + { + memcpy(data, m_strs, sizeof(strType) * m_old_num_strs_alloc); + free(m_strs); + m_strs = data; + } + else m_num_strs_alloc = m_old_num_strs_alloc; + } + } + strncpy(m_strs[m_num_strs].name,name,16); + m_strs[m_num_strs].value = (char *)malloc((strlen(string)+16)&~15); + if (m_strs[m_num_strs].value) + { + strcpy(m_strs[m_num_strs].value,string); + return m_strs[m_num_strs++].value; + } + return ""; +#else + WritePrivateProfileStringA("ml_online_config",name,string,m_inifile); + return name; +#endif +} + +char *C_Config::ReadString( char *name, char *defstr ) +{ +#ifndef C_CONFIG_WIN32NATIVE + int x; + for ( x = 0; x < m_num_strs; x++ ) + { + if ( m_strs[ x ].value && !::strncmp( name, m_strs[ x ].name, 16 ) ) + { + return m_strs[ x ].value; + } + } + return defstr; +#else + static char foobuf[] = "___________ml_online_lameness___________"; + m_strbuf[ 0 ] = 0; + GetPrivateProfileStringA( "ml_online_config", name, foobuf, m_strbuf, sizeof( m_strbuf ), m_inifile ); + if ( !strcmp( foobuf, m_strbuf ) || !strcmp( m_strbuf, "" ) ) + { + return defstr; + } + + m_strbuf[ sizeof( m_strbuf ) - 1 ] = 0; + return m_strbuf; +#endif +} + +static LPCSTR Config_GetPath() +{ + static LPSTR configPath = NULL; + if (NULL == configPath) + { + LPCWSTR p = (NULL != WASABI_API_APP) ? WASABI_API_APP->path_getUserSettingsPath() : NULL; + if (NULL != p) + { + WCHAR szBuffer[MAX_PATH * 2] = {0}; + if (0 != PathCombine(szBuffer, p, CONFIG_SUFFIX)) + { + OMUTILITY->EnsurePathExist(szBuffer); + PathAppend(szBuffer, L"ml_online.ini"); + configPath = Plugin_WideCharToMultiByte(CP_UTF8, 0, szBuffer, -1, NULL, NULL); + } + } + } + + return configPath; +} + +DWORD Config_ReadStr(LPCSTR lpSectionName, LPCSTR lpKeyName, LPCSTR lpDefault, LPSTR lpReturnedString, DWORD nSize) +{ + if (NULL == lpSectionName) lpSectionName = CONFIG_SECTION; + return GetPrivateProfileStringA(lpSectionName, lpKeyName, lpDefault, lpReturnedString, nSize, Config_GetPath()); +} + +UINT Config_ReadInt(LPCSTR lpSectionName, LPCSTR lpKeyName, INT nDefault) +{ + if (NULL == lpSectionName) lpSectionName = CONFIG_SECTION; + return GetPrivateProfileIntA(lpSectionName, lpKeyName, nDefault, Config_GetPath()); +} + +HRESULT Config_WriteStr(LPCSTR lpSectionName, LPCSTR lpKeyName, LPCSTR lpString) +{ + LPCSTR configPath = Config_GetPath(); + if (NULL == configPath || '\0' == *configPath) + return E_UNEXPECTED; + + if (NULL == lpSectionName) lpSectionName = CONFIG_SECTION; + if (0 != WritePrivateProfileStringA(lpSectionName, lpKeyName, lpString, configPath)) + return S_OK; + + DWORD errorCode = GetLastError(); + return HRESULT_FROM_WIN32(errorCode); +} + +HRESULT Config_WriteInt(LPCSTR lpSectionName, LPCSTR lpKeyName, INT nValue) +{ + char szBuffer[32] = {0}; + HRESULT hr = StringCchPrintfA(szBuffer, ARRAYSIZE(szBuffer), "%d", nValue); + if (FAILED(hr)) return hr; + + if (NULL == lpSectionName) lpSectionName = CONFIG_SECTION; + return Config_WriteStr(lpSectionName, lpKeyName, szBuffer); +} + +HRESULT Config_WriteSection(LPCSTR lpSectionName, LPCSTR lpData) +{ + LPCSTR configPath = Config_GetPath(); + if (NULL == configPath || '\0' == *configPath) + return E_UNEXPECTED; + + if (NULL == lpSectionName) lpSectionName = CONFIG_SECTION; + if (0 == WritePrivateProfileSectionA(lpSectionName, lpData, configPath)) + return S_OK; + + DWORD errorCode = GetLastError(); + return HRESULT_FROM_WIN32(errorCode); +} + +HRESULT Config_ReadServiceIdList(LPCSTR lpSectionName, LPCSTR lpKeyName, CHAR separator, ReadServiceIdCallback callback, void *data) +{ + if (NULL == callback) + return E_INVALIDARG; + + DWORD bufferSize = 16384; + LPSTR buffer = Plugin_MallocAnsiString(bufferSize); + if (NULL == buffer) return E_OUTOFMEMORY; + + DWORD bufferLen = Config_ReadStr(lpSectionName, lpKeyName, NULL, buffer, bufferSize); + if (0 != bufferLen) + { + LPSTR cursor = buffer; + LPSTR block = cursor; + UINT serviceId; + for(;;) + { + if (separator == *cursor || '\0' == *cursor) + { + while (' ' == *block && block < cursor) block++; + + if (block < cursor && + FALSE != StrToIntExA(block, STIF_SUPPORT_HEX, (INT*)&serviceId) && + 0 != serviceId) + { + + if (FALSE == callback(serviceId, data)) + break; + } + + if ('\0' == *cursor) + break; + + cursor = CharNextA(cursor); + block = cursor; + } + else + cursor = CharNextA(cursor); + } + } + + Plugin_FreeAnsiString(buffer); + return S_OK; +}
\ No newline at end of file |