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 // MARKER(update_precomp.py): autogen include statement, do not remove
24 #include "precompiled_extensions.hxx"
25
26 #include "sal/config.h"
27 #include "cppuhelper/factory.hxx"
28 #include "cppuhelper/implementationentry.hxx"
29 #include "cppuhelper/implbase3.hxx"
30 #include "com/sun/star/lang/XServiceInfo.hpp"
31 #include "com/sun/star/inspection/XStringRepresentation.hpp"
32 #include "com/sun/star/lang/XInitialization.hpp"
33 #include "com/sun/star/script/XTypeConverter.hpp"
34 #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
35 #include <com/sun/star/reflection/XConstantsTypeDescription.hpp>
36 #include <com/sun/star/beans/XIntrospection.hpp>
37 #include <com/sun/star/util/DateTime.hpp>
38 #include <com/sun/star/util/Date.hpp>
39 #include <com/sun/star/util/Time.hpp>
40 #include <comphelper/sequence.hxx>
41 #include <connectivity/dbconversion.hxx>
42 #ifndef _EXTENSIONS_PROPCTRLR_MODULEPRC_HXX_
43 #include "modulepcr.hxx"
44 #endif
45 #ifndef _EXTENSIONS_FORMCTRLR_PROPRESID_HRC_
46 #include "formresid.hrc"
47 #endif
48 #include <tools/debug.hxx>
49 #include <tools/string.hxx>
50 #include <tools/StringListResource.hxx>
51 #include <comphelper/types.hxx>
52 #ifndef _EXTENSIONS_PROPCTRLR_MODULEPCR_HXX_
53 #include "modulepcr.hxx"
54 #endif
55
56 #include <functional>
57 #include <algorithm>
58
59 // component helper namespace
60 namespace comp_StringRepresentation {
61
62 using namespace ::com::sun::star;
63
64 // component and service helper functions:
65 ::rtl::OUString SAL_CALL _getImplementationName();
66 uno::Sequence< ::rtl::OUString > SAL_CALL _getSupportedServiceNames();
67 uno::Reference< uno::XInterface > SAL_CALL _create( uno::Reference< uno::XComponentContext > const & context );
68
69 } // closing component helper namespace
70
71
72 namespace pcr{
73
74 using namespace ::com::sun::star;
75 using namespace ::com::sun::star::uno;
76
77 class StringRepresentation:
78 public ::cppu::WeakImplHelper3<
79 lang::XServiceInfo,
80 inspection::XStringRepresentation,
81 lang::XInitialization>
82 {
83 public:
84 explicit StringRepresentation(uno::Reference< uno::XComponentContext > const & context);
85
86 // lang::XServiceInfo:
87 virtual ::rtl::OUString SAL_CALL getImplementationName() throw (uno::RuntimeException);
88 virtual ::sal_Bool SAL_CALL supportsService(const ::rtl::OUString & ServiceName) throw (uno::RuntimeException);
89 virtual uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw (uno::RuntimeException);
90
91 // inspection::XStringRepresentation:
92 virtual ::rtl::OUString SAL_CALL convertToControlValue(const uno::Any & PropertyValue) throw (uno::RuntimeException, uno::Exception);
93 virtual uno::Any SAL_CALL convertToPropertyValue(const ::rtl::OUString & ControlValue, const uno::Type & ControlValueType) throw (uno::RuntimeException, uno::Exception);
94
95 // lang::XInitialization:
96 virtual void SAL_CALL initialize(const uno::Sequence< uno::Any > & aArguments) throw (uno::RuntimeException, uno::Exception);
97
98 private:
99 StringRepresentation(StringRepresentation &); // not defined
100 void operator =(StringRepresentation &); // not defined
101
~StringRepresentation()102 virtual ~StringRepresentation() {}
103
104 /** converts a generic value into a string representation
105
106 If you want to convert values whose string representation does not depend
107 on a concrete property, use this version
108
109 @return <TRUE/>
110 if and only if the value could be converted
111 */
112 bool convertGenericValueToString(
113 const uno::Any& _rValue,
114 ::rtl::OUString& _rStringRep
115 );
116
117 /** converts string representation into generic value
118
119 If you want to convert values whose string representation does not depend
120 on a concrete property, use this version
121
122 @return <TRUE/>
123 if and only if the value could be converted
124 */
125 bool convertStringToGenericValue(
126 const ::rtl::OUString& _rStringRep,
127 uno::Any& _rValue,
128 const uno::Type& _rTargetType
129 );
130
131 /** uses the simple convert method from the type converter
132 *
133 * \param _rValue the value to be converted
134 * \return the converted string.
135 */
136 ::rtl::OUString convertSimpleToString( const uno::Any& _rValue );
137
138 /** converts a string into his constant value if it exists, otherwise the type converter is used.
139 * \param _rValue the value to be converted
140 * \param _ePropertyType teh type of the propery to be converted into
141 * \return the converted value
142 */
143 uno::Any convertStringToSimple( const ::rtl::OUString& _rValue,const uno::TypeClass& _ePropertyType );
144
145 uno::Reference< uno::XComponentContext > m_xContext;
146 uno::Reference< script::XTypeConverter > m_xTypeConverter;
147 uno::Reference< reflection::XConstantsTypeDescription > m_xTypeDescription;
148 uno::Sequence< ::rtl::OUString > m_aValues;
149 uno::Sequence< uno::Reference< reflection::XConstantTypeDescription> > m_aConstants;
150
151 };
152
StringRepresentation(uno::Reference<uno::XComponentContext> const & context)153 StringRepresentation::StringRepresentation(uno::Reference< uno::XComponentContext > const & context) :
154 m_xContext(context)
155 {}
156
157 // com.sun.star.uno.XServiceInfo:
getImplementationName()158 ::rtl::OUString SAL_CALL StringRepresentation::getImplementationName() throw (uno::RuntimeException)
159 {
160 return comp_StringRepresentation::_getImplementationName();
161 }
162
supportsService(::rtl::OUString const & serviceName)163 ::sal_Bool SAL_CALL StringRepresentation::supportsService(::rtl::OUString const & serviceName) throw (uno::RuntimeException)
164 {
165 return ::comphelper::existsValue(serviceName,comp_StringRepresentation::_getSupportedServiceNames());
166 }
167
getSupportedServiceNames()168 uno::Sequence< ::rtl::OUString > SAL_CALL StringRepresentation::getSupportedServiceNames() throw (uno::RuntimeException)
169 {
170 return comp_StringRepresentation::_getSupportedServiceNames();
171 }
172
173 // inspection::XStringRepresentation:
convertToControlValue(const uno::Any & PropertyValue)174 ::rtl::OUString SAL_CALL StringRepresentation::convertToControlValue(const uno::Any & PropertyValue) throw (uno::RuntimeException, uno::Exception)
175 {
176 ::rtl::OUString sReturn;
177 if ( !convertGenericValueToString( PropertyValue, sReturn ) )
178 {
179 sReturn = convertSimpleToString( PropertyValue );
180 #ifdef DBG_UTIL
181 if ( !sReturn.getLength() && PropertyValue.hasValue() )
182 {
183 ::rtl::OString sMessage( "StringRepresentation::convertPropertyValueToStringRepresentation: cannot convert values of type '" );
184 sMessage += ::rtl::OString( PropertyValue.getValueType().getTypeName().getStr(), PropertyValue.getValueType().getTypeName().getLength(), RTL_TEXTENCODING_ASCII_US );
185 sMessage += ::rtl::OString( "'!" );
186 DBG_ERROR( sMessage.getStr() );
187 }
188 #endif
189 }
190
191 return sReturn;
192 }
193
convertToPropertyValue(const::rtl::OUString & ControlValue,const uno::Type & ControlValueType)194 uno::Any SAL_CALL StringRepresentation::convertToPropertyValue(const ::rtl::OUString & ControlValue, const uno::Type & ControlValueType) throw (uno::RuntimeException, uno::Exception)
195 {
196 uno::Any aReturn;
197
198 uno::TypeClass ePropertyType = ControlValueType.getTypeClass();
199 switch ( ePropertyType )
200 {
201 case uno::TypeClass_FLOAT:
202 case uno::TypeClass_DOUBLE:
203 case uno::TypeClass_BYTE:
204 case uno::TypeClass_SHORT:
205 case uno::TypeClass_LONG:
206 case uno::TypeClass_HYPER:
207 case uno::TypeClass_UNSIGNED_SHORT:
208 case uno::TypeClass_UNSIGNED_LONG:
209 case uno::TypeClass_UNSIGNED_HYPER:
210 try
211 {
212 aReturn = convertStringToSimple(ControlValue, ePropertyType);
213 }
214 catch( const script::CannotConvertException& ) { }
215 catch( const lang::IllegalArgumentException& ) { }
216 break;
217
218 default:
219 #if OSL_DEBUG_LEVEL > 0
220 bool bCanConvert =
221 #endif
222 convertStringToGenericValue( ControlValue, aReturn, ControlValueType );
223
224 #if OSL_DEBUG_LEVEL > 0
225 // could not convert ...
226 if ( !bCanConvert && ControlValue.getLength() )
227 {
228 ::rtl::OString sMessage( "StringRepresentation::convertStringRepresentationToPropertyValue: cannot convert into values of type '" );
229 sMessage += ::rtl::OString( ControlValueType.getTypeName().getStr(), ControlValueType.getTypeName().getLength(), RTL_TEXTENCODING_ASCII_US );
230 sMessage += ::rtl::OString( "'!" );
231 DBG_ERROR( sMessage.getStr() );
232 }
233 #endif
234 }
235
236 return aReturn;
237 }
238
239 // lang::XInitialization:
initialize(const uno::Sequence<uno::Any> & aArguments)240 void SAL_CALL StringRepresentation::initialize(const uno::Sequence< uno::Any > & aArguments) throw (uno::RuntimeException, uno::Exception)
241 {
242 sal_Int32 nLength = aArguments.getLength();
243 if ( nLength )
244 {
245 const uno::Any* pIter = aArguments.getConstArray();
246 m_xTypeConverter.set(*pIter++,uno::UNO_QUERY);
247 if ( nLength == 3 )
248 {
249 ::rtl::OUString sConstantName;
250 *pIter++ >>= sConstantName;
251 *pIter >>= m_aValues;
252
253 if ( m_xContext.is() )
254 {
255 uno::Reference< container::XHierarchicalNameAccess > xTypeDescProv(
256 m_xContext->getValueByName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/singletons/com.sun.star.reflection.theTypeDescriptionManager" ) ) ),
257 uno::UNO_QUERY_THROW );
258
259 m_xTypeDescription.set( xTypeDescProv->getByHierarchicalName( sConstantName ), uno::UNO_QUERY_THROW );
260 m_aConstants = m_xTypeDescription->getConstants();
261 }
262 }
263 }
264 }
265 //------------------------------------------------------------------------
convertSimpleToString(const uno::Any & _rValue)266 ::rtl::OUString StringRepresentation::convertSimpleToString( const uno::Any& _rValue )
267 {
268 ::rtl::OUString sReturn;
269 if ( m_xTypeConverter.is() && _rValue.hasValue() )
270 {
271 try
272 {
273 if ( m_aConstants.getLength() )
274 {
275 sal_Int16 nConstantValue = 0;
276 if ( _rValue >>= nConstantValue )
277 {
278 const uno::Reference< reflection::XConstantTypeDescription>* pIter = m_aConstants.getConstArray();
279 const uno::Reference< reflection::XConstantTypeDescription>* pEnd = pIter + m_aConstants.getLength();
280 for(sal_Int32 i = 0;pIter != pEnd;++pIter,++i)
281 {
282 if ( (*pIter)->getConstantValue() == _rValue )
283 {
284 OSL_ENSURE(i < m_aValues.getLength() ,"StringRepresentation::convertSimpleToString: Index is not in range of m_aValues");
285 sReturn = m_aValues[i];
286 break;
287 }
288 }
289 }
290 }
291
292 if ( !sReturn.getLength() )
293 m_xTypeConverter->convertToSimpleType( _rValue, uno::TypeClass_STRING ) >>= sReturn;
294 }
295 catch( script::CannotConvertException& ) { }
296 catch( lang::IllegalArgumentException& ) { }
297 }
298 return sReturn;
299 }
300
301 //--------------------------------------------------------------------
302 namespace
303 {
304 struct ConvertIntegerFromAndToString
305 {
operator ()pcr::__anon6ce98ff70111::ConvertIntegerFromAndToString306 ::rtl::OUString operator()( sal_Int32 _rIntValue ) const
307 {
308 return ::rtl::OUString::valueOf( (sal_Int32)_rIntValue );
309 }
operator ()pcr::__anon6ce98ff70111::ConvertIntegerFromAndToString310 sal_Int32 operator()( const ::rtl::OUString& _rStringValue ) const
311 {
312 return _rStringValue.toInt32();
313 }
314 };
315
316 struct StringIdentity
317 {
operator ()pcr::__anon6ce98ff70111::StringIdentity318 ::rtl::OUString operator()( const ::rtl::OUString& _rValue ) const
319 {
320 return _rValue;
321 }
322 };
323
324 template < class ElementType, class Transformer >
composeSequenceElements(const Sequence<ElementType> & _rElements,const Transformer & _rTransformer)325 ::rtl::OUString composeSequenceElements( const Sequence< ElementType >& _rElements, const Transformer& _rTransformer )
326 {
327 String sCompose;
328
329 // loop through the elements and concatenate the string representations of the integers
330 // (separated by a line break)
331 const ElementType* pElements = _rElements.getConstArray();
332 const ElementType* pElementsEnd = pElements + _rElements.getLength();
333 for ( ; pElements != pElementsEnd; ++pElements )
334 {
335 sCompose += String( _rTransformer( *pElements ) );
336 if ( pElements != pElementsEnd )
337 sCompose += '\n';
338 }
339
340 return sCompose;
341 }
342
343 template < class ElementType, class Transformer >
splitComposedStringToSequence(const::rtl::OUString & _rComposed,Sequence<ElementType> & _out_SplitUp,const Transformer & _rTransformer)344 void splitComposedStringToSequence( const ::rtl::OUString& _rComposed, Sequence< ElementType >& _out_SplitUp, const Transformer& _rTransformer )
345 {
346 _out_SplitUp.realloc( 0 );
347 if ( !_rComposed.getLength() )
348 return;
349 sal_Int32 tokenPos = 0;
350 do
351 {
352 _out_SplitUp.realloc( _out_SplitUp.getLength() + 1 );
353 _out_SplitUp[ _out_SplitUp.getLength() - 1 ] = (ElementType)_rTransformer( _rComposed.getToken( 0, '\n', tokenPos ) );
354 }
355 while ( tokenPos != -1 );
356 }
357 }
358
359 //--------------------------------------------------------------------
convertGenericValueToString(const uno::Any & _rValue,::rtl::OUString & _rStringRep)360 bool StringRepresentation::convertGenericValueToString( const uno::Any& _rValue, ::rtl::OUString& _rStringRep )
361 {
362 bool bCanConvert = true;
363
364 switch ( _rValue.getValueTypeClass() )
365 {
366 case uno::TypeClass_STRING:
367 _rValue >>= _rStringRep;
368 break;
369
370 case uno::TypeClass_BOOLEAN:
371 {
372 ::std::vector< ::rtl::OUString > aListEntries;
373 tools::StringListResource aRes(PcrRes(RID_RSC_ENUM_YESNO),aListEntries);
374 sal_Bool bValue = sal_False;
375 _rValue >>= bValue;
376 _rStringRep = bValue ? aListEntries[1] : aListEntries[0];
377 }
378 break;
379
380 // some sequence types
381 case uno::TypeClass_SEQUENCE:
382 {
383 Sequence< ::rtl::OUString > aStringValues;
384 Sequence< sal_Int8 > aInt8Values;
385 Sequence< sal_uInt16 > aUInt16Values;
386 Sequence< sal_Int16 > aInt16Values;
387 Sequence< sal_uInt32 > aUInt32Values;
388 Sequence< sal_Int32 > aInt32Values;
389
390 // string sequences
391 if ( _rValue >>= aStringValues )
392 {
393 _rStringRep = composeSequenceElements( aStringValues, StringIdentity() );
394 }
395 // byte sequences
396 else if ( _rValue >>= aInt8Values )
397 {
398 _rStringRep = composeSequenceElements( aInt8Values, ConvertIntegerFromAndToString() );
399 }
400 // uInt16 sequences
401 else if ( _rValue >>= aUInt16Values )
402 {
403 _rStringRep = composeSequenceElements( aUInt16Values, ConvertIntegerFromAndToString() );
404 }
405 // Int16 sequences
406 else if ( _rValue >>= aInt16Values )
407 {
408 _rStringRep = composeSequenceElements( aInt16Values, ConvertIntegerFromAndToString() );
409 }
410 // uInt32 sequences
411 else if ( _rValue >>= aUInt32Values )
412 {
413 _rStringRep = composeSequenceElements( aUInt32Values, ConvertIntegerFromAndToString() );
414 }
415 // Int32 sequences
416 else if ( _rValue >>= aInt32Values )
417 {
418 _rStringRep = composeSequenceElements( aInt32Values, ConvertIntegerFromAndToString() );
419 }
420 else
421 bCanConvert = false;
422 }
423 break;
424 case uno::TypeClass_CONSTANT:
425 {
426 int i = 0;
427 ++i;
428 }
429 break;
430
431 // some structs
432 case uno::TypeClass_STRUCT:
433 OSL_ENSURE( false, "StringRepresentation::convertGenericValueToString(STRUCT): this is dead code - isn't it?" );
434 if ( _rValue.getValueType().equals( ::getCppuType( static_cast< util::Date* >( NULL ) ) ) )
435 {
436 // weird enough, the string representation of dates, as used
437 // by the control displaying dates, and thus as passed through the layers,
438 // is YYYYMMDD.
439 util::Date aUnoDate;
440 _rValue >>= aUnoDate;
441 _rStringRep = ::dbtools::DBTypeConversion::toDateString(aUnoDate);
442 }
443 else if ( _rValue.getValueType().equals( ::getCppuType( static_cast< util::Time* >( NULL ) ) ) )
444 {
445 // similar for time (HHMMSSHH)
446 util::Time aUnoTime;
447 _rValue >>= aUnoTime;
448 _rStringRep = ::dbtools::DBTypeConversion::toTimeString(aUnoTime);
449 }
450 else if ( _rValue.getValueType().equals( ::getCppuType( static_cast< util::DateTime* >( NULL ) ) ) )
451 {
452 util::DateTime aUnoDateTime;
453 _rValue >>= aUnoDateTime;
454 _rStringRep = ::dbtools::DBTypeConversion::toDateTimeString(aUnoDateTime);
455 }
456 else
457 bCanConvert = false;
458 break;
459
460 default:
461 bCanConvert = false;
462 break;
463 }
464
465 return bCanConvert;
466 }
467 //------------------------------------------------------------------------
convertStringToSimple(const::rtl::OUString & _rValue,const uno::TypeClass & _ePropertyType)468 uno::Any StringRepresentation::convertStringToSimple( const ::rtl::OUString& _rValue,const uno::TypeClass& _ePropertyType )
469 {
470 uno::Any aReturn;
471 if ( m_xTypeConverter.is() && _rValue.getLength() )
472 {
473 try
474 {
475 if ( m_aConstants.getLength() && m_aValues.getLength() )
476 {
477 const ::rtl::OUString* pIter = m_aValues.getConstArray();
478 const ::rtl::OUString* pEnd = pIter + m_aValues.getLength();
479 for(sal_Int32 i = 0;pIter != pEnd;++pIter,++i)
480 {
481 if ( *pIter == _rValue )
482 {
483 OSL_ENSURE(i < m_aConstants.getLength() ,"StringRepresentation::convertSimpleToString: Index is not in range of m_aValues");
484 aReturn <<= m_aConstants[i]->getConstantValue();
485 break;
486 }
487 }
488 }
489
490 if ( !aReturn.hasValue() )
491 aReturn = m_xTypeConverter->convertToSimpleType( makeAny( _rValue ), _ePropertyType );
492 }
493 catch( script::CannotConvertException& ) { }
494 catch( lang::IllegalArgumentException& ) { }
495 }
496 return aReturn;
497 }
498 //--------------------------------------------------------------------
convertStringToGenericValue(const::rtl::OUString & _rStringRep,uno::Any & _rValue,const uno::Type & _rTargetType)499 bool StringRepresentation::convertStringToGenericValue( const ::rtl::OUString& _rStringRep, uno::Any& _rValue, const uno::Type& _rTargetType )
500 {
501 bool bCanConvert = true;
502
503 switch ( _rTargetType.getTypeClass() )
504 {
505 case uno::TypeClass_STRING:
506 _rValue <<= _rStringRep;
507 break;
508
509 case uno::TypeClass_BOOLEAN:
510 {
511 ::std::vector< ::rtl::OUString > aListEntries;
512 tools::StringListResource aRes(PcrRes(RID_RSC_ENUM_YESNO),aListEntries);
513 if ( aListEntries[0] == _rStringRep )
514 _rValue <<= (sal_Bool)sal_False;
515 else
516 _rValue <<= (sal_Bool)sal_True;
517 }
518 break;
519
520 case uno::TypeClass_SEQUENCE:
521 {
522 uno::Type aElementType = ::comphelper::getSequenceElementType( _rTargetType );
523
524 String aStr( _rStringRep );
525 switch ( aElementType.getTypeClass() )
526 {
527 case uno::TypeClass_STRING:
528 {
529 Sequence< ::rtl::OUString > aElements;
530 splitComposedStringToSequence( aStr, aElements, StringIdentity() );
531 _rValue <<= aElements;
532 }
533 break;
534 case uno::TypeClass_SHORT:
535 {
536 Sequence< sal_Int16 > aElements;
537 splitComposedStringToSequence( aStr, aElements, ConvertIntegerFromAndToString() );
538 _rValue <<= aElements;
539 }
540 break;
541 case uno::TypeClass_UNSIGNED_SHORT:
542 {
543 Sequence< sal_uInt16 > aElements;
544 splitComposedStringToSequence( aStr, aElements, ConvertIntegerFromAndToString() );
545 _rValue <<= aElements;
546 }
547 break;
548 case uno::TypeClass_LONG:
549 {
550 Sequence< sal_Int32 > aElements;
551 splitComposedStringToSequence( aStr, aElements, ConvertIntegerFromAndToString() );
552 _rValue <<= aElements;
553 }
554 break;
555 case uno::TypeClass_UNSIGNED_LONG:
556 {
557 Sequence< sal_uInt32 > aElements;
558 splitComposedStringToSequence( aStr, aElements, ConvertIntegerFromAndToString() );
559 _rValue <<= aElements;
560 }
561 break;
562 case uno::TypeClass_BYTE:
563 {
564 Sequence< sal_Int8 > aElements;
565 splitComposedStringToSequence( aStr, aElements, ConvertIntegerFromAndToString() );
566 _rValue <<= aElements;
567 }
568 break;
569 default:
570 bCanConvert = false;
571 break;
572 }
573 }
574 break;
575
576 case uno::TypeClass_STRUCT:
577 OSL_ENSURE( false, "StringRepresentation::convertStringToGenericValue(STRUCT): this is dead code - isn't it?" );
578 if ( _rTargetType.equals( ::getCppuType( static_cast< util::Date* >( NULL ) ) ) )
579 {
580 // weird enough, the string representation of dates, as used
581 // by the control displaying dates, and thus as passed through the layers,
582 // is YYYYMMDD.
583
584 _rValue <<= ::dbtools::DBTypeConversion::toDate(_rStringRep);
585 }
586 else if ( _rTargetType.equals( ::getCppuType( static_cast< util::Time* >( NULL ) ) ) )
587 {
588 // similar for time (HHMMSSHH)
589 _rValue <<= ::dbtools::DBTypeConversion::toTime(_rStringRep);
590 }
591 else if ( _rTargetType.equals( ::getCppuType( static_cast< util::DateTime* >( NULL ) ) ) )
592 {
593 _rValue <<= ::dbtools::DBTypeConversion::toDateTime(_rStringRep);
594 }
595 else
596 bCanConvert = false;
597 break;
598
599 default:
600 bCanConvert = false;
601 break;
602 }
603
604 return bCanConvert;
605 }
606 //------------------------------------------------------------------------
607 //------------------------------------------------------------------------
608 } // pcr
609 //------------------------------------------------------------------------
610
611
612 // component helper namespace
613 namespace comp_StringRepresentation {
614
_getImplementationName()615 ::rtl::OUString SAL_CALL _getImplementationName() {
616 return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
617 "StringRepresentation"));
618 }
619
_getSupportedServiceNames()620 uno::Sequence< ::rtl::OUString > SAL_CALL _getSupportedServiceNames()
621 {
622 uno::Sequence< ::rtl::OUString > s(1);
623 s[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
624 "com.sun.star.inspection.StringRepresentation"));
625 return s;
626 }
627
_create(const uno::Reference<uno::XComponentContext> & context)628 uno::Reference< uno::XInterface > SAL_CALL _create(
629 const uno::Reference< uno::XComponentContext > & context)
630 SAL_THROW((uno::Exception))
631 {
632 return static_cast< ::cppu::OWeakObject * >(new pcr::StringRepresentation(context));
633 }
634
635 } // closing component helper namespace
636
637 //------------------------------------------------------------------------
createRegistryInfo_StringRepresentation()638 extern "C" void SAL_CALL createRegistryInfo_StringRepresentation()
639 {
640 ::pcr::PcrModule::getInstance().registerImplementation(
641 comp_StringRepresentation::_getImplementationName(),
642 comp_StringRepresentation::_getSupportedServiceNames(),
643 comp_StringRepresentation::_create
644 );
645 }
646
647