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