xref: /trunk/main/scripting/source/storage/ScriptInfo.cxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
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_scripting.hxx"
26 #include <cppuhelper/implementationentry.hxx>
27 
28 #include <hash_map>
29 
30 #include <osl/file.hxx>
31 #include <cppuhelper/implbase1.hxx>
32 
33 #include <com/sun/star/beans/XPropertyContainer.hpp>
34 #include <com/sun/star/beans/PropertyAttribute.hpp>
35 
36 #include <drafts/com/sun/star/script/framework/storage/XScriptStorageManager.hpp>
37 
38 #include <util/util.hxx>
39 #include "ScriptInfo.hxx"
40 
41 using namespace ::rtl;
42 using namespace com::sun::star;
43 using namespace ::com::sun::star::uno;
44 using namespace ::drafts::com::sun::star::script::framework;
45 using namespace ::drafts::com::sun::star::script::framework::storage;
46 
47 namespace scripting_impl
48 {
49 
50 typedef ::std::hash_map < ::rtl::OUString, css::uno::Any, ::rtl::OUStringHash,
51     ::std::equal_to< ::rtl::OUString > > PropertySet_hash;
52 
53 class PropertySetImpl : public ::cppu::WeakImplHelper1< css::beans::XPropertySet >
54 {
55 
56 public:
57 
58     PropertySetImpl();
59     ~PropertySetImpl();
60 
61 // XPropertySet implementation
62     virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL
63         getPropertySetInfo();
64     virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName,
65         const css::uno::Any& aValue );
66     virtual css::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName );
67     virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName,
68         const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener );
69     virtual void SAL_CALL removePropertyChangeListener(
70         const ::rtl::OUString& aPropertyName,
71         const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener );
72     virtual void SAL_CALL addVetoableChangeListener(
73         const ::rtl::OUString& PropertyName,
74         const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener );
75     virtual void SAL_CALL removeVetoableChangeListener(
76         const ::rtl::OUString& PropertyName,
77         const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener );
78 
79 private:
80     friend class ScriptInfo;
81 
82     css::uno::Reference< css::uno::XComponentContext > m_xContext;
83     void PropertySetImpl::privateSetPropertyValue( const ::rtl::OUString& aPropertyName, const Any& aValue );
84 
85     osl::Mutex m_mutex;
86     PropertySet_hash m_propertyMap;
87 };
88 
PropertySetImpl()89 PropertySetImpl::PropertySetImpl()
90 {
91    OSL_TRACE( "<PropertySetImpl ctor called\n" );
92 }
93 
~PropertySetImpl()94 PropertySetImpl::~PropertySetImpl()
95 {
96     OSL_TRACE( "<PropertySetImpl dtor called\n>" );
97 }
98 
getPropertySetInfo()99 Reference< beans::XPropertySetInfo > SAL_CALL PropertySetImpl::getPropertySetInfo( )
100 {
101     return Reference< beans::XPropertySetInfo > (); // Not supported
102 }
103 
setPropertyValue(const::rtl::OUString & aPropertyName,const Any & aValue)104 void SAL_CALL PropertySetImpl::setPropertyValue( const ::rtl::OUString& aPropertyName,
105     const Any& aValue )
106 {
107     throw RuntimeException(
108         OUSTR( "PropertySetImpl::setPropertyValue: method not supported. Read-only PropertySet" ),
109         Reference< XInterface >() );
110 }
111 
privateSetPropertyValue(const::rtl::OUString & aPropertyName,const Any & aValue)112 void PropertySetImpl::privateSetPropertyValue( const ::rtl::OUString& aPropertyName,
113     const Any& aValue )
114 {
115     ::osl::Guard< osl::Mutex > aGuard( m_mutex );
116     m_propertyMap[ aPropertyName ] = aValue;
117 }
118 
119 //*************************************************************************
getPropertyValue(const::rtl::OUString & PropertyName)120 Any SAL_CALL PropertySetImpl::getPropertyValue( const ::rtl::OUString& PropertyName )
121 {
122     if ( m_propertyMap.find( PropertyName ) == m_propertyMap.end() )
123     {
124         throw RuntimeException(
125 
126             OUSTR( "PropertySetImpl::getPropertyValue: invalid PropertyName ").concat(
127                 PropertyName),
128             Reference< XInterface >() );
129     }
130 
131     ::osl::Guard< osl::Mutex > aGuard( m_mutex );
132     Any returnValue = m_propertyMap[ PropertyName ];
133 
134     return returnValue;
135 }
136 
137 //*************************************************************************
addPropertyChangeListener(const::rtl::OUString & aPropertyName,const Reference<beans::XPropertyChangeListener> & xListener)138 void SAL_CALL PropertySetImpl::addPropertyChangeListener(
139     const ::rtl::OUString& aPropertyName,
140     const Reference< beans::XPropertyChangeListener >& xListener )
141 {
142     throw RuntimeException(
143         OUSTR( "PropertySetImpl::addPropertyChangeListener: method not supported" ),
144         Reference< XInterface >() );
145 }
146 
147 //*************************************************************************
removePropertyChangeListener(const::rtl::OUString & aPropertyName,const Reference<beans::XPropertyChangeListener> & aListener)148 void SAL_CALL PropertySetImpl::removePropertyChangeListener(
149     const ::rtl::OUString& aPropertyName,
150     const Reference< beans::XPropertyChangeListener >& aListener )
151 {
152     throw RuntimeException(
153         OUSTR( "PropertySetImpl::removePropertyChangeListener: method not supported" ),
154         Reference< XInterface >() );
155 }
156 
157 //*************************************************************************
addVetoableChangeListener(const::rtl::OUString & PropertyName,const Reference<beans::XVetoableChangeListener> & aListener)158 void SAL_CALL PropertySetImpl::addVetoableChangeListener(
159     const ::rtl::OUString& PropertyName,
160     const Reference< beans::XVetoableChangeListener >& aListener )
161 {
162     throw RuntimeException(
163         OUSTR( "PropertySetImpl::addVetoableChangeListener: method not supported" ),
164         Reference< XInterface >() );
165 }
166 
167 //*************************************************************************
removeVetoableChangeListener(const::rtl::OUString & PropertyName,const Reference<beans::XVetoableChangeListener> & aListener)168 void SAL_CALL PropertySetImpl::removeVetoableChangeListener(
169     const ::rtl::OUString& PropertyName,
170     const Reference< beans::XVetoableChangeListener >& aListener )
171 {
172     throw RuntimeException(
173         OUSTR( "PropertySetImpl::removeVetoableChangeListener: method not supported" ),
174         Reference< XInterface >() );
175 }
176 
177 
178 //*************************************************************************
ScriptInfo(const ScriptData & scriptData,sal_Int32 storageID)179 ScriptInfo::ScriptInfo( const ScriptData & scriptData, sal_Int32 storageID )
180         : m_scriptData( scriptData ), m_storageID( storageID )
181 {
182     OSL_TRACE( "< ++++++ ScriptInfo ctor called >\n" );
183     OSL_TRACE( "< ++++++ parcelURI=%s>\n",::rtl::OUStringToOString(m_scriptData.parcelURI , RTL_TEXTENCODING_ASCII_US ).pData->buffer );
184 }
185 //*************************************************************************
~ScriptInfo()186 ScriptInfo::~ScriptInfo()
187 {
188     OSL_TRACE( "< ScriptInfo dtor called >\n" );
189 }
190 //*************************************************************************
getLogicalName()191 OUString SAL_CALL ScriptInfo::getLogicalName(  )
192 {
193     OSL_TRACE( "ScriptInfo::getLogicalName() " );
194     return m_scriptData.logicalname;
195 }
196 
197 //*************************************************************************
getDescription()198 OUString SAL_CALL ScriptInfo::getDescription(  )
199 {
200     OUString rs_desc;
201     // TDB need to determine locale here, hardcoded at the moment
202     // to english
203 
204     OUString localeLang = OUString::createFromAscii( "en" );
205     strpair_map::const_iterator str_it =
206         m_scriptData.locales.find( localeLang );
207 
208     if( str_it == m_scriptData.locales.end() )
209     {
210         OSL_TRACE( "No description set in meta-data" );
211         return rs_desc;
212     }
213     rs_desc = str_it->second.second;
214     return rs_desc;
215 }
216 
217 //*************************************************************************
getLanguage()218 OUString SAL_CALL ScriptInfo::getLanguage(  )
219 {
220     OSL_TRACE( "ScriptInfo::getLanguage() " );
221     return m_scriptData.language;
222 }
223 
224 //*************************************************************************
getFunctionName()225 OUString SAL_CALL ScriptInfo::getFunctionName(  )
226 {
227     OSL_TRACE( "ScriptInfo::getFunctionName() " );
228     return m_scriptData.functionname;
229 }
230 
231 //*************************************************************************
getParcelURI()232 OUString SAL_CALL ScriptInfo::getParcelURI(  )
233 {
234     return m_scriptData.parcelURI;
235 }
236 
237 //*************************************************************************
getLanguageProperties()238 Reference< beans::XPropertySet > SAL_CALL ScriptInfo::getLanguageProperties(  )
239 {
240     PropertySetImpl* propSetImpl = new PropertySetImpl();
241     Reference< beans::XPropertySet > xPropSet = propSetImpl;
242 
243     props_vec::const_iterator pv_it = m_scriptData.languagedepprops.begin();
244     props_vec::const_iterator pv_itend = m_scriptData.languagedepprops.end();
245 
246     for( ; pv_it != pv_itend; ++pv_it )
247     {
248         try
249         {
250             propSetImpl->privateSetPropertyValue( pv_it->first, makeAny( pv_it->second ) );
251         }
252         catch( Exception& e )
253         {
254             OUString msg = OUSTR(
255                 "ScriptInfo::getLanguage caught exception while setting property," );
256             msg = msg.concat( OUSTR( " PropertryName: " ) ).concat( pv_it->first );
257             msg = msg.concat( OUSTR( " \nException message is: " ) );
258             msg = msg.concat( e.Message );
259             throw RuntimeException( msg , Reference< XInterface >() );
260         }
261     }
262 
263     return xPropSet;
264 }
265 //*************************************************************************
getFileSetNames()266 css::uno::Sequence< ::rtl::OUString > SAL_CALL ScriptInfo::getFileSetNames()
267 {
268     OSL_TRACE("ScriptInfo::getFileSetNames");
269     Sequence< OUString > results;
270     filesets_map::iterator fsm_it = m_scriptData.filesets.begin();
271     filesets_map::iterator fsm_itend = m_scriptData.filesets.end();
272     if( fsm_it == fsm_itend )
273     {
274         OSL_TRACE( "ScriptInfo::getFileSetNames: no filesets" );
275         return results;
276     }
277     results.realloc( m_scriptData.filesets.size() );
278     for ( sal_Int32 count = 0; fsm_it != fsm_itend; ++fsm_it )
279     {
280         OUString fileSetName = fsm_it->first;
281         OSL_TRACE( "ScriptInfo::getFileSetNames: adding name %s",
282             ::rtl::OUStringToOString( fileSetName,
283                 RTL_TEXTENCODING_ASCII_US ).pData->buffer );
284         results[ count++ ] = fileSetName;
285     }
286     return results;
287 }
288 //*************************************************************************
289 css::uno::Sequence< ::rtl::OUString > SAL_CALL
getFilesInFileSet(const::rtl::OUString & fileSetName)290 ScriptInfo::getFilesInFileSet( const ::rtl::OUString & fileSetName )
291 {
292     Sequence< OUString > results;
293     filesets_map::iterator fsm_it = m_scriptData.filesets.find( fileSetName );
294     filesets_map::iterator fsm_itend = m_scriptData.filesets.end();
295     if( fsm_it == fsm_itend )
296     {
297         OSL_TRACE( "ScriptInfo::getFilesInFileSet: no fileset named %s",
298             ::rtl::OUStringToOString( fileSetName,
299                 RTL_TEXTENCODING_ASCII_US ).pData->buffer );
300         return results;
301     }
302 
303     strpairvec_map files = fsm_it->second.second;
304     strpairvec_map::iterator spvm_it = files.begin();
305     strpairvec_map::iterator spvm_itend = files.end();
306     if( spvm_it == spvm_itend )
307     {
308         OSL_TRACE( "ScriptInfo::getFilesInFileSet: no files in fileset %s",
309             ::rtl::OUStringToOString( fileSetName,
310                 RTL_TEXTENCODING_ASCII_US ).pData->buffer );
311         return results;
312     }
313     results.realloc( files.size() );
314     for( sal_Int32 count = 0; spvm_it != spvm_itend ; ++spvm_it )
315     {
316         OUString fileName = spvm_it->first;
317         OSL_TRACE( "ScriptInfo::getFilesInFileSet: adding file %s",
318             ::rtl::OUStringToOString( fileName,
319                 RTL_TEXTENCODING_ASCII_US ).pData->buffer );
320         results[ count++ ] = fileName;
321     }
322     return results;
323 }
324 //*************************************************************************
325 }
326