diff options
-rw-r--r-- | plugins/IEView/src/IEView.cpp | 8 | ||||
-rw-r--r-- | plugins/IEView/src/external_funcs.cpp | 42 | ||||
-rw-r--r-- | plugins/IEView/src/external_funcs.h | 2 |
3 files changed, 50 insertions, 2 deletions
diff --git a/plugins/IEView/src/IEView.cpp b/plugins/IEView/src/IEView.cpp index 9ceca7c676..fe6f254996 100644 --- a/plugins/IEView/src/IEView.cpp +++ b/plugins/IEView/src/IEView.cpp @@ -414,7 +414,7 @@ STDMETHODIMP_(ULONG) IEView::Release(void) STDMETHODIMP IEView::GetTypeInfoCount(UINT *pctinfo)
{
if (pctinfo == NULL) return E_INVALIDARG;
- *pctinfo = 2;
+ *pctinfo = 3;
return S_OK;
}
STDMETHODIMP IEView::GetTypeInfo(UINT, LCID, LPTYPEINFO*)
@@ -428,6 +428,8 @@ STDMETHODIMP IEView::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames {
if (!wcscmp(L"db_get", rgszNames[i]))
rgDispId[i] = DISPID_EXTERNAL_DB_GET;
+ else if (!wcscmp(L"db_set", rgszNames[i]))
+ rgDispId[i] = DISPID_EXTERNAL_DB_SET;
else if (!wcscmp(L"win32_ShellExecute", rgszNames[i]))
rgDispId[i] = DISPID_EXTERNAL_WIN32_SHELL_EXECUTE;
@@ -437,7 +439,7 @@ STDMETHODIMP IEView::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames retval = DISP_E_UNKNOWNNAME;
}
}
- return S_OK;
+ return retval;
}
STDMETHODIMP IEView::Invoke(DISPID dispIdMember,
@@ -454,6 +456,8 @@ STDMETHODIMP IEView::Invoke(DISPID dispIdMember, {
case DISPID_EXTERNAL_DB_GET:
return External::db_get(pDispParams, pVarResult);
+ case DISPID_EXTERNAL_DB_SET:
+ return External::db_set(pDispParams, pVarResult);
case DISPID_EXTERNAL_WIN32_SHELL_EXECUTE:
return External::win32_ShellExecute(pDispParams, pVarResult);
}
diff --git a/plugins/IEView/src/external_funcs.cpp b/plugins/IEView/src/external_funcs.cpp index 445c2e5df1..3f38f4d3f1 100644 --- a/plugins/IEView/src/external_funcs.cpp +++ b/plugins/IEView/src/external_funcs.cpp @@ -42,6 +42,48 @@ namespace External return S_OK;
}
+ HRESULT db_set(DISPPARAMS *pDispParams, VARIANT *pVarResult)
+ {
+ if (pDispParams->cArgs < 4 || pDispParams == nullptr)
+ return E_INVALIDARG;
+
+ MCONTACT hContact = pDispParams->rgvarg[3].intVal;
+ BSTR szModule = pDispParams->rgvarg[2].bstrVal;
+ BSTR szSetting = pDispParams->rgvarg[1].bstrVal;
+
+ DBVARIANT dbv = { 0 };
+
+ VARIANT& pVal = pDispParams->rgvarg[0];
+
+ switch (pVal.vt)
+ {
+ case VT_BSTR:
+ dbv.type = DBVT_WCHAR;
+ dbv.pwszVal = mir_wstrdup(pVal.bstrVal);
+ break;
+ case VT_INT:
+ case VT_I1:
+ case VT_I2:
+ case VT_I4:
+ case VT_I8:
+ dbv.type = DBVT_DWORD;
+ dbv.dVal = pVal.intVal;
+ break;
+ case VT_BOOL:
+ dbv.type = DBVT_BYTE;
+ dbv.bVal = pVal.boolVal;
+ }
+
+ INT_PTR res = ::db_set(hContact, _T2A((TCHAR*)szModule), _T2A((TCHAR*)szSetting), &dbv);
+
+ if (pVarResult != nullptr)
+ {
+ pVarResult->vt = VT_INT_PTR;
+ pVarResult->ullVal = (ULONGLONG)res;
+ }
+ return S_OK;
+ }
+
HRESULT win32_ShellExecute(DISPPARAMS *pDispParams, VARIANT *pVarResult)
{
if (pDispParams->cArgs < 5 || pDispParams == nullptr)
diff --git a/plugins/IEView/src/external_funcs.h b/plugins/IEView/src/external_funcs.h index 6b46424d35..a9526cb831 100644 --- a/plugins/IEView/src/external_funcs.h +++ b/plugins/IEView/src/external_funcs.h @@ -1,11 +1,13 @@ enum EXTERNAL_FUNCTIONS
{
DISPID_EXTERNAL_DB_GET = 652,
+ DISPID_EXTERNAL_DB_SET,
DISPID_EXTERNAL_WIN32_SHELL_EXECUTE
};
namespace External
{
HRESULT db_get(DISPPARAMS *pDispParams, VARIANT *pVarResult);
+ HRESULT db_set(DISPPARAMS *pDispParams, VARIANT *pVarResult);
HRESULT win32_ShellExecute(DISPPARAMS *pDispParams, VARIANT *pVarResult);
}
\ No newline at end of file |