winamp/Src/omBrowser/configIni.cpp

704 lines
20 KiB
C++

#include "./main.h"
#include "./configIni.h"
#include "./ifc_wasabihelper.h"
#include "./ifc_omconfigcallback.h"
#include <api/application/api_application.h>
#include <shlwapi.h>
#include <strsafe.h>
#define BROWSER_SECTION L"OmBrowser"
#define BROWSER_CLIENTID L"clientId"
#define BROWSER_XPOS L"x"
#define BROWSER_YPOS L"y"
#define DEBUG_SECTION L"Debug"
#define DEBUG_BROWSERPATH L"browserPath"
#define DEBUG_FILTERCONTEXTMENU L"filterContextMenu"
#define DEBUG_SHOWSCRIPTDEBUGGER L"showScriptDebugger"
#define DEBUG_SHOWSCRIPTERROR L"showScriptErrors"
#define TOOLBAR_SECTION L"Toolbar"
#define TOOLBAR_BOTTOMDOCK L"bottomDock"
#define TOOLBAR_AUTOHIDE L"autoHide"
#define TOOLBAR_TABSTOP L"tabStop"
#define TOOLBAR_FORCEADDRESSBAR L"addressbarForce"
#define TOOLBAR_FANCYADDRESSBAR L"addressbarFancy"
#define STATUSBAR_SECTION L"Statusbar"
#define STATUSBAR_ENABLED L"enabled"
#define BOOL2HRESULT(__result) ((FALSE != (__result)) ? S_OK : S_FALSE)
OmConfigIni::OmConfigIni(LPCWSTR pszPath)
: ref(1), configPath(NULL), lastCookie(0),
pathValidated(FALSE)
{
InitializeCriticalSection(&lock);
configPath = Plugin_CopyString(pszPath);
}
OmConfigIni::~OmConfigIni()
{
EnterCriticalSection(&lock);
for(CallbackMap::iterator iter = callbackMap.begin(); iter != callbackMap.end(); iter++)
{
ifc_omconfigcallback *callback = iter->second;
if (NULL != callback) callback->Release();
}
LeaveCriticalSection(&lock);
Plugin_FreeString(configPath);
DeleteCriticalSection(&lock);
}
static HRESULT OmConfigIni_MakeFileName(LPWSTR pszBuffer, INT cchBufferMax, LPCWSTR pszName)
{
if (NULL == pszBuffer)
return E_POINTER;
if (NULL == pszName || L'\0' == *pszName ||
FAILED(StringCchCopy(pszBuffer, cchBufferMax, pszName)))
{
return E_INVALIDARG;
}
PathRemoveBlanks(pszBuffer);
INT cchBuffer = lstrlen(pszBuffer);
if (0 == cchBuffer)
return E_INVALIDARG;
if (FAILED(StringCchCopy(pszBuffer + cchBuffer, cchBufferMax - cchBuffer, L".ini")))
return E_FAIL;
return S_OK;
}
HRESULT OmConfigIni::CreateInstance(LPCWSTR pszName, OmConfigIni **instanceOut)
{
if (NULL == instanceOut) return E_POINTER;
*instanceOut = NULL;
WCHAR szFile[MAX_PATH] = {0};
HRESULT hr = OmConfigIni_MakeFileName(szFile, ARRAYSIZE(szFile), pszName);
if (FAILED(hr)) return hr;
ifc_wasabihelper *wasabi = NULL;
hr = Plugin_GetWasabiHelper(&wasabi);
if (SUCCEEDED(hr) && wasabi != NULL)
{
api_application *app = NULL;
hr = wasabi->GetApplicationApi(&app);
if (SUCCEEDED(hr) && app != NULL)
{
WCHAR szBuffer[1024] = {0};
LPCWSTR userPath = app->path_getUserSettingsPath();
if (NULL == userPath || L'\0' == *userPath ||
NULL == PathCombine(szBuffer, userPath, L"Plugins\\omBrowser") ||
FALSE == PathAppend(szBuffer, szFile))
{
hr = E_UNEXPECTED;
}
else
{
*instanceOut = new OmConfigIni(szBuffer);
if (NULL == *instanceOut) hr = E_OUTOFMEMORY;
}
app->Release();
}
wasabi->Release();
}
return hr;
}
size_t OmConfigIni::AddRef()
{
return InterlockedIncrement((LONG*)&ref);
}
size_t OmConfigIni::Release()
{
if (0 == ref)
return ref;
LONG r = InterlockedDecrement((LONG*)&ref);
if (0 == r)
delete(this);
return r;
}
int OmConfigIni::QueryInterface(GUID interface_guid, void **object)
{
if (NULL == object) return E_POINTER;
if (IsEqualIID(interface_guid, IFC_OmConfig))
*object = static_cast<ifc_omconfig*>(this);
else if (IsEqualIID(interface_guid, IFC_OmBrowserConfig))
*object = static_cast<ifc_ombrowserconfig*>(this);
else if (IsEqualIID(interface_guid, IFC_OmDebugConfig))
*object = static_cast<ifc_omdebugconfig*>(this);
else if (IsEqualIID(interface_guid, IFC_OmToolbarConfig))
*object = static_cast<ifc_omtoolbarconfig*>(this);
else if (IsEqualIID(interface_guid, IFC_OmStatusbarConfig))
*object = static_cast<ifc_omstatusbarconfig*>(this);
else
{
*object = NULL;
return E_NOINTERFACE;
}
if (NULL == *object)
return E_UNEXPECTED;
AddRef();
return S_OK;
}
HRESULT OmConfigIni::GetPath(LPWSTR pszBuffer, INT cchBufferMax)
{
if (NULL == pszBuffer) return E_POINTER;
return StringCchCopy(pszBuffer, cchBufferMax, configPath);
}
DWORD OmConfigIni::ReadStr(LPCWSTR lpSectionName, LPCWSTR lpKeyName, LPCWSTR lpDefault, LPWSTR lpReturnedString, DWORD nSize)
{
return GetPrivateProfileStringW(lpSectionName, lpKeyName, lpDefault, lpReturnedString, nSize, configPath);
}
UINT OmConfigIni::ReadInt(LPCWSTR lpSectionName, LPCWSTR lpKeyName, INT nDefault)
{
return GetPrivateProfileIntW(lpSectionName, lpKeyName, nDefault, configPath);
}
BOOL OmConfigIni::ReadBool(LPCWSTR lpSectionName, LPCWSTR lpKeyName, BOOL bDefault)
{
WCHAR szBuffer[32] = {0};
INT cchLen = ReadStr(lpSectionName, lpKeyName, NULL, szBuffer, ARRAYSIZE(szBuffer));
if (0 == cchLen) return bDefault;
if (1 == cchLen)
{
switch(*szBuffer)
{
case L'0':
case L'n':
case L'f':
return FALSE;
case L'1':
case L'y':
case L't':
return TRUE;
}
}
else
{
if (CSTR_EQUAL == CompareString(CSTR_INVARIANT, NORM_IGNORECASE, L"yes", -1, szBuffer, cchLen) ||
CSTR_EQUAL == CompareString(CSTR_INVARIANT, NORM_IGNORECASE, L"true", -1, szBuffer, cchLen))
{
return TRUE;
}
if (CSTR_EQUAL == CompareString(CSTR_INVARIANT, NORM_IGNORECASE, L"no", -1, szBuffer, cchLen) ||
CSTR_EQUAL == CompareString(CSTR_INVARIANT, NORM_IGNORECASE, L"false", -1, szBuffer, cchLen))
{
return FALSE;
}
}
INT v = 0;
if (FALSE != StrToIntEx(szBuffer, STIF_SUPPORT_HEX, &v))
return (0 != v);
return bDefault;
}
HRESULT OmConfigIni::WriteStr(LPCWSTR lpSectionName, LPCWSTR lpKeyName, LPCWSTR lpString)
{
if (NULL == configPath || L'\0' == *configPath)
return E_UNEXPECTED;
if (FALSE == pathValidated)
{
WCHAR szDirectory[MAX_PATH*2] = {0};
if (SUCCEEDED(StringCchCopy(szDirectory, ARRAYSIZE(szDirectory), configPath)))
{
PathRemoveFileSpec(szDirectory);
Plugin_EnsurePathExist(szDirectory);
pathValidated = TRUE;
}
}
if (0 != WritePrivateProfileStringW(lpSectionName, lpKeyName, lpString, configPath))
return S_OK;
DWORD errorCode = GetLastError();
return HRESULT_FROM_WIN32(errorCode);
}
HRESULT OmConfigIni::WriteInt(LPCWSTR lpSectionName, LPCWSTR lpKeyName, INT nValue)
{
wchar_t szBuffer[32] = {0};
HRESULT hr = StringCchPrintf(szBuffer, ARRAYSIZE(szBuffer), L"%d", nValue);
if (FAILED(hr)) return hr;
return WriteStr(lpSectionName, lpKeyName, szBuffer);
}
HRESULT OmConfigIni::WriteBool(LPCWSTR lpSectionName, LPCWSTR lpKeyName, BOOL bValue)
{
return WriteStr(lpSectionName, lpKeyName, (0 != bValue) ? L"yes" : L"no");
}
HRESULT OmConfigIni::GetClientId(LPWSTR pszBuffer, INT cchBufferMax)
{
if (NULL == pszBuffer) return E_POINTER;
INT cchLen = ReadStr(BROWSER_SECTION, BROWSER_CLIENTID, NULL, pszBuffer, cchBufferMax);
if (0 == cchLen) return S_FALSE;
INT cchPrefix = lstrlen(L"WA-");
if (cchLen <= cchPrefix ||
CSTR_EQUAL != CompareString(CSTR_INVARIANT, NORM_IGNORECASE, pszBuffer, cchPrefix, L"WA-", cchPrefix))
{
pszBuffer[0] = L'\0';
return E_INVALIDARG;
}
return S_OK;
}
HRESULT OmConfigIni::SetClientId(LPWSTR pszClientId)
{
EnterCriticalSection(&lock);
WCHAR szBuffer[128] = {0};
HRESULT hr = GetClientId(szBuffer, ARRAYSIZE(szBuffer));
if (FAILED(hr) || CSTR_EQUAL != CompareString(CSTR_INVARIANT, NORM_IGNORECASE, pszClientId, -1, szBuffer, -1))
{
hr = WriteStr(BROWSER_SECTION, BROWSER_CLIENTID, pszClientId);
if (SUCCEEDED(hr))
{
NotifyChange(&IFC_OmBrowserConfig, CFGID_BROWSER_CLIENTID, (ULONG_PTR)pszClientId);
}
}
LeaveCriticalSection(&lock);
return hr;
}
HRESULT OmConfigIni::GetMenuFilterEnabled(void)
{
BOOL result = ReadBool(DEBUG_SECTION, DEBUG_FILTERCONTEXTMENU, TRUE);
return BOOL2HRESULT(result);
}
HRESULT OmConfigIni::GetScriptErrorEnabled(void)
{
BOOL result = ReadBool(DEBUG_SECTION, DEBUG_SHOWSCRIPTERROR, FALSE);
return BOOL2HRESULT(result);
}
HRESULT OmConfigIni::GetScriptDebuggerEnabled(void)
{
BOOL result = ReadBool(DEBUG_SECTION, DEBUG_SHOWSCRIPTDEBUGGER, FALSE);
return BOOL2HRESULT(result);
}
HRESULT OmConfigIni::GetBrowserPath(LPWSTR pszBuffer, INT cchBufferMax)
{
if (NULL == pszBuffer) return E_POINTER;
INT cchLen = ReadStr(DEBUG_SECTION, DEBUG_BROWSERPATH, NULL, pszBuffer, cchBufferMax);
if (0 == cchLen) return S_FALSE;
if ((L'.' == pszBuffer[0] && L'\\' == pszBuffer[1]) ||
(L'.' == pszBuffer[0] && L'.' == pszBuffer[1] && L'\\' == pszBuffer[2]))
{
WCHAR szTemp[2*MAX_PATH] = {0};
StringCchCopy(szTemp, ARRAYSIZE(szTemp), configPath);
PathRemoveFileSpec(szTemp);
if (FALSE == PathAppend(szTemp, pszBuffer) ||
FAILED(StringCchCopy(pszBuffer, cchBufferMax, szTemp)))
{
pszBuffer[0] = L'\0';
return E_FAIL;
}
}
return S_OK;
}
HRESULT OmConfigIni::EnableMenuFilter(BOOL fEnable)
{
EnterCriticalSection(&lock);
HRESULT hr = GetMenuFilterEnabled();
if (FAILED(hr) || ((S_OK == hr) != (FALSE != fEnable)))
{
hr = WriteBool(DEBUG_SECTION, DEBUG_FILTERCONTEXTMENU, fEnable);
if (SUCCEEDED(hr))
{
NotifyChange(&IFC_OmDebugConfig, CFGID_DEBUG_FILTERMENU, (ULONG_PTR)fEnable);
}
}
LeaveCriticalSection(&lock);
return hr;
}
HRESULT OmConfigIni::EnableScriptError(BOOL fEnable)
{
HRESULT hr;
EnterCriticalSection(&lock);
hr = GetScriptErrorEnabled();
if (FAILED(hr) || ((S_OK == hr) != (FALSE != fEnable)))
{
hr = WriteBool(DEBUG_SECTION, DEBUG_SHOWSCRIPTERROR, fEnable);
if (SUCCEEDED(hr))
{
NotifyChange(&IFC_OmDebugConfig, CFGID_DEBUG_SCRIPTERROR, (ULONG_PTR)fEnable);
}
}
LeaveCriticalSection(&lock);
return hr;
}
HRESULT OmConfigIni::EnableScriptDebugger(BOOL fEnable)
{
EnterCriticalSection(&lock);
HRESULT hr = GetScriptDebuggerEnabled();
if (FAILED(hr) || ((S_OK == hr) != (FALSE != fEnable)))
{
hr = WriteBool(DEBUG_SECTION, DEBUG_SHOWSCRIPTDEBUGGER, fEnable);
if (SUCCEEDED(hr))
{
NotifyChange(&IFC_OmDebugConfig, CFGID_DEBUG_SCRIPTDEBUGGER, (ULONG_PTR)fEnable);
}
}
LeaveCriticalSection(&lock);
return hr;
}
HRESULT OmConfigIni::SetBrowserPath(LPCWSTR pszPath)
{
EnterCriticalSection(&lock);
WCHAR szBuffer[MAX_PATH * 2] = {0};
HRESULT hr = GetBrowserPath(szBuffer, ARRAYSIZE(szBuffer));
if (FAILED(hr) ||
CSTR_EQUAL != CompareString(CSTR_INVARIANT, 0, szBuffer, -1, pszPath, -1))
{
hr = WriteString(DEBUG_SECTION, DEBUG_SHOWSCRIPTDEBUGGER, pszPath);
if (SUCCEEDED(hr))
{
NotifyChange(&IFC_OmDebugConfig, CFGID_DEBUG_BROWSERPATH, (ULONG_PTR)pszPath);
}
}
LeaveCriticalSection(&lock);
return hr;
}
HRESULT OmConfigIni::Toolbar_GetBottomDockEnabled(void)
{
BOOL result = ReadBool(TOOLBAR_SECTION, TOOLBAR_BOTTOMDOCK, FALSE);
return BOOL2HRESULT(result);
}
HRESULT OmConfigIni::Toolbar_GetAutoHideEnabled(void)
{
BOOL result = ReadBool(TOOLBAR_SECTION, TOOLBAR_AUTOHIDE, FALSE);
return BOOL2HRESULT(result);
}
HRESULT OmConfigIni::Toolbar_GetTabStopEnabled(void)
{
BOOL result = ReadBool(TOOLBAR_SECTION, TOOLBAR_TABSTOP, FALSE);
return BOOL2HRESULT(result);
}
HRESULT OmConfigIni::Toolbar_GetForceAddressbarEnabled(void)
{
BOOL result = ReadBool(TOOLBAR_SECTION, TOOLBAR_FORCEADDRESSBAR, FALSE);
return BOOL2HRESULT(result);
}
HRESULT OmConfigIni::Toolbar_GetFancyAddressbarEnabled(void)
{
BOOL result = ReadBool(TOOLBAR_SECTION, TOOLBAR_FANCYADDRESSBAR, TRUE);
return BOOL2HRESULT(result);
}
HRESULT OmConfigIni::Toolbar_EnableBottomDock(BOOL fEnable)
{
EnterCriticalSection(&lock);
HRESULT hr = Toolbar_GetBottomDockEnabled();
if (FAILED(hr) || ((S_OK == hr) != (FALSE != fEnable)))
{
hr = WriteBool(TOOLBAR_SECTION, TOOLBAR_BOTTOMDOCK, fEnable);
if (SUCCEEDED(hr))
{
NotifyChange(&IFC_OmToolbarConfig, CFGID_TOOLBAR_BOTTOMDOCK, (ULONG_PTR)fEnable);
}
}
LeaveCriticalSection(&lock);
return hr;
}
HRESULT OmConfigIni::Toolbar_EnableAutoHide(BOOL fEnable)
{
EnterCriticalSection(&lock);
HRESULT hr = Toolbar_GetAutoHideEnabled();
if (FAILED(hr) || ((S_OK == hr) != (FALSE != fEnable)))
{
hr = WriteBool(TOOLBAR_SECTION, TOOLBAR_AUTOHIDE, fEnable);
if (SUCCEEDED(hr))
{
NotifyChange(&IFC_OmToolbarConfig, CFGID_TOOLBAR_AUTOHIDE, (ULONG_PTR)fEnable);
}
}
LeaveCriticalSection(&lock);
return hr;
}
HRESULT OmConfigIni::Toolbar_EnableTabStop(BOOL fEnable)
{
EnterCriticalSection(&lock);
HRESULT hr = Toolbar_GetTabStopEnabled();
if (FAILED(hr) || ((S_OK == hr) != (FALSE != fEnable)))
{
hr = WriteBool(TOOLBAR_SECTION, TOOLBAR_TABSTOP, fEnable);
if (SUCCEEDED(hr))
{
NotifyChange(&IFC_OmToolbarConfig, CFGID_TOOLBAR_TABSTOP, (ULONG_PTR)fEnable);
}
}
LeaveCriticalSection(&lock);
return hr;
}
HRESULT OmConfigIni::Toolbar_EnableForceAddressbar(BOOL fEnable)
{
EnterCriticalSection(&lock);
HRESULT hr = Toolbar_GetForceAddressbarEnabled();
if (FAILED(hr) || ((S_OK == hr) != (FALSE != fEnable)))
{
hr = WriteBool(TOOLBAR_SECTION, TOOLBAR_FORCEADDRESSBAR, fEnable);
if (SUCCEEDED(hr))
{
NotifyChange(&IFC_OmToolbarConfig, CFGID_TOOLBAR_FORCEADDRESS, (ULONG_PTR)fEnable);
}
}
LeaveCriticalSection(&lock);
return hr;
}
HRESULT OmConfigIni::Toolbar_EnableFancyAddressbar(BOOL fEnable)
{
EnterCriticalSection(&lock);
HRESULT hr = Toolbar_GetFancyAddressbarEnabled();
if (FAILED(hr) || ((S_OK == hr) != (FALSE != fEnable)))
{
hr = WriteBool(TOOLBAR_SECTION, TOOLBAR_FANCYADDRESSBAR, fEnable);
if (SUCCEEDED(hr))
{
NotifyChange(&IFC_OmToolbarConfig, CFGID_TOOLBAR_FANCYADDRESS, (ULONG_PTR)fEnable);
}
}
LeaveCriticalSection(&lock);
return hr;
}
HRESULT OmConfigIni::Statusbar_GetEnabled(void)
{
BOOL result = ReadBool(STATUSBAR_SECTION, STATUSBAR_ENABLED, FALSE);
return BOOL2HRESULT(result);
}
HRESULT OmConfigIni::Statusbar_EnableStatusbar(BOOL fEnable)
{
EnterCriticalSection(&lock);
HRESULT hr = Statusbar_GetEnabled();
if (FAILED(hr) || ((S_OK == hr) != (FALSE != fEnable)))
{
hr = WriteBool(STATUSBAR_SECTION, STATUSBAR_ENABLED, fEnable);
if (SUCCEEDED(hr))
{
NotifyChange(&IFC_OmStatusbarConfig, CFGID_STATUSBAR_ENABLED, (ULONG_PTR)fEnable);
}
}
LeaveCriticalSection(&lock);
return hr;
}
HRESULT OmConfigIni::RegisterCallback(ifc_omconfigcallback *callback, UINT *cookie)
{
if (NULL == cookie) return E_POINTER;
*cookie = 0;
if (NULL == callback)
return E_INVALIDARG;
EnterCriticalSection(&lock);
*cookie = ++lastCookie;
callbackMap.insert({ *cookie, callback });
callback->AddRef();
LeaveCriticalSection(&lock);
return S_OK;
}
HRESULT OmConfigIni::UnregisterCallback(UINT cookie)
{
if (0 == cookie) return E_INVALIDARG;
ifc_omconfigcallback *callback = NULL;
EnterCriticalSection(&lock);
for(CallbackMap::iterator iter = callbackMap.begin(); iter != callbackMap.end(); iter++)
{
if (cookie == iter->first)
{
callback = iter->second;
callbackMap.erase(iter);
break;
}
}
LeaveCriticalSection(&lock);
if (NULL != callback)
{
callback->Release();
return S_OK;
}
return S_FALSE;
}
void OmConfigIni::NotifyChange(const GUID *configUid, UINT valueId, ULONG_PTR value)
{
EnterCriticalSection(&lock);
for(CallbackMap::iterator iter = callbackMap.begin(); iter != callbackMap.end(); iter++)
{
ifc_omconfigcallback *callback = iter->second;
callback->ValueChanged(configUid, valueId, value);
}
LeaveCriticalSection(&lock);
}
UINT OmConfigIni::GetX(void)
{
return ReadInt(BROWSER_SECTION, BROWSER_XPOS, -1);
}
UINT OmConfigIni::GetY(void)
{
return ReadInt(BROWSER_SECTION, BROWSER_YPOS, -1);
}
HRESULT OmConfigIni::SetX(UINT x)
{
return WriteInt(BROWSER_SECTION, BROWSER_XPOS, x);
}
HRESULT OmConfigIni::SetY(UINT y)
{
return WriteInt(BROWSER_SECTION, BROWSER_YPOS, y);
}
#define CBCLASS OmConfigIni
START_MULTIPATCH
START_PATCH(MPIID_OMCONFIG)
M_CB(MPIID_OMCONFIG, ifc_omconfig, ADDREF, AddRef);
M_CB(MPIID_OMCONFIG, ifc_omconfig, RELEASE, Release);
M_CB(MPIID_OMCONFIG, ifc_omconfig, QUERYINTERFACE, QueryInterface);
M_CB(MPIID_OMCONFIG, ifc_omconfig, API_GETPATH, GetPath);
M_CB(MPIID_OMCONFIG, ifc_omconfig, API_READSTRING, ReadStr);
M_CB(MPIID_OMCONFIG, ifc_omconfig, API_READINT, ReadInt);
M_CB(MPIID_OMCONFIG, ifc_omconfig, API_READBOOL, ReadBool);
M_CB(MPIID_OMCONFIG, ifc_omconfig, API_WRITESTRING, WriteStr);
M_CB(MPIID_OMCONFIG, ifc_omconfig, API_WRITEINT, WriteInt);
M_CB(MPIID_OMCONFIG, ifc_omconfig, API_WRITEBOOL, WriteBool);
M_CB(MPIID_OMCONFIG, ifc_omconfig, API_REGISTERCALLBACK, RegisterCallback);
M_CB(MPIID_OMCONFIG, ifc_omconfig, API_UNREGISTERCALLBACK, UnregisterCallback);
NEXT_PATCH(MPIID_OMBROWSERCONFIG)
M_CB(MPIID_OMBROWSERCONFIG, ifc_ombrowserconfig, ADDREF, AddRef);
M_CB(MPIID_OMBROWSERCONFIG, ifc_ombrowserconfig, RELEASE, Release);
M_CB(MPIID_OMBROWSERCONFIG, ifc_ombrowserconfig, QUERYINTERFACE, QueryInterface);
M_CB(MPIID_OMBROWSERCONFIG, ifc_ombrowserconfig, API_GETCLIENTID, GetClientId);
M_CB(MPIID_OMBROWSERCONFIG, ifc_ombrowserconfig, API_SETCLIENTID, SetClientId);
M_CB(MPIID_OMBROWSERCONFIG, ifc_ombrowserconfig, API_GETX, GetX);
M_CB(MPIID_OMBROWSERCONFIG, ifc_ombrowserconfig, API_SETX, SetX);
M_CB(MPIID_OMBROWSERCONFIG, ifc_ombrowserconfig, API_GETY, GetY);
M_CB(MPIID_OMBROWSERCONFIG, ifc_ombrowserconfig, API_SETY, SetY);
NEXT_PATCH(MPIID_OMDEBUGCONFIG)
M_CB(MPIID_OMDEBUGCONFIG, ifc_omdebugconfig, ADDREF, AddRef);
M_CB(MPIID_OMDEBUGCONFIG, ifc_omdebugconfig, RELEASE, Release);
M_CB(MPIID_OMDEBUGCONFIG, ifc_omdebugconfig, QUERYINTERFACE, QueryInterface);
M_CB(MPIID_OMDEBUGCONFIG, ifc_omdebugconfig, API_GETMENUFILTERENABLED, GetMenuFilterEnabled);
M_CB(MPIID_OMDEBUGCONFIG, ifc_omdebugconfig, API_GETSCRIPTERRORENABLED, GetScriptErrorEnabled);
M_CB(MPIID_OMDEBUGCONFIG, ifc_omdebugconfig, API_GETSCRIPTDEBUGGERENABLED, GetScriptDebuggerEnabled);
M_CB(MPIID_OMDEBUGCONFIG, ifc_omdebugconfig, API_GETBROWSERPATH, GetBrowserPath);
M_CB(MPIID_OMDEBUGCONFIG, ifc_omdebugconfig, API_ENABLEMENUFILTER, EnableMenuFilter);
M_CB(MPIID_OMDEBUGCONFIG, ifc_omdebugconfig, API_ENABLESCRIPTERROR, EnableScriptError);
M_CB(MPIID_OMDEBUGCONFIG, ifc_omdebugconfig, API_ENABLESCRIPTDEBUGGER, EnableScriptDebugger);
M_CB(MPIID_OMDEBUGCONFIG, ifc_omdebugconfig, API_SETBROWSERPATH, SetBrowserPath);
NEXT_PATCH(MPIID_OMTOOLBARCONFIG)
M_CB(MPIID_OMTOOLBARCONFIG, ifc_omtoolbarconfig, ADDREF, AddRef);
M_CB(MPIID_OMTOOLBARCONFIG, ifc_omtoolbarconfig, RELEASE, Release);
M_CB(MPIID_OMTOOLBARCONFIG, ifc_omtoolbarconfig, QUERYINTERFACE, QueryInterface);
M_CB(MPIID_OMTOOLBARCONFIG, ifc_omtoolbarconfig, API_GETBOTTOMDOCKENABLED, Toolbar_GetBottomDockEnabled);
M_CB(MPIID_OMTOOLBARCONFIG, ifc_omtoolbarconfig, API_ENABLEBOTTOMDOCK, Toolbar_EnableBottomDock);
M_CB(MPIID_OMTOOLBARCONFIG, ifc_omtoolbarconfig, API_GETAUTOHIDEENABLED, Toolbar_GetAutoHideEnabled);
M_CB(MPIID_OMTOOLBARCONFIG, ifc_omtoolbarconfig, API_ENABLEAUTOHIDE, Toolbar_EnableAutoHide);
M_CB(MPIID_OMTOOLBARCONFIG, ifc_omtoolbarconfig, API_GETTABSTOPENABLED, Toolbar_GetTabStopEnabled);
M_CB(MPIID_OMTOOLBARCONFIG, ifc_omtoolbarconfig, API_ENABLETABSTOP, Toolbar_EnableTabStop);
M_CB(MPIID_OMTOOLBARCONFIG, ifc_omtoolbarconfig, API_GETFORCEADDRESSBARENABLED, Toolbar_GetForceAddressbarEnabled);
M_CB(MPIID_OMTOOLBARCONFIG, ifc_omtoolbarconfig, API_ENABLEFORCEADDRESSBAR, Toolbar_EnableForceAddressbar);
M_CB(MPIID_OMTOOLBARCONFIG, ifc_omtoolbarconfig, API_GETFANCYADDRESSBARENABLED, Toolbar_GetFancyAddressbarEnabled);
M_CB(MPIID_OMTOOLBARCONFIG, ifc_omtoolbarconfig, API_ENABLEFANCYADDRESSBAR, Toolbar_EnableFancyAddressbar);
NEXT_PATCH(MPIID_OMSTATUSBARCONFIG)
M_CB(MPIID_OMSTATUSBARCONFIG, ifc_omstatusbarconfig, ADDREF, AddRef);
M_CB(MPIID_OMSTATUSBARCONFIG, ifc_omstatusbarconfig, RELEASE, Release);
M_CB(MPIID_OMSTATUSBARCONFIG, ifc_omstatusbarconfig, QUERYINTERFACE, QueryInterface);
M_CB(MPIID_OMSTATUSBARCONFIG, ifc_omstatusbarconfig, API_GETENABLED, Statusbar_GetEnabled);
M_CB(MPIID_OMSTATUSBARCONFIG, ifc_omstatusbarconfig, API_ENABLESTATUSBAR, Statusbar_EnableStatusbar);
END_PATCH
END_MULTIPATCH;
#undef CBCLASS