1*5fdc4257SSteve Yin /************************************************************************* 2*5fdc4257SSteve Yin * 3*5fdc4257SSteve Yin * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*5fdc4257SSteve Yin * 5*5fdc4257SSteve Yin * Copyright IBM Corporation 2010. 6*5fdc4257SSteve Yin * Copyright 2000, 2010 Oracle and/or its affiliates. 7*5fdc4257SSteve Yin * 8*5fdc4257SSteve Yin * OpenOffice.org - a multi-platform office productivity suite 9*5fdc4257SSteve Yin * 10*5fdc4257SSteve Yin * This file is part of OpenOffice.org. 11*5fdc4257SSteve Yin * 12*5fdc4257SSteve Yin * OpenOffice.org is free software: you can redistribute it and/or modify 13*5fdc4257SSteve Yin * it under the terms of the GNU Lesser General Public License version 3 14*5fdc4257SSteve Yin * only, as published by the Free Software Foundation. 15*5fdc4257SSteve Yin * 16*5fdc4257SSteve Yin * OpenOffice.org is distributed in the hope that it will be useful, 17*5fdc4257SSteve Yin * but WITHOUT ANY WARRANTY; without even the implied warranty of 18*5fdc4257SSteve Yin * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19*5fdc4257SSteve Yin * GNU Lesser General Public License version 3 for more details 20*5fdc4257SSteve Yin * (a copy is included in the LICENSE file that accompanied this code). 21*5fdc4257SSteve Yin * 22*5fdc4257SSteve Yin * You should have received a copy of the GNU Lesser General Public License 23*5fdc4257SSteve Yin * version 3 along with OpenOffice.org. If not, see 24*5fdc4257SSteve Yin * <http://www.openoffice.org/license.html> 25*5fdc4257SSteve Yin * for a copy of the LGPLv3 License. 26*5fdc4257SSteve Yin * 27*5fdc4257SSteve Yin ************************************************************************/ 28*5fdc4257SSteve Yin 29*5fdc4257SSteve Yin #include "stdafx.h" 30*5fdc4257SSteve Yin #include "UAccCOM2.h" 31*5fdc4257SSteve Yin #include "AccRelation.h" 32*5fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessible.hpp> 33*5fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleContext.hpp> 34*5fdc4257SSteve Yin #include "MAccessible.h" 35*5fdc4257SSteve Yin 36*5fdc4257SSteve Yin using namespace com::sun::star::accessibility; 37*5fdc4257SSteve Yin using namespace com::sun::star::uno; 38*5fdc4257SSteve Yin 39*5fdc4257SSteve Yin /** 40*5fdc4257SSteve Yin * Get relation type. 41*5fdc4257SSteve Yin * @param relationType Variant to get relation type. 42*5fdc4257SSteve Yin * @return Result. 43*5fdc4257SSteve Yin */ 44*5fdc4257SSteve Yin STDMETHODIMP CAccRelation::get_relationType(BSTR * relationType) 45*5fdc4257SSteve Yin { 46*5fdc4257SSteve Yin 47*5fdc4257SSteve Yin CHECK_ENABLE_INF 48*5fdc4257SSteve Yin 49*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 50*5fdc4257SSteve Yin 51*5fdc4257SSteve Yin if (relationType == NULL) 52*5fdc4257SSteve Yin return E_INVALIDARG; 53*5fdc4257SSteve Yin 54*5fdc4257SSteve Yin int type = relation.RelationType; 55*5fdc4257SSteve Yin SAFE_SYSFREESTRING(*relationType); 56*5fdc4257SSteve Yin 57*5fdc4257SSteve Yin *relationType = getRelationTypeBSTR(type); 58*5fdc4257SSteve Yin return S_OK; 59*5fdc4257SSteve Yin 60*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 61*5fdc4257SSteve Yin } 62*5fdc4257SSteve Yin 63*5fdc4257SSteve Yin // Gets what the type of localized relation is. 64*5fdc4257SSteve Yin STDMETHODIMP CAccRelation::get_localizedRelationType(BSTR *) 65*5fdc4257SSteve Yin { 66*5fdc4257SSteve Yin 67*5fdc4257SSteve Yin 68*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 69*5fdc4257SSteve Yin 70*5fdc4257SSteve Yin return S_OK; 71*5fdc4257SSteve Yin 72*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 73*5fdc4257SSteve Yin } 74*5fdc4257SSteve Yin 75*5fdc4257SSteve Yin /** 76*5fdc4257SSteve Yin * Get targets length. 77*5fdc4257SSteve Yin * @param nTargets Variant to get targets length. 78*5fdc4257SSteve Yin * @return Result. 79*5fdc4257SSteve Yin */ 80*5fdc4257SSteve Yin STDMETHODIMP CAccRelation::get_nTargets(long * nTargets) 81*5fdc4257SSteve Yin { 82*5fdc4257SSteve Yin 83*5fdc4257SSteve Yin 84*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 85*5fdc4257SSteve Yin 86*5fdc4257SSteve Yin CHECK_ENABLE_INF 87*5fdc4257SSteve Yin if (nTargets == NULL) 88*5fdc4257SSteve Yin return E_INVALIDARG; 89*5fdc4257SSteve Yin 90*5fdc4257SSteve Yin Sequence< Reference< XInterface > > xTargets = relation.TargetSet; 91*5fdc4257SSteve Yin *nTargets = xTargets.getLength(); 92*5fdc4257SSteve Yin return S_OK; 93*5fdc4257SSteve Yin 94*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 95*5fdc4257SSteve Yin } 96*5fdc4257SSteve Yin 97*5fdc4257SSteve Yin /** 98*5fdc4257SSteve Yin * Get special target. 99*5fdc4257SSteve Yin * @param targetIndex target index. 100*5fdc4257SSteve Yin * @param target Variant to get special target. 101*5fdc4257SSteve Yin * @return Result. 102*5fdc4257SSteve Yin */ 103*5fdc4257SSteve Yin STDMETHODIMP CAccRelation::get_target(long targetIndex, IUnknown * * target) 104*5fdc4257SSteve Yin { 105*5fdc4257SSteve Yin 106*5fdc4257SSteve Yin CHECK_ENABLE_INF 107*5fdc4257SSteve Yin 108*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 109*5fdc4257SSteve Yin 110*5fdc4257SSteve Yin if (target == NULL) 111*5fdc4257SSteve Yin return E_FAIL; 112*5fdc4257SSteve Yin 113*5fdc4257SSteve Yin Sequence< Reference< XInterface > > xTargets = relation.TargetSet; 114*5fdc4257SSteve Yin int nCount = xTargets.getLength(); 115*5fdc4257SSteve Yin if( targetIndex >= nCount ) 116*5fdc4257SSteve Yin return E_FAIL; 117*5fdc4257SSteve Yin 118*5fdc4257SSteve Yin Reference<XInterface> pRAcc = xTargets[targetIndex]; 119*5fdc4257SSteve Yin IAccessible* pRet = NULL; 120*5fdc4257SSteve Yin 121*5fdc4257SSteve Yin BOOL isGet = CMAccessible::get_IAccessibleFromXAccessible((long)pRAcc.get(),&pRet); 122*5fdc4257SSteve Yin if(isGet) 123*5fdc4257SSteve Yin { 124*5fdc4257SSteve Yin *target = /*(IAccessible2 *)*/(IUnknown*)pRet; 125*5fdc4257SSteve Yin pRet->AddRef(); 126*5fdc4257SSteve Yin return S_OK; 127*5fdc4257SSteve Yin } 128*5fdc4257SSteve Yin 129*5fdc4257SSteve Yin return E_FAIL; 130*5fdc4257SSteve Yin 131*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 132*5fdc4257SSteve Yin } 133*5fdc4257SSteve Yin 134*5fdc4257SSteve Yin /** 135*5fdc4257SSteve Yin * Get special targets. 136*5fdc4257SSteve Yin * @param maxTargets Special targets count. 137*5fdc4257SSteve Yin * @param target Variant to get special target. 138*5fdc4257SSteve Yin * @param nTargets Variant to accept actual target length. 139*5fdc4257SSteve Yin * @return Result. 140*5fdc4257SSteve Yin */ 141*5fdc4257SSteve Yin STDMETHODIMP CAccRelation::get_targets(long, IUnknown * * target, long * nTargets) 142*5fdc4257SSteve Yin { 143*5fdc4257SSteve Yin 144*5fdc4257SSteve Yin CHECK_ENABLE_INF 145*5fdc4257SSteve Yin 146*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 147*5fdc4257SSteve Yin 148*5fdc4257SSteve Yin // #CHECK# 149*5fdc4257SSteve Yin if(target == NULL) 150*5fdc4257SSteve Yin return E_INVALIDARG; 151*5fdc4257SSteve Yin if (nTargets == NULL) 152*5fdc4257SSteve Yin return E_INVALIDARG; 153*5fdc4257SSteve Yin 154*5fdc4257SSteve Yin Sequence< Reference< XInterface > > xTargets = relation.TargetSet; 155*5fdc4257SSteve Yin int nCount = xTargets.getLength(); 156*5fdc4257SSteve Yin 157*5fdc4257SSteve Yin *target = (IUnknown*)::CoTaskMemAlloc(nCount*sizeof(IUnknown)); 158*5fdc4257SSteve Yin 159*5fdc4257SSteve Yin // #CHECK Memory Allocation# 160*5fdc4257SSteve Yin if(*target == NULL) 161*5fdc4257SSteve Yin { 162*5fdc4257SSteve Yin return E_FAIL; 163*5fdc4257SSteve Yin } 164*5fdc4257SSteve Yin 165*5fdc4257SSteve Yin for(int i=0; i<nCount ; i++) 166*5fdc4257SSteve Yin { 167*5fdc4257SSteve Yin IUnknown* pAcc = NULL; 168*5fdc4257SSteve Yin HRESULT hr = get_target(i,&pAcc); 169*5fdc4257SSteve Yin if(SUCCEEDED(hr)) 170*5fdc4257SSteve Yin target[i] = pAcc; 171*5fdc4257SSteve Yin } 172*5fdc4257SSteve Yin 173*5fdc4257SSteve Yin *nTargets = nCount; 174*5fdc4257SSteve Yin return S_OK; 175*5fdc4257SSteve Yin 176*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 177*5fdc4257SSteve Yin } 178*5fdc4257SSteve Yin 179*5fdc4257SSteve Yin /** 180*5fdc4257SSteve Yin * Put UNO interface. 181*5fdc4257SSteve Yin * @param pXSubInterface AccessibleRelation pointer. 182*5fdc4257SSteve Yin * @return Result. 183*5fdc4257SSteve Yin */ 184*5fdc4257SSteve Yin STDMETHODIMP CAccRelation::put_XSubInterface(long pXSubInterface) 185*5fdc4257SSteve Yin { 186*5fdc4257SSteve Yin 187*5fdc4257SSteve Yin relation = *((AccessibleRelation*)pXSubInterface); 188*5fdc4257SSteve Yin return S_OK; 189*5fdc4257SSteve Yin } 190*5fdc4257SSteve Yin 191*5fdc4257SSteve Yin /** 192*5fdc4257SSteve Yin * Get relation type string by type. 193*5fdc4257SSteve Yin * @param type Relation type. 194*5fdc4257SSteve Yin * @return relation type string. 195*5fdc4257SSteve Yin */ 196*5fdc4257SSteve Yin BSTR CAccRelation::getRelationTypeBSTR(int type) 197*5fdc4257SSteve Yin { 198*5fdc4257SSteve Yin static struct TYPE_BSTR_MAP 199*5fdc4257SSteve Yin { 200*5fdc4257SSteve Yin LPCTSTR string; 201*5fdc4257SSteve Yin int type; 202*5fdc4257SSteve Yin } 203*5fdc4257SSteve Yin map[] = 204*5fdc4257SSteve Yin { 205*5fdc4257SSteve Yin {_T("INVALID") , 0}, 206*5fdc4257SSteve Yin {IA2_RELATION_FLOWS_FROM , 1}, 207*5fdc4257SSteve Yin {IA2_RELATION_FLOWS_TO , 2}, 208*5fdc4257SSteve Yin {IA2_RELATION_CONTROLLED_BY , 3}, 209*5fdc4257SSteve Yin {IA2_RELATION_CONTROLLER_FOR, 4}, 210*5fdc4257SSteve Yin {IA2_RELATION_LABEL_FOR , 5}, 211*5fdc4257SSteve Yin {IA2_RELATION_LABELED_BY , 6}, 212*5fdc4257SSteve Yin {IA2_RELATION_MEMBER_OF , 7}, 213*5fdc4257SSteve Yin {IA2_RELATION_SUBWINDOW_OF , 8}, 214*5fdc4257SSteve Yin {IA2_RELATION_NODE_CHILD_OF, 9}, 215*5fdc4257SSteve Yin {IA2_RELATION_DESCRIBED_BY , 10}, 216*5fdc4257SSteve Yin }; 217*5fdc4257SSteve Yin 218*5fdc4257SSteve Yin USES_CONVERSION; 219*5fdc4257SSteve Yin 220*5fdc4257SSteve Yin return (type >= 0 && type <= 10) ? T2BSTR(map[type].string) : _T(""); 221*5fdc4257SSteve Yin } 222