aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Bauersachs <ingo@jitsi.org>2015-10-10 22:14:00 +0200
committerIngo Bauersachs <ingo@jitsi.org>2015-10-11 01:18:42 +0200
commit74aaeff8c9fe194e1b9df442e9731292e810e4ef (patch)
treed10f04bccb786d3431c418c5bb9930a50a0785d1
parent7d2c785c4cedee65c812878db66a68e437f3d7c9 (diff)
downloadjitsi-74aaeff8c9fe194e1b9df442e9731292e810e4ef.zip
jitsi-74aaeff8c9fe194e1b9df442e9731292e810e4ef.tar.gz
jitsi-74aaeff8c9fe194e1b9df442e9731292e810e4ef.tar.bz2
Specify the underlying type of the SAFEARRAY in the variant type.
VariantClear fails with DISP_E_BADVARTYPE if this is not indicated, causing Office 2016 to crash. I'd guess they fixed a memory leaked so this only appears from version v16 (onwards).
-rw-r--r--src/native/windows/msofficecomm/MessengerContact.cxx149
1 files changed, 75 insertions, 74 deletions
diff --git a/src/native/windows/msofficecomm/MessengerContact.cxx b/src/native/windows/msofficecomm/MessengerContact.cxx
index a2bbbe4..608034a 100644
--- a/src/native/windows/msofficecomm/MessengerContact.cxx
+++ b/src/native/windows/msofficecomm/MessengerContact.cxx
@@ -242,88 +242,89 @@ STDMETHODIMP MessengerContact::get_PhoneNumber(MPHONE_TYPE PhoneType, BSTR *bstr
STDMETHODIMP
MessengerContact::get_PresenceProperties(VARIANT *pvPresenceProperties)
{
- HRESULT hr;
+ if (!pvPresenceProperties)
+ {
+ return E_INVALIDARG;
+ }
- if (pvPresenceProperties)
+ MISTATUS status;
+ HRESULT hr = get_Status(&status);
+ if (FAILED(hr))
{
- MISTATUS status;
+ return hr;
+ }
- hr = get_Status(&status);
- if (SUCCEEDED(hr))
- {
- hr
- = (VT_EMPTY == pvPresenceProperties->vt)
- ? S_OK
- : (::VariantClear(pvPresenceProperties));
- if (SUCCEEDED(hr))
- {
- SAFEARRAY *sa
- = ::SafeArrayCreateVector(VT_VARIANT, 0, PRESENCE_PROP_MAX);
+ hr = (VT_EMPTY == pvPresenceProperties->vt)
+ ? S_OK
+ : (::VariantClear(pvPresenceProperties));
+ if (FAILED(hr))
+ {
+ return hr;
+ }
- if (sa)
- {
- LONG i;
- VARIANT v;
-
- i = PRESENCE_PROP_MSTATE;
- ::VariantInit(&v);
- v.vt = VT_I4;
- v.lVal = status;
- hr = ::SafeArrayPutElement(sa, &i, &v);
- if (SUCCEEDED(hr))
- {
- LONG availability;
+ SAFEARRAY *sa = ::SafeArrayCreateVector(VT_VARIANT, 0, PRESENCE_PROP_MAX);
+ if (!sa)
+ {
+ return E_FAIL;
+ }
- switch (status)
- {
- case MISTATUS_AWAY:
- case MISTATUS_OUT_OF_OFFICE:
- availability = 15000;
- break;
- case MISTATUS_BE_RIGHT_BACK:
- availability = 12000;
- break;
- case MISTATUS_BUSY:
- case MISTATUS_IN_A_CONFERENCE:
- case MISTATUS_ON_THE_PHONE:
- availability = 6000;
- break;
- case MISTATUS_DO_NOT_DISTURB:
- case MISTATUS_ALLOW_URGENT_INTERRUPTIONS:
- availability = 9000;
- break;
- case MISTATUS_INVISIBLE:
- availability = 18000;
- break;
- case MISTATUS_ONLINE:
- availability = 3000;
- break;
- default:
- availability = 0;
- break;
- }
- if (availability)
- {
- i = PRESENCE_PROP_AVAILABILITY;
- v.lVal = availability;
- hr = ::SafeArrayPutElement(sa, &i, &v);
- }
- }
- if (SUCCEEDED(hr))
- {
- pvPresenceProperties->vt = VT_ARRAY;
- pvPresenceProperties->parray = sa;
- }
- else
- ::SafeArrayDestroy(sa);
- }
- else
- hr = E_FAIL;
- }
+ LONG mstateIndex = PRESENCE_PROP_MSTATE;
+ VARIANT vtMState;
+ ::VariantInit(&vtMState);
+ vtMState.vt = VT_I4;
+ vtMState.lVal = status;
+ hr = ::SafeArrayPutElement(sa, &mstateIndex, &vtMState);
+ if (SUCCEEDED(hr))
+ {
+ LONG availability;
+ switch (status)
+ {
+ case MISTATUS_AWAY:
+ case MISTATUS_OUT_OF_OFFICE:
+ availability = 15000;
+ break;
+ case MISTATUS_BE_RIGHT_BACK:
+ availability = 12000;
+ break;
+ case MISTATUS_BUSY:
+ case MISTATUS_IN_A_CONFERENCE:
+ case MISTATUS_ON_THE_PHONE:
+ availability = 6000;
+ break;
+ case MISTATUS_DO_NOT_DISTURB:
+ case MISTATUS_ALLOW_URGENT_INTERRUPTIONS:
+ availability = 9000;
+ break;
+ case MISTATUS_INVISIBLE:
+ availability = 18000;
+ break;
+ case MISTATUS_ONLINE:
+ availability = 3000;
+ break;
+ default:
+ availability = 0;
+ break;
+ }
+
+ if (availability)
+ {
+ LONG availIndex = PRESENCE_PROP_AVAILABILITY;
+ VARIANT vtAvailability;
+ ::VariantInit(&vtAvailability);
+ vtAvailability.vt = VT_I4;
+ vtAvailability.lVal = availability;
+ hr = ::SafeArrayPutElement(sa, &availIndex, &vtAvailability);
}
}
+
+ if (SUCCEEDED(hr))
+ {
+ pvPresenceProperties->vt = VT_VARIANT | VT_ARRAY;
+ pvPresenceProperties->parray = sa;
+ }
else
- hr = E_INVALIDARG;
+ ::SafeArrayDestroy(sa);
+
return hr;
}