xref: /AOO41X/main/extensions/source/ole/unotypewrapper.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 "unotypewrapper.hxx"
27 #include "rtl/ustring.hxx"
28 
29 
createUnoTypeWrapper(BSTR sTypeName,VARIANT * pVar)30 bool createUnoTypeWrapper(BSTR sTypeName, VARIANT * pVar)
31 {
32     bool ret = false;
33     OSL_ASSERT(sTypeName && pVar);
34     CComObject< UnoTypeWrapper>* pObj;
35     VariantClear(pVar);
36     if( SUCCEEDED( CComObject<UnoTypeWrapper>::CreateInstance( &pObj)))
37     {
38         pObj->AddRef();
39         pVar->vt= VT_DISPATCH;
40 #ifdef __MINGW32__
41         pVar->pdispVal= CComQIPtr<IDispatch, &__uuidof(IDispatch)>(pObj->GetUnknown());
42 #else
43         pVar->pdispVal= CComQIPtr<IDispatch>(pObj->GetUnknown());
44 #endif
45         //now set the value, e.i. the name of the type
46 #ifdef __MINGW32__
47         CComQIPtr<IUnoTypeWrapper, &__uuidof(IUnoTypeWrapper)> spType(pVar->pdispVal);
48 #else
49         CComQIPtr<IUnoTypeWrapper> spType(pVar->pdispVal);
50 #endif
51         OSL_ASSERT(spType);
52         if (SUCCEEDED(spType->put_Name(sTypeName)))
53         {
54             ret = true;
55         }
56     }
57     return ret;
58 }
59 
60 
createUnoTypeWrapper(const rtl::OUString & sTypeName,VARIANT * pVar)61 bool createUnoTypeWrapper(const rtl::OUString& sTypeName, VARIANT * pVar)
62 {
63     CComBSTR bstr(reinterpret_cast<LPCOLESTR>(sTypeName.getStr()));
64     return createUnoTypeWrapper(bstr, pVar);
65 }
66 
UnoTypeWrapper()67 UnoTypeWrapper::UnoTypeWrapper()
68 {
69 }
70 
~UnoTypeWrapper()71 UnoTypeWrapper::~UnoTypeWrapper()
72 {
73 }
74 
75 
76 // UnoTypeWrapper, IDispatch --------------------------------------------
GetTypeInfoCount(UINT *)77 STDMETHODIMP UnoTypeWrapper::GetTypeInfoCount(UINT* /*pctinfo*/)
78 {
79     return E_NOTIMPL;
80 }
81 
82 // UnoTypeWrapper, IDispatch --------------------------------------------
GetTypeInfo(UINT,LCID,ITypeInfo **)83 STDMETHODIMP UnoTypeWrapper::GetTypeInfo( UINT /*iTInfo*/,
84                                           LCID /*lcid*/,
85                                           ITypeInfo** /*ppTInfo*/)
86 {
87     return E_NOTIMPL;
88 }
89 
90 // UnoTypeWrapper, IDispatch --------------------------------------------
GetIDsOfNames(REFIID,LPOLESTR * rgszNames,UINT,LCID,DISPID * rgDispId)91 STDMETHODIMP UnoTypeWrapper::GetIDsOfNames( REFIID /*riid*/,
92                                             LPOLESTR *rgszNames,
93                                             UINT /*cNames*/,
94                                             LCID /*lcid*/,
95                                             DISPID *rgDispId)
96 {
97     if( !rgDispId)
98         return E_POINTER;
99 
100     HRESULT ret= S_OK;
101     CComBSTR name(*rgszNames);
102     name.ToLower();
103 
104     if( name == CComBSTR( L"name") )
105         *rgDispId= DISPID_VALUE;
106     else
107         ret= DISP_E_UNKNOWNNAME;
108 
109     return ret;
110 }
111 
112 // UnoTypeWrapper, IDispatch --------------------------------------------
Invoke(DISPID dispIdMember,REFIID,LCID,WORD wFlags,DISPPARAMS * pDispParams,VARIANT * pVarResult,EXCEPINFO *,UINT *)113 STDMETHODIMP UnoTypeWrapper::Invoke( DISPID dispIdMember,
114                          REFIID /*riid*/,
115                          LCID /*lcid*/,
116                          WORD wFlags,
117                          DISPPARAMS *pDispParams,
118                          VARIANT *pVarResult,
119                          EXCEPINFO* /*pExcepInfo*/,
120                          UINT* /*puArgErr*/)
121 {
122     if (pDispParams == NULL)
123         return DISP_E_EXCEPTION;
124 
125     if( pDispParams->cNamedArgs)
126         return DISP_E_NONAMEDARGS;
127 
128 
129     HRESULT ret= S_OK;
130     switch( dispIdMember)
131     {
132     case DISPID_VALUE: // DISPID_VALUE
133         if (wFlags & DISPATCH_PROPERTYGET)
134         {
135             if (pVarResult == NULL)
136             {
137                 ret = E_POINTER;
138                 break;
139             }
140             get_Name( & pVarResult->bstrVal);
141             pVarResult->vt = VT_BSTR;
142         }
143         break;
144     default:
145         ret= DISP_E_MEMBERNOTFOUND;
146         break;
147     }
148 
149     return ret;
150 }
151 
152 // IUnoTypeWrapper-----------------------
put_Name(BSTR val)153 STDMETHODIMP UnoTypeWrapper::put_Name(BSTR  val)
154 {
155     Lock();
156     HRESULT hr = S_OK;
157     m_sName = val;
158     Unlock();
159     return hr;
160 }
161 
162 // (UnoTypeWrapper-----------------------
get_Name(BSTR * pVal)163 STDMETHODIMP UnoTypeWrapper::get_Name(BSTR  *pVal)
164 {
165     Lock();
166     HRESULT hr = S_OK;
167     if( !pVal)
168         return E_POINTER;
169     *pVal = m_sName.Copy();
170     Unlock();
171     return hr;
172 }
173 
174 
175 
176