1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
#include "./loginConfig.h"
#include "./common.h"
#include <shlwapi.h>
#include <strsafe.h>
#define BOOL2HRESULT(__result) ((FALSE != (__result)) ? S_OK : S_FALSE)
LoginConfig::LoginConfig()
: ref(1), configPath(NULL), pathValidated(FALSE), buffer(NULL)
{
}
LoginConfig::~LoginConfig()
{
LoginBox_FreeAnsiString(configPath);
LoginBox_FreeString((LPWSTR)buffer);
}
HRESULT LoginConfig::CreateInstance(LoginConfig **instance)
{
if (NULL == instance) return E_POINTER;
*instance = NULL;
WCHAR szFile[MAX_PATH] = {0};
HRESULT hr;
hr = LoginBox_GetConfigPath(szFile, FALSE);
if (FAILED(hr)) return hr;
if (FALSE == PathAppend(szFile, L"loginBox.ini"))
return E_UNEXPECTED;
LPSTR configPath;
hr = LoginBox_WideCharToMultiByte(CP_UTF8, 0, szFile, -1, NULL, NULL, &configPath);
if (FAILED(hr)) return hr;
*instance = new LoginConfig();
if (NULL == *instance)
{
LoginBox_FreeAnsiString(configPath);
return E_OUTOFMEMORY;
}
else
{
(*instance)->configPath = configPath;
}
return S_OK;
}
ULONG LoginConfig::AddRef()
{
return InterlockedIncrement((LONG*)&ref);
}
ULONG LoginConfig::Release()
{
if (0 == ref)
return ref;
LONG r = InterlockedDecrement((LONG*)&ref);
if (0 == r)
delete(this);
return r;
}
HRESULT LoginConfig::GetPath(LPCSTR *ppPath)
{
if (NULL == ppPath)
return E_POINTER;
*ppPath = configPath;
return S_OK;
}
DWORD LoginConfig::ReadAnsiStr(LPCSTR lpSectionName, LPCSTR lpKeyName, LPCSTR lpDefault, LPSTR lpReturnedString, DWORD nSize)
{
return GetPrivateProfileStringA(lpSectionName, lpKeyName, lpDefault, lpReturnedString, nSize, configPath);
}
UINT LoginConfig::ReadInt(LPCSTR lpSectionName, LPCSTR lpKeyName, INT nDefault)
{
return GetPrivateProfileIntA(lpSectionName, lpKeyName, nDefault, configPath);
}
HRESULT LoginConfig::WriteAnsiStr(LPCSTR lpSectionName, LPCSTR lpKeyName, LPCSTR lpString)
{
if (NULL == configPath || L'\0' == *configPath)
return E_UNEXPECTED;
if (FALSE == pathValidated)
{
LPWSTR pszTest;
if (SUCCEEDED(LoginBox_MultiByteToWideChar(CP_UTF8, 0, configPath, -1, &pszTest)))
{
PathRemoveFileSpec(pszTest);
LoginBox_EnsurePathExist(pszTest);
pathValidated = TRUE;
LoginBox_FreeString(pszTest);
}
}
if (0 != WritePrivateProfileStringA(lpSectionName, lpKeyName, lpString, configPath))
return S_OK;
DWORD errorCode = GetLastError();
return HRESULT_FROM_WIN32(errorCode);
}
HRESULT LoginConfig::WriteInt(LPCSTR lpSectionName, LPCSTR lpKeyName, INT nValue)
{
CHAR szBuffer[32] = {0};
HRESULT hr = StringCchPrintfA(szBuffer, ARRAYSIZE(szBuffer), "%d", nValue);
if (FAILED(hr)) return hr;
return WriteAnsiStr(lpSectionName, lpKeyName, szBuffer);
}
|