summaryrefslogtreecommitdiff
path: root/extensions
diff options
context:
space:
mode:
authorTor Lillqvist <tml@collabora.com>2018-06-08 18:30:33 +0300
committerAndras Timar <andras.timar@collabora.com>2018-06-30 12:40:43 +0200
commit9517923c581c2c7be79a6838959a60ed66a4c34b (patch)
tree7ba5958dc5ba816e9cf9075db6033ff530c93425 /extensions
parente188baafd0ee6e6d6764b5c8b6a87d8946b6465f (diff)
Start of work on supporting named arguments
In InterfaceOleWrapper::GetIDsOfNames(), look up also the parameter names, if present (if cNames > 1, rgszNames entries after the first). Return S_OK only if *all* the names were found, i.e. both the first (method or property) name, *and* all the parameter names. Change-Id: Ie04bc0558a7e2044ef527fc18f99230c71985a22 Reviewed-on: https://gerrit.libreoffice.org/55481 Reviewed-by: Andras Timar <andras.timar@collabora.com> Tested-by: Andras Timar <andras.timar@collabora.com>
Diffstat (limited to 'extensions')
-rw-r--r--extensions/source/ole/unoobjw.cxx61
1 files changed, 50 insertions, 11 deletions
diff --git a/extensions/source/ole/unoobjw.cxx b/extensions/source/ole/unoobjw.cxx
index fdc3a85a64e2..213f2521b56f 100644
--- a/extensions/source/ole/unoobjw.cxx
+++ b/extensions/source/ole/unoobjw.cxx
@@ -1075,10 +1075,15 @@ STDMETHODIMP InterfaceOleWrapper::GetIDsOfNames(REFIID /*riid*/,
{
comphelper::Automation::AutomationInvokedZone aAutomationActive;
+ if( ! rgdispid)
+ return E_POINTER;
+
OUString sNames;
sNames += "[";
for (unsigned int i = 0; i < cNames; ++i)
{
+ // Intialise returned rgdispid values.
+ rgdispid[i] = DISPID_UNKNOWN;
if (i > 0)
sNames += ",";
sNames += "\"" + OUString(o3tl::toU(rgszNames[i])) + "\"";
@@ -1091,8 +1096,6 @@ STDMETHODIMP InterfaceOleWrapper::GetIDsOfNames(REFIID /*riid*/,
try
{
MutexGuard guard( getBridgeMutex());
- if( ! rgdispid)
- return E_POINTER;
// FIXME: Handle the cNames > 1 case? Note that the rest of the names mean the names of *arguments*.
@@ -1119,20 +1122,18 @@ STDMETHODIMP InterfaceOleWrapper::GetIDsOfNames(REFIID /*riid*/,
OUString name(o3tl::toU(rgszNames[0]));
NameToIdMap::iterator iter = m_nameToDispIdMap.find(name);
+ bool bIsMethod = false;
+
+ OUString exactName = name;
+
if (iter == m_nameToDispIdMap.end())
{
- OUString exactName;
-
if (m_xExactName.is())
{
exactName = m_xExactName->getExactName(name);
if (exactName.isEmpty())
exactName = name;
}
- else
- {
- exactName = name;
- }
MemberInfo d(0, exactName);
@@ -1146,6 +1147,7 @@ STDMETHODIMP InterfaceOleWrapper::GetIDsOfNames(REFIID /*riid*/,
if (m_xInvocation->hasMethod(exactName))
{
d.flags |= DISPATCH_METHOD;
+ bIsMethod = true;
}
if (d.flags != 0)
@@ -1167,9 +1169,46 @@ STDMETHODIMP InterfaceOleWrapper::GetIDsOfNames(REFIID /*riid*/,
}
else
{
- *rgdispid = (*iter).second;
- SAL_INFO("extensions.olebridge", " " << name << ": " << *rgdispid);
- ret = S_OK;
+ rgdispid[0] = (*iter).second;
+ SAL_INFO("extensions.olebridge", " " << name << ": " << rgdispid[0]);
+
+ if (bIsMethod && cNames > 1)
+ {
+ Reference<XIdlMethod> xIdlMethod;
+ Reference<XIntrospectionAccess> xIntrospectionAccess = m_xInvocation->getIntrospection();
+ try
+ {
+ if (xIntrospectionAccess.is())
+ xIdlMethod = xIntrospectionAccess->getMethod(exactName, MethodConcept::ALL);
+ }
+ catch (const NoSuchMethodException&)
+ {
+ }
+ if (xIdlMethod.is())
+ {
+ auto aParamInfos = xIdlMethod->getParameterInfos();
+ for (unsigned int i = 1; i < cNames; ++i)
+ {
+ for (int j = 0; j < aParamInfos.getLength(); ++j)
+ {
+ if (aParamInfos[j].aName.equalsIgnoreAsciiCase(OUString(o3tl::toU(rgszNames[i]))))
+ {
+ rgdispid[i] = j;
+ SAL_INFO("extensions.olebridge", " " << OUString(o3tl::toU(rgszNames[i])) << ": " << rgdispid[i]);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Return value should be S_OK only if *all* the names were found.
+ unsigned int i;
+ for (i = 0; i < cNames; ++i)
+ if (rgdispid[i] == DISPID_UNKNOWN)
+ break;
+ if (i == cNames)
+ ret = S_OK;
}
}
}