1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski #include "stdafx.h"
23*b1cdbd2cSJim Jagielski #include "UAccCOM2.h"
24*b1cdbd2cSJim Jagielski #include "AccRelation.h"
25*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/XAccessible.hpp>
26*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/XAccessibleContext.hpp>
27*b1cdbd2cSJim Jagielski #include "MAccessible.h"
28*b1cdbd2cSJim Jagielski
29*b1cdbd2cSJim Jagielski using namespace com::sun::star::accessibility;
30*b1cdbd2cSJim Jagielski using namespace com::sun::star::uno;
31*b1cdbd2cSJim Jagielski
32*b1cdbd2cSJim Jagielski /**
33*b1cdbd2cSJim Jagielski * Get relation type.
34*b1cdbd2cSJim Jagielski * @param relationType Variant to get relation type.
35*b1cdbd2cSJim Jagielski * @return Result.
36*b1cdbd2cSJim Jagielski */
get_relationType(BSTR * relationType)37*b1cdbd2cSJim Jagielski STDMETHODIMP CAccRelation::get_relationType(BSTR * relationType)
38*b1cdbd2cSJim Jagielski {
39*b1cdbd2cSJim Jagielski
40*b1cdbd2cSJim Jagielski CHECK_ENABLE_INF
41*b1cdbd2cSJim Jagielski
42*b1cdbd2cSJim Jagielski ENTER_PROTECTED_BLOCK
43*b1cdbd2cSJim Jagielski
44*b1cdbd2cSJim Jagielski if (relationType == NULL)
45*b1cdbd2cSJim Jagielski return E_INVALIDARG;
46*b1cdbd2cSJim Jagielski
47*b1cdbd2cSJim Jagielski int type = relation.RelationType;
48*b1cdbd2cSJim Jagielski SAFE_SYSFREESTRING(*relationType);
49*b1cdbd2cSJim Jagielski
50*b1cdbd2cSJim Jagielski *relationType = getRelationTypeBSTR(type);
51*b1cdbd2cSJim Jagielski return S_OK;
52*b1cdbd2cSJim Jagielski
53*b1cdbd2cSJim Jagielski LEAVE_PROTECTED_BLOCK
54*b1cdbd2cSJim Jagielski }
55*b1cdbd2cSJim Jagielski
56*b1cdbd2cSJim Jagielski // Gets what the type of localized relation is.
get_localizedRelationType(BSTR *)57*b1cdbd2cSJim Jagielski STDMETHODIMP CAccRelation::get_localizedRelationType(BSTR *)
58*b1cdbd2cSJim Jagielski {
59*b1cdbd2cSJim Jagielski
60*b1cdbd2cSJim Jagielski
61*b1cdbd2cSJim Jagielski ENTER_PROTECTED_BLOCK
62*b1cdbd2cSJim Jagielski
63*b1cdbd2cSJim Jagielski return S_OK;
64*b1cdbd2cSJim Jagielski
65*b1cdbd2cSJim Jagielski LEAVE_PROTECTED_BLOCK
66*b1cdbd2cSJim Jagielski }
67*b1cdbd2cSJim Jagielski
68*b1cdbd2cSJim Jagielski /**
69*b1cdbd2cSJim Jagielski * Get targets length.
70*b1cdbd2cSJim Jagielski * @param nTargets Variant to get targets length.
71*b1cdbd2cSJim Jagielski * @return Result.
72*b1cdbd2cSJim Jagielski */
get_nTargets(long * nTargets)73*b1cdbd2cSJim Jagielski STDMETHODIMP CAccRelation::get_nTargets(long * nTargets)
74*b1cdbd2cSJim Jagielski {
75*b1cdbd2cSJim Jagielski
76*b1cdbd2cSJim Jagielski
77*b1cdbd2cSJim Jagielski ENTER_PROTECTED_BLOCK
78*b1cdbd2cSJim Jagielski
79*b1cdbd2cSJim Jagielski CHECK_ENABLE_INF
80*b1cdbd2cSJim Jagielski if (nTargets == NULL)
81*b1cdbd2cSJim Jagielski return E_INVALIDARG;
82*b1cdbd2cSJim Jagielski
83*b1cdbd2cSJim Jagielski Sequence< Reference< XInterface > > xTargets = relation.TargetSet;
84*b1cdbd2cSJim Jagielski *nTargets = xTargets.getLength();
85*b1cdbd2cSJim Jagielski return S_OK;
86*b1cdbd2cSJim Jagielski
87*b1cdbd2cSJim Jagielski LEAVE_PROTECTED_BLOCK
88*b1cdbd2cSJim Jagielski }
89*b1cdbd2cSJim Jagielski
90*b1cdbd2cSJim Jagielski /**
91*b1cdbd2cSJim Jagielski * Get special target.
92*b1cdbd2cSJim Jagielski * @param targetIndex target index.
93*b1cdbd2cSJim Jagielski * @param target Variant to get special target.
94*b1cdbd2cSJim Jagielski * @return Result.
95*b1cdbd2cSJim Jagielski */
get_target(long targetIndex,IUnknown ** target)96*b1cdbd2cSJim Jagielski STDMETHODIMP CAccRelation::get_target(long targetIndex, IUnknown * * target)
97*b1cdbd2cSJim Jagielski {
98*b1cdbd2cSJim Jagielski
99*b1cdbd2cSJim Jagielski CHECK_ENABLE_INF
100*b1cdbd2cSJim Jagielski
101*b1cdbd2cSJim Jagielski ENTER_PROTECTED_BLOCK
102*b1cdbd2cSJim Jagielski
103*b1cdbd2cSJim Jagielski if (target == NULL)
104*b1cdbd2cSJim Jagielski return E_FAIL;
105*b1cdbd2cSJim Jagielski
106*b1cdbd2cSJim Jagielski Sequence< Reference< XInterface > > xTargets = relation.TargetSet;
107*b1cdbd2cSJim Jagielski int nCount = xTargets.getLength();
108*b1cdbd2cSJim Jagielski if( targetIndex >= nCount )
109*b1cdbd2cSJim Jagielski return E_FAIL;
110*b1cdbd2cSJim Jagielski
111*b1cdbd2cSJim Jagielski Reference<XInterface> pRAcc = xTargets[targetIndex];
112*b1cdbd2cSJim Jagielski IAccessible* pRet = NULL;
113*b1cdbd2cSJim Jagielski
114*b1cdbd2cSJim Jagielski BOOL isGet = CMAccessible::get_IAccessibleFromXAccessible((long)pRAcc.get(),&pRet);
115*b1cdbd2cSJim Jagielski if(isGet)
116*b1cdbd2cSJim Jagielski {
117*b1cdbd2cSJim Jagielski *target = /*(IAccessible2 *)*/(IUnknown*)pRet;
118*b1cdbd2cSJim Jagielski pRet->AddRef();
119*b1cdbd2cSJim Jagielski return S_OK;
120*b1cdbd2cSJim Jagielski }
121*b1cdbd2cSJim Jagielski
122*b1cdbd2cSJim Jagielski return E_FAIL;
123*b1cdbd2cSJim Jagielski
124*b1cdbd2cSJim Jagielski LEAVE_PROTECTED_BLOCK
125*b1cdbd2cSJim Jagielski }
126*b1cdbd2cSJim Jagielski
127*b1cdbd2cSJim Jagielski /**
128*b1cdbd2cSJim Jagielski * Get special targets.
129*b1cdbd2cSJim Jagielski * @param maxTargets Special targets count.
130*b1cdbd2cSJim Jagielski * @param target Variant to get special target.
131*b1cdbd2cSJim Jagielski * @param nTargets Variant to accept actual target length.
132*b1cdbd2cSJim Jagielski * @return Result.
133*b1cdbd2cSJim Jagielski */
get_targets(long,IUnknown ** target,long * nTargets)134*b1cdbd2cSJim Jagielski STDMETHODIMP CAccRelation::get_targets(long, IUnknown * * target, long * nTargets)
135*b1cdbd2cSJim Jagielski {
136*b1cdbd2cSJim Jagielski
137*b1cdbd2cSJim Jagielski CHECK_ENABLE_INF
138*b1cdbd2cSJim Jagielski
139*b1cdbd2cSJim Jagielski ENTER_PROTECTED_BLOCK
140*b1cdbd2cSJim Jagielski
141*b1cdbd2cSJim Jagielski // #CHECK#
142*b1cdbd2cSJim Jagielski if(target == NULL)
143*b1cdbd2cSJim Jagielski return E_INVALIDARG;
144*b1cdbd2cSJim Jagielski if (nTargets == NULL)
145*b1cdbd2cSJim Jagielski return E_INVALIDARG;
146*b1cdbd2cSJim Jagielski
147*b1cdbd2cSJim Jagielski Sequence< Reference< XInterface > > xTargets = relation.TargetSet;
148*b1cdbd2cSJim Jagielski int nCount = xTargets.getLength();
149*b1cdbd2cSJim Jagielski
150*b1cdbd2cSJim Jagielski *target = (IUnknown*)::CoTaskMemAlloc(nCount*sizeof(IUnknown));
151*b1cdbd2cSJim Jagielski
152*b1cdbd2cSJim Jagielski // #CHECK Memory Allocation#
153*b1cdbd2cSJim Jagielski if(*target == NULL)
154*b1cdbd2cSJim Jagielski {
155*b1cdbd2cSJim Jagielski return E_FAIL;
156*b1cdbd2cSJim Jagielski }
157*b1cdbd2cSJim Jagielski
158*b1cdbd2cSJim Jagielski for(int i=0; i<nCount ; i++)
159*b1cdbd2cSJim Jagielski {
160*b1cdbd2cSJim Jagielski IUnknown* pAcc = NULL;
161*b1cdbd2cSJim Jagielski HRESULT hr = get_target(i,&pAcc);
162*b1cdbd2cSJim Jagielski if(SUCCEEDED(hr))
163*b1cdbd2cSJim Jagielski target[i] = pAcc;
164*b1cdbd2cSJim Jagielski }
165*b1cdbd2cSJim Jagielski
166*b1cdbd2cSJim Jagielski *nTargets = nCount;
167*b1cdbd2cSJim Jagielski return S_OK;
168*b1cdbd2cSJim Jagielski
169*b1cdbd2cSJim Jagielski LEAVE_PROTECTED_BLOCK
170*b1cdbd2cSJim Jagielski }
171*b1cdbd2cSJim Jagielski
172*b1cdbd2cSJim Jagielski /**
173*b1cdbd2cSJim Jagielski * Put UNO interface.
174*b1cdbd2cSJim Jagielski * @param pXSubInterface AccessibleRelation pointer.
175*b1cdbd2cSJim Jagielski * @return Result.
176*b1cdbd2cSJim Jagielski */
put_XSubInterface(long pXSubInterface)177*b1cdbd2cSJim Jagielski STDMETHODIMP CAccRelation::put_XSubInterface(long pXSubInterface)
178*b1cdbd2cSJim Jagielski {
179*b1cdbd2cSJim Jagielski
180*b1cdbd2cSJim Jagielski relation = *((AccessibleRelation*)pXSubInterface);
181*b1cdbd2cSJim Jagielski return S_OK;
182*b1cdbd2cSJim Jagielski }
183*b1cdbd2cSJim Jagielski
184*b1cdbd2cSJim Jagielski /**
185*b1cdbd2cSJim Jagielski * Get relation type string by type.
186*b1cdbd2cSJim Jagielski * @param type Relation type.
187*b1cdbd2cSJim Jagielski * @return relation type string.
188*b1cdbd2cSJim Jagielski */
getRelationTypeBSTR(int type)189*b1cdbd2cSJim Jagielski BSTR CAccRelation::getRelationTypeBSTR(int type)
190*b1cdbd2cSJim Jagielski {
191*b1cdbd2cSJim Jagielski static struct TYPE_BSTR_MAP
192*b1cdbd2cSJim Jagielski {
193*b1cdbd2cSJim Jagielski LPCTSTR string;
194*b1cdbd2cSJim Jagielski int type;
195*b1cdbd2cSJim Jagielski }
196*b1cdbd2cSJim Jagielski map[] =
197*b1cdbd2cSJim Jagielski {
198*b1cdbd2cSJim Jagielski {_T("INVALID") , 0},
199*b1cdbd2cSJim Jagielski {IA2_RELATION_FLOWS_FROM , 1},
200*b1cdbd2cSJim Jagielski {IA2_RELATION_FLOWS_TO , 2},
201*b1cdbd2cSJim Jagielski {IA2_RELATION_CONTROLLED_BY , 3},
202*b1cdbd2cSJim Jagielski {IA2_RELATION_CONTROLLER_FOR, 4},
203*b1cdbd2cSJim Jagielski {IA2_RELATION_LABEL_FOR , 5},
204*b1cdbd2cSJim Jagielski {IA2_RELATION_LABELED_BY , 6},
205*b1cdbd2cSJim Jagielski {IA2_RELATION_MEMBER_OF , 7},
206*b1cdbd2cSJim Jagielski {IA2_RELATION_SUBWINDOW_OF , 8},
207*b1cdbd2cSJim Jagielski {IA2_RELATION_NODE_CHILD_OF, 9},
208*b1cdbd2cSJim Jagielski {IA2_RELATION_DESCRIBED_BY , 10},
209*b1cdbd2cSJim Jagielski };
210*b1cdbd2cSJim Jagielski
211*b1cdbd2cSJim Jagielski USES_CONVERSION;
212*b1cdbd2cSJim Jagielski
213*b1cdbd2cSJim Jagielski return (type >= 0 && type <= 10) ? T2BSTR(map[type].string) : _T("");
214*b1cdbd2cSJim Jagielski }
215