3b86569fcb
This is an alternative (to 732ec36edf
)
solution to the "CoCreateInstance does not work" problem:
replace all CoCreateInstance calls with equivalent calls to create
the components directly.
Since the only reason why this COM stuff needs to be registered
at all is that AccObject uses CoCreateInstance() to create its
COM objects, another possible solution appears to be to simply link
the libraries and instantiate the COM objects directly, without COM.
The only difference appears to be that CoCreateInstance would
automatically add proxy objects in case the COM objects reside in a
single-threaded appartment; not sure if that is relevant here.
Change-Id: I8ffb8af501f6084f3145fa4d4f53366a070e1691
Reviewed-on: https://gerrit.libreoffice.org/6792
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Tested-by: Michael Meeks <michael.meeks@collabora.com>
230 lines
6.3 KiB
C++
230 lines
6.3 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This file is part of the LibreOffice project.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* This file incorporates work covered by the following license notice:
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
* with this work for additional information regarding copyright
|
|
* ownership. The ASF licenses this file to you under the Apache
|
|
* License, Version 2.0 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
*/
|
|
|
|
#include "stdafx.h"
|
|
#include "UAccCOM.h"
|
|
#include "EnumVariant.h"
|
|
#include "MAccessible.h"
|
|
|
|
#include "act.hxx"
|
|
|
|
|
|
using namespace com::sun::star::uno;
|
|
using namespace com::sun::star::accessibility;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CEnumVariant
|
|
|
|
|
|
|
|
/**
|
|
* enumarate method,get next element
|
|
* @param cElements The number of elements to be returned.
|
|
* @param pvar An array of at least size celt in which the elements are to be returned.
|
|
* @param pcElementFetched Pointer to the number of elements returned in rgVar, or Null¡£
|
|
* @return Result.
|
|
*/
|
|
HRESULT STDMETHODCALLTYPE CEnumVariant::Next(ULONG cElements,VARIANT __RPC_FAR *pvar,ULONG __RPC_FAR *pcElementFetched)
|
|
{
|
|
long l1;
|
|
ULONG l2;
|
|
|
|
if (pvar == NULL)
|
|
return E_INVALIDARG;
|
|
|
|
CHECK_ENABLE_INF
|
|
if (pcElementFetched != NULL)
|
|
*pcElementFetched = 0;
|
|
|
|
// Retrieve the next cElements.
|
|
for (l1=m_lCurrent, l2=0; l1<m_pXAccessibleSelection->getSelectedAccessibleChildCount() &&
|
|
l2<cElements; l1++, l2++)
|
|
{
|
|
Reference< XAccessible > pRXAcc = m_pXAccessibleSelection->getSelectedAccessibleChild(l1);
|
|
IAccessible* pChild = NULL;
|
|
BOOL isGet = CMAccessible::get_IAccessibleFromXAccessible(pRXAcc.get(),
|
|
&pChild);
|
|
if(isGet)
|
|
{
|
|
pvar[l2].vt = VT_I4;
|
|
((IMAccessible*)pChild)->Get_XAccChildID(&pvar[l2].lVal);
|
|
}
|
|
else if(pRXAcc.is())
|
|
{
|
|
if(CMAccessible::g_pAgent)
|
|
CMAccessible::g_pAgent->InsertAccObj(pRXAcc.get(),pUNOInterface);
|
|
BOOL isGet = CMAccessible::get_IAccessibleFromXAccessible(
|
|
pRXAcc.get(), &pChild);
|
|
if(isGet)
|
|
{
|
|
pvar[l2].vt = VT_I4;
|
|
((IMAccessible*)pChild)->Get_XAccChildID(&pvar[l2].lVal);
|
|
}
|
|
}
|
|
}
|
|
// Set count of elements retrieved.
|
|
if (pcElementFetched != NULL)
|
|
*pcElementFetched = l2;
|
|
m_lCurrent = l1;
|
|
|
|
return (l2 < cElements) ? S_FALSE : NOERROR;
|
|
}
|
|
|
|
/**
|
|
* skip the elements in the given range when enumarate elements
|
|
* @param cElements The number of elements to skip.
|
|
* @return Result.
|
|
*/
|
|
HRESULT STDMETHODCALLTYPE CEnumVariant::Skip(ULONG cElements)
|
|
{
|
|
CHECK_ENABLE_INF
|
|
m_lCurrent += cElements;
|
|
if (m_lCurrent > (long)(m_lLBound+m_pXAccessibleSelection->getSelectedAccessibleChildCount()))
|
|
{
|
|
m_lCurrent = m_lLBound+m_pXAccessibleSelection->getSelectedAccessibleChildCount();
|
|
return E_FAIL;
|
|
}
|
|
else
|
|
return NOERROR;
|
|
}
|
|
|
|
|
|
/**
|
|
* reset the enumaration position to initial value
|
|
* @param
|
|
* @return Result.
|
|
*/
|
|
HRESULT STDMETHODCALLTYPE CEnumVariant::Reset( void)
|
|
{
|
|
m_lCurrent = m_lLBound;
|
|
return NOERROR;
|
|
}
|
|
|
|
|
|
/**
|
|
*create a new IEnumVariant object,
|
|
*copy current enumaration container and its state to
|
|
*the new object
|
|
*AT will use the copy object to get elements
|
|
* @param ppenum On return, pointer to the location of the clone enumerator¡£
|
|
* @return Result.
|
|
*/
|
|
HRESULT STDMETHODCALLTYPE CEnumVariant::Clone(IEnumVARIANT __RPC_FAR *__RPC_FAR *ppenum)
|
|
{
|
|
CEnumVariant * penum = NULL;
|
|
HRESULT hr;
|
|
if (ppenum == NULL)
|
|
return E_INVALIDARG;
|
|
|
|
*ppenum = NULL;
|
|
|
|
hr = Create(&penum);
|
|
if( hr == S_OK )
|
|
{
|
|
penum->PutSelection(reinterpret_cast<hyper>(pUNOInterface));
|
|
*ppenum = penum;
|
|
}
|
|
else
|
|
{
|
|
if (penum)
|
|
penum->Release();
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
/**
|
|
*Static public method to create a CLSID_EnumVariant com object.
|
|
* @param ppenum Pointer to accept com object.
|
|
* @return Result.
|
|
*/
|
|
HRESULT STDMETHODCALLTYPE CEnumVariant::Create(CEnumVariant __RPC_FAR *__RPC_FAR *ppenum)
|
|
{
|
|
HRESULT hr = createInstance<CEnumVariant>(IID_IEnumVariant, ppenum);
|
|
if (S_OK != hr)
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
/**
|
|
*Return count of elements in current container
|
|
* @param.
|
|
* @return count of elements in current container.
|
|
*/
|
|
long CEnumVariant::GetCountOfElements()
|
|
{
|
|
CHECK_ENABLE_INF_ZERO
|
|
|
|
if(m_pXAccessibleSelection.is())
|
|
return m_pXAccessibleSelection->getSelectedAccessibleChildCount();
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Set memeber m_pXAccessibleSelection to NULL and m_lCurrent to m_lLBound.
|
|
* @param.
|
|
* @return Result
|
|
*/
|
|
STDMETHODIMP CEnumVariant::ClearEnumeration()
|
|
{
|
|
pUNOInterface = NULL;
|
|
m_pXAccessibleSelection = NULL;
|
|
m_lCurrent = m_lLBound;
|
|
return S_OK;
|
|
}
|
|
|
|
/**
|
|
*Static method to fetch XAccessibleSelection
|
|
* @param pXAcc XAccessible interface.
|
|
* @return XAccessibleSelection interface.
|
|
*/
|
|
static Reference<XAccessibleSelection> GetXAccessibleSelection(XAccessible* pXAcc)
|
|
{
|
|
XAccessibleSelection* pSelection = NULL;
|
|
Reference< XAccessibleContext > pRContext;
|
|
|
|
if( pXAcc == NULL)
|
|
return NULL;
|
|
|
|
pRContext = pXAcc->getAccessibleContext();
|
|
if( !pRContext.is() )
|
|
return NULL;
|
|
|
|
Reference< XAccessibleSelection > pRSelection(pRContext,UNO_QUERY);
|
|
if( !pRSelection.is() )
|
|
return NULL;
|
|
|
|
return pRSelection;
|
|
}
|
|
|
|
/**
|
|
* Put valid UNO XAccessible interface.
|
|
* @param pXSelection XAccessible interface.
|
|
* @return Result..
|
|
*/
|
|
STDMETHODIMP CEnumVariant::PutSelection(hyper pXSelection)
|
|
{
|
|
pUNOInterface = reinterpret_cast<XAccessible*>(pXSelection);
|
|
m_pXAccessibleSelection = GetXAccessibleSelection(pUNOInterface);
|
|
return S_OK;
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|