xref: /AOO41X/main/extensions/source/ole/jscriptclasses.cxx (revision 2a97ec55f1442d65917e8c8b82a55ab76c9ff676)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_extensions.hxx"
26 #include "jscriptclasses.hxx"
27 
28 //========================================================================
29 // JScriptValue
30 //========================================================================
JScriptValue()31 JScriptValue::JScriptValue(): m_bOutParam(0), m_bInOutParam(0)
32 {
33 }
34 
~JScriptValue()35 JScriptValue::~JScriptValue()
36 {
37 }
38 
39 
40 // JScriptValue, IDispatch --------------------------------------------
GetTypeInfoCount(UINT *)41 STDMETHODIMP JScriptValue::GetTypeInfoCount(UINT* /*pctinfo*/)
42 {
43     return E_NOTIMPL;
44 }
45 
46 // JScriptValue, IDispatch --------------------------------------------
GetTypeInfo(UINT,LCID,ITypeInfo **)47 STDMETHODIMP JScriptValue::GetTypeInfo( UINT /*iTInfo*/,
48                                            LCID /*lcid*/,
49                                            ITypeInfo** /*ppTInfo*/)
50 {
51     return E_NOTIMPL;
52 }
53 
54 // JScriptValue, IDispatch --------------------------------------------
GetIDsOfNames(REFIID,LPOLESTR * rgszNames,UINT,LCID,DISPID * rgDispId)55 STDMETHODIMP JScriptValue::GetIDsOfNames( REFIID /*riid*/,
56                                              LPOLESTR *rgszNames,
57                                              UINT /*cNames*/,
58                                              LCID /*lcid*/,
59                                              DISPID *rgDispId)
60 {
61     if( !rgDispId)
62         return E_POINTER;
63 
64 
65     HRESULT ret= S_OK;
66     CComBSTR name(*rgszNames);
67     name.ToLower();
68 
69     if( name == CComBSTR( L"set") )
70         *rgDispId= 1;
71     else if( name == CComBSTR( L"get") )
72         *rgDispId= 2;
73     else if( name == CComBSTR( L"initoutparam") )
74         *rgDispId= 3;
75     else if( name == CComBSTR( L"initinoutparam") )
76         *rgDispId= 4;
77     else
78         ret= DISP_E_UNKNOWNNAME;
79 
80     return ret;
81 }
82 
83 // JScriptValue, IDispatch --------------------------------------------
Invoke(DISPID dispIdMember,REFIID,LCID,WORD wFlags,DISPPARAMS * pDispParams,VARIANT * pVarResult,EXCEPINFO *,UINT *)84 STDMETHODIMP JScriptValue::Invoke( DISPID dispIdMember,
85                          REFIID /*riid*/,
86                          LCID /*lcid*/,
87                          WORD wFlags,
88                          DISPPARAMS *pDispParams,
89                          VARIANT *pVarResult,
90                          EXCEPINFO* /*pExcepInfo*/,
91                          UINT* /*puArgErr*/)
92 {
93     if( pDispParams->cNamedArgs)
94         return DISP_E_NONAMEDARGS;
95 
96 
97     HRESULT ret= S_OK;
98     switch( dispIdMember)
99     {
100     case 0: // DISPID_VALUE
101         if( wFlags & DISPATCH_PROPERTYGET && pVarResult)
102         {
103             if( FAILED( VariantCopy( pVarResult, &m_varValue)))
104                 ret= E_FAIL;
105         }
106         else
107             ret= E_POINTER;
108         break;
109     case 1:
110         if( wFlags & DISPATCH_METHOD)
111             ret= Set( pDispParams->rgvarg[1], pDispParams->rgvarg[0]);
112         if( FAILED( ret))
113             ret= DISP_E_EXCEPTION;
114         break;
115     case 2:
116         if( wFlags & DISPATCH_METHOD)
117             ret= Get( pVarResult);
118         if( FAILED( ret))
119             ret= DISP_E_EXCEPTION;
120         break;
121     case 3:
122         if( wFlags & DISPATCH_METHOD)
123             ret= InitOutParam();
124         if( FAILED( ret))
125             ret= DISP_E_EXCEPTION;
126         break;
127     case 4:
128         if( wFlags & DISPATCH_METHOD)
129             ret= InitInOutParam( pDispParams->rgvarg[1], pDispParams->rgvarg[0]);
130         if( FAILED( ret))
131             ret= DISP_E_EXCEPTION;
132         break;
133     default:
134         ret= DISP_E_MEMBERNOTFOUND;
135         break;
136     }
137 
138     return ret;
139 }
140 
141 // JScriptValue, IScriptOutParam-----------------------
Set(VARIANT type,VARIANT value)142 STDMETHODIMP JScriptValue::Set( VARIANT type, VARIANT value)
143 {
144     Lock();
145     HRESULT hr= S_OK;
146     m_varValue.Clear();
147     hr= VariantCopyInd( &m_varValue, &value);
148     VARIANT var;
149     VariantInit( &var);
150     if( SUCCEEDED( hr= VariantChangeType( &var, &type, 0, VT_BSTR)))
151         m_bstrType= var.bstrVal;
152     Unlock();
153     return hr;
154 }
155 // JScriptValue, IScriptOutParam-----------------------
Get(VARIANT * val)156 STDMETHODIMP JScriptValue::Get( VARIANT *val)
157 {
158     Lock();
159     if( !val)
160         return E_POINTER;
161     HRESULT hr= VariantCopy( val, &m_varValue);
162     Unlock();
163     return hr;
164 }
165 
InitOutParam()166 STDMETHODIMP JScriptValue::InitOutParam()
167 {
168     Lock();
169     m_varValue.Clear();
170     m_bOutParam= true;
171     m_bInOutParam= false;
172     Unlock();
173     return S_OK;
174 }
175 
InitInOutParam(VARIANT type,VARIANT value)176 STDMETHODIMP JScriptValue::InitInOutParam( VARIANT type, VARIANT value)
177 {
178     Lock();
179     m_bInOutParam= true;
180     m_bOutParam= false;
181     Unlock();
182     return Set( type, value);
183 }
184 
IsOutParam(VARIANT_BOOL * flag)185 STDMETHODIMP JScriptValue::IsOutParam( VARIANT_BOOL * flag)
186 {
187     Lock();
188     if( !flag)
189         return E_POINTER;
190     *flag= m_bOutParam ? VARIANT_TRUE : VARIANT_FALSE;
191     Unlock();
192     return S_OK;
193 }
194 
IsInOutParam(VARIANT_BOOL * flag)195 STDMETHODIMP JScriptValue::IsInOutParam( VARIANT_BOOL * flag)
196 {
197     Lock();
198     if( !flag)
199         return E_POINTER;
200     *flag= m_bInOutParam ? VARIANT_TRUE : VARIANT_FALSE;
201     Unlock();
202     return S_OK;
203 }
204 
GetValue(BSTR * type,VARIANT * value)205 STDMETHODIMP JScriptValue::GetValue( BSTR* type, VARIANT *value)
206 {
207     Lock();
208     if( !type || !value)
209         return E_POINTER;
210     HRESULT hr;
211     if( SUCCEEDED(  hr= m_bstrType.CopyTo( type)))
212         hr= VariantCopy( value, &m_varValue);
213     Unlock();
214     return hr;
215 }
216 
217 //##########################################################################################
218 // JScriptOutValue
219 //##########################################################################################
220 
JScriptOutParam()221 JScriptOutParam::JScriptOutParam()
222 {
223 }
224 
~JScriptOutParam()225 JScriptOutParam::~JScriptOutParam()
226 {
227 }
228 
229 
230 // JScriptOutParam, IDispatch --------------------------------------------
GetTypeInfoCount(UINT *)231 STDMETHODIMP JScriptOutParam::GetTypeInfoCount(UINT* /*pctinfo*/)
232 {
233     return E_NOTIMPL;
234 }
235 
236 // JScriptOutParam, IDispatch --------------------------------------------
GetTypeInfo(UINT,LCID,ITypeInfo **)237 STDMETHODIMP JScriptOutParam::GetTypeInfo( UINT /*iTInfo*/,
238                                            LCID /*lcid*/,
239                                            ITypeInfo** /*ppTInfo*/)
240 {
241     return E_NOTIMPL;
242 }
243 
244 // JScriptOutParam, IDispatch --------------------------------------------
GetIDsOfNames(REFIID,LPOLESTR * rgszNames,UINT,LCID,DISPID * rgDispId)245 STDMETHODIMP JScriptOutParam::GetIDsOfNames( REFIID /*riid*/,
246                                              LPOLESTR *rgszNames,
247                                              UINT /*cNames*/,
248                                              LCID /*lcid*/,
249                                              DISPID *rgDispId)
250 {
251     if( !rgDispId)
252         return E_POINTER;
253 
254 
255     HRESULT ret= S_OK;
256     CComBSTR name(*rgszNames);
257     name.ToLower();
258 
259     if( name == CComBSTR( L"0") )
260         *rgDispId= 1;
261     else
262         ret= DISP_E_UNKNOWNNAME;
263 
264     return ret;
265 }
266 
267 // JScriptOutParam, IDispatch --------------------------------------------
Invoke(DISPID dispIdMember,REFIID,LCID,WORD wFlags,DISPPARAMS * pDispParams,VARIANT * pVarResult,EXCEPINFO *,UINT *)268 STDMETHODIMP JScriptOutParam::Invoke( DISPID dispIdMember,
269                          REFIID /*riid*/,
270                          LCID /*lcid*/,
271                          WORD wFlags,
272                          DISPPARAMS *pDispParams,
273                          VARIANT *pVarResult,
274                          EXCEPINFO* /*pExcepInfo*/,
275                          UINT* /*puArgErr*/)
276 {
277     HRESULT ret= S_OK;
278     switch( dispIdMember)
279     {
280     case 0: // DISPID_VALUE
281         if( wFlags & DISPATCH_PROPERTYGET && pVarResult)
282         {
283             if( FAILED( VariantCopy( pVarResult, &m_varValue)))
284                 ret= E_FAIL;
285         }
286         else if( wFlags & DISPATCH_PROPERTYPUT || wFlags & DISPATCH_PROPERTYPUTREF)
287         {
288             m_varValue.Clear();
289             if( FAILED( VariantCopyInd( &m_varValue, &pDispParams->rgvarg[0])))
290                 ret= E_FAIL;
291         }
292         else
293             ret= E_POINTER;
294         break;
295     case 1: //
296         if( wFlags & DISPATCH_PROPERTYGET && pVarResult)
297         {
298             if( FAILED( VariantCopy( pVarResult, &m_varValue)))
299                 ret= E_FAIL;
300         }
301         else if( wFlags & DISPATCH_PROPERTYPUT || wFlags & DISPATCH_PROPERTYPUTREF)
302         {
303             m_varValue.Clear();
304             if( FAILED( VariantCopyInd( &m_varValue, &pDispParams->rgvarg[0])))
305                 ret= E_FAIL;
306         }
307         else
308             ret= E_POINTER;
309         break;
310 
311     default:
312         ret= DISP_E_MEMBERNOTFOUND;
313         break;
314     }
315 
316     return ret;
317 }
318