diff options
author | Ingo Bauersachs <ingo@jitsi.org> | 2015-10-10 22:14:00 +0200 |
---|---|---|
committer | Ingo Bauersachs <ingo@jitsi.org> | 2015-10-11 01:18:42 +0200 |
commit | 74aaeff8c9fe194e1b9df442e9731292e810e4ef (patch) | |
tree | d10f04bccb786d3431c418c5bb9930a50a0785d1 /src/native | |
parent | 7d2c785c4cedee65c812878db66a68e437f3d7c9 (diff) | |
download | jitsi-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).
Diffstat (limited to 'src/native')
-rw-r--r-- | src/native/windows/msofficecomm/MessengerContact.cxx | 149 |
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; } |