1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_extensions.hxx"
30 #include "unotypewrapper.hxx"
31 #include "rtl/ustring.hxx"
32 
33 
34 bool createUnoTypeWrapper(BSTR sTypeName, VARIANT * pVar)
35 {
36     bool ret = false;
37     OSL_ASSERT(sTypeName && pVar);
38     CComObject< UnoTypeWrapper>* pObj;
39     VariantClear(pVar);
40     if( SUCCEEDED( CComObject<UnoTypeWrapper>::CreateInstance( &pObj)))
41     {
42         pObj->AddRef();
43         pVar->vt= VT_DISPATCH;
44 #ifdef __MINGW32__
45         pVar->pdispVal= CComQIPtr<IDispatch, &__uuidof(IDispatch)>(pObj->GetUnknown());
46 #else
47         pVar->pdispVal= CComQIPtr<IDispatch>(pObj->GetUnknown());
48 #endif
49         //now set the value, e.i. the name of the type
50 #ifdef __MINGW32__
51         CComQIPtr<IUnoTypeWrapper, &__uuidof(IUnoTypeWrapper)> spType(pVar->pdispVal);
52 #else
53         CComQIPtr<IUnoTypeWrapper> spType(pVar->pdispVal);
54 #endif
55         OSL_ASSERT(spType);
56         if (SUCCEEDED(spType->put_Name(sTypeName)))
57         {
58             ret = true;
59         }
60     }
61     return ret;
62 }
63 
64 
65 bool createUnoTypeWrapper(const rtl::OUString& sTypeName, VARIANT * pVar)
66 {
67     CComBSTR bstr(reinterpret_cast<LPCOLESTR>(sTypeName.getStr()));
68     return createUnoTypeWrapper(bstr, pVar);
69 }
70 
71 UnoTypeWrapper::UnoTypeWrapper()
72 {
73 }
74 
75 UnoTypeWrapper::~UnoTypeWrapper()
76 {
77 }
78 
79 
80 // UnoTypeWrapper, IDispatch --------------------------------------------
81 STDMETHODIMP UnoTypeWrapper::GetTypeInfoCount(UINT* /*pctinfo*/)
82 {
83 	return E_NOTIMPL;
84 }
85 
86 // UnoTypeWrapper, IDispatch --------------------------------------------
87 STDMETHODIMP UnoTypeWrapper::GetTypeInfo( UINT /*iTInfo*/,
88                                           LCID /*lcid*/,
89                                           ITypeInfo** /*ppTInfo*/)
90 {
91 	return E_NOTIMPL;
92 }
93 
94 // UnoTypeWrapper, IDispatch --------------------------------------------
95 STDMETHODIMP UnoTypeWrapper::GetIDsOfNames( REFIID /*riid*/,
96                                             LPOLESTR *rgszNames,
97                                             UINT /*cNames*/,
98                                             LCID /*lcid*/,
99                                             DISPID *rgDispId)
100 {
101 	if( !rgDispId)
102 		return E_POINTER;
103 
104 	HRESULT ret= S_OK;
105 	CComBSTR name(*rgszNames);
106 	name.ToLower();
107 
108 	if( name == CComBSTR( L"name") )
109 		*rgDispId= DISPID_VALUE;
110 	else
111 		ret= DISP_E_UNKNOWNNAME;
112 
113 	return ret;
114 }
115 
116 // UnoTypeWrapper, IDispatch --------------------------------------------
117 STDMETHODIMP UnoTypeWrapper::Invoke( DISPID dispIdMember,
118 						 REFIID /*riid*/,
119 						 LCID /*lcid*/,
120 						 WORD wFlags,
121 						 DISPPARAMS *pDispParams,
122 						 VARIANT *pVarResult,
123 						 EXCEPINFO* /*pExcepInfo*/,
124 						 UINT* /*puArgErr*/)
125 {
126     if (pDispParams == NULL)
127         return DISP_E_EXCEPTION;
128 
129     if( pDispParams->cNamedArgs)
130 		return DISP_E_NONAMEDARGS;
131 
132 
133 	HRESULT ret= S_OK;
134 	switch( dispIdMember)
135 	{
136 	case DISPID_VALUE: // DISPID_VALUE
137 		if (wFlags & DISPATCH_PROPERTYGET)
138 		{
139             if (pVarResult == NULL)
140             {
141                 ret = E_POINTER;
142                 break;
143             }
144 			get_Name( & pVarResult->bstrVal);
145             pVarResult->vt = VT_BSTR;
146 		}
147 		break;
148 	default:
149 		ret= DISP_E_MEMBERNOTFOUND;
150 		break;
151  	}
152 
153 	return ret;
154 }
155 
156 // IUnoTypeWrapper-----------------------
157 STDMETHODIMP UnoTypeWrapper::put_Name(BSTR  val)
158 {
159  	Lock();
160  	HRESULT hr = S_OK;
161     m_sName = val;
162  	Unlock();
163  	return hr;
164 }
165 
166 // (UnoTypeWrapper-----------------------
167 STDMETHODIMP UnoTypeWrapper::get_Name(BSTR  *pVal)
168 {
169  	Lock();
170     HRESULT hr = S_OK;
171  	if( !pVal)
172  		return E_POINTER;
173     *pVal = m_sName.Copy();
174  	Unlock();
175  	return hr;
176 }
177 
178 
179 
180