xref: /trunk/main/extensions/test/ole/OleConverterVar1/smartarray.h (revision fc9fd3f14a55d77b35643a64034752a178b2a5b0)
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 #ifndef _SMARTARRAY_H
28 #define _SMARTARRAY_H
29 
30 
31 template< class sourceType>
32 class SmartArray
33 {
34     SAFEARRAY *m_array;
35 public:
36 
37     SmartArray( sourceType * parParams, int count, VARTYPE destVartype): m_array(NULL)
38     {
39         HRESULT hr= S_OK;
40         SAFEARRAYBOUND rgsabound[1];
41         rgsabound[0].cElements= count;
42         rgsabound[0].lLbound= 0;
43         m_array= SafeArrayCreate( destVartype, 1, rgsabound);
44         SafeArrayLock( m_array);
45 
46         void* pData;
47         if( m_array && (SUCCEEDED( SafeArrayAccessData( m_array, (void**)&pData)) ) )
48         {
49 
50             for( int i=0; i< count; i++)
51             {
52                 CComVariant varSource( parParams[i]);
53                 switch (destVartype)
54                 {
55                 case VT_I1:
56                     {
57                         char* p= (char*) pData;
58                         if( SUCCEEDED( hr= varSource.ChangeType( destVartype)))
59                             p[i]= V_I1( &varSource);
60                         break;
61                     }
62                 case VT_I2:
63                     {
64                         short* p= (short*) pData;
65                         if( SUCCEEDED( hr=varSource.ChangeType( destVartype)))
66                             p[i]= V_I2( &varSource);
67                         break;
68                     }
69                 case VT_UI2:
70                     {
71                         unsigned short* p= (unsigned short*) pData;
72                         if( SUCCEEDED( hr=varSource.ChangeType( destVartype)))
73                             p[i]= V_UI2( &varSource);
74                         break;
75                     }
76                 case VT_I4:
77                     {
78                         long* p= (long*)pData;
79                     if( SUCCEEDED( hr=varSource.ChangeType( destVartype)))
80                         p[i]= V_I4( &varSource);
81                     break;
82                     }
83                 case VT_UI4:
84                     {
85                         unsigned long* p= (unsigned long*)pData;
86                         if( SUCCEEDED( hr=varSource.ChangeType( destVartype)))
87                         p[i]= V_UI4( &varSource);
88                         break;
89                     }
90                 case VT_R4:
91                     {
92                         float* p= (float*)pData;
93                     if( SUCCEEDED( hr=varSource.ChangeType( destVartype)))
94                         p[i]= V_R4( &varSource);
95                         break;
96                     }
97                 case VT_R8:
98                     {
99                         double* p= (double*)pData;
100                         if( SUCCEEDED( hr=varSource.ChangeType( destVartype)))
101                         p[i]= V_R8( &varSource);
102                         break;
103                     }
104                 case VT_BOOL:
105                     {
106                         VARIANT_BOOL* p= (VARIANT_BOOL*)pData;
107                         if( SUCCEEDED( hr=varSource.ChangeType( destVartype)))
108                         p[i]= V_BOOL( &varSource);
109                         break;
110                     }
111                 case VT_BSTR:
112                     {
113                     BSTR* pBstr= ( BSTR*)pData;
114                     if( SUCCEEDED( hr=varSource.ChangeType( destVartype)))
115                         pBstr[i]= SysAllocString(V_BSTR( &varSource));
116                     break;
117                     }
118                 case VT_VARIANT:
119                     {
120                         VARIANT *pVariant= (VARIANT*)pData;
121                         hr= VariantCopy( &pVariant[i], &varSource); break;
122                     }
123 //              case VT_UNKNOWN:
124 //                  {
125 //                      long* pUnk= (long*)pData;
126 //                      pUnk[i]= reinterpret_cast<long>(parParams[i]);
127 //                      ((IUnknown*)pUnk[i])->AddRef(); break;
128 //                  }
129 //              case VT_DISPATCH:
130 //                  {
131 //                      long* pDisp= (long*)pData;
132 //                      pDisp[i]= (long)parParams[i];
133 //                      ((IDispatch*)pDisp[i])->AddRef(); break;
134 //                  }
135                 default:
136                     hr= E_FAIL;
137                 }
138             }
139             if( FAILED( hr))
140             {
141                 SafeArrayDestroy( m_array);
142                 m_array= NULL;
143             }
144         }
145         SafeArrayUnaccessData( m_array);
146     }
147     ~SmartArray(){
148         SafeArrayUnlock( m_array);
149         SafeArrayDestroy( m_array );
150     }
151 
152     operator bool (){ return m_array == NULL ?  false : true; }
153 
154     operator SAFEARRAY* (){ return m_array;}
155 
156 };
157 
158 template<>
159 class SmartArray<IUnknown*>
160 {
161     SAFEARRAY *m_array;
162 public:
163 
164     SmartArray( sourceType * parParams, int count, VARTYPE destVartype);
165 //  {
166 //      ATLTRACE("SmartArray<IUnknown>");
167 //      HRESULT hr= S_OK;
168 //      SAFEARRAYBOUND rgsabound[1];
169 //      rgsabound[0].cElements= count;
170 //      rgsabound[0].lLbound= 0;
171 //      m_array= SafeArrayCreateVector( VT_UNKNOWN, 0, count);
172 //      SafeArrayLock( m_array);
173 //
174 //      IUnknown* *pData;
175 //      if( m_array && (SUCCEEDED( SafeArrayAccessData( m_array, (void**)&pData)) ) )
176 //      {
177 //
178 //          for( int i=0; i< count; i++)
179 //          {
180 //              CComVariant varSource( parParams[i]);
181 //              switch (destVartype)
182 //              {
183 //
184 //              case VT_UNKNOWN:
185 //                  {
186 //                      pData[i]= parParams[i];
187 //                      pData[i]->AddRef();
188 //                  }
189 //              default:
190 //                  hr= E_FAIL;
191 //              }
192 //          }
193 //          if( FAILED( hr))
194 //          {
195 //              SafeArrayDestroy( m_array);
196 //              m_array= NULL;
197 //          }
198 //      }
199 //      SafeArrayUnaccessData( m_array);
200 //  }
201     ~SmartArray(){
202         SafeArrayUnlock( m_array);
203         SafeArrayDestroy( m_array );
204     }
205 
206     operator bool (){ return m_array == NULL ?  false : true; }
207 
208     operator SAFEARRAY* (){ return m_array;}
209 
210 };
211 
212 template <> SmartArray <IUnknown*>::SmartArray(sourceType * parParams, int count, VARTYPE destVartype):m_array(NULL)
213 {
214     ATLTRACE("SmartArray<IUnknown>");
215     HRESULT hr= S_OK;
216     SAFEARRAYBOUND rgsabound[1];
217     rgsabound[0].cElements= count;
218     rgsabound[0].lLbound= 0;
219     m_array= SafeArrayCreateVector( VT_UNKNOWN, 0, count);
220     SafeArrayLock( m_array);
221 
222     IUnknown* *pData;
223     if( m_array && (SUCCEEDED( SafeArrayAccessData( m_array, (void**)&pData)) ) )
224     {
225         for( int i=0; i< count; i++)
226         {
227             pData[i]= parParams[i];
228             pData[i]->AddRef();
229         }
230     }
231     SafeArrayUnaccessData( m_array);
232 };
233 #endif
234