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_unotools.hxx"
30 #include <unotools/collatorwrapper.hxx>
31 #include <tools/debug.hxx>
32 
33 #ifndef _COMPHELPER_COMPONENTFACTORY_HXX_
34 #include <comphelper/componentfactory.hxx>
35 #endif
36 #include <com/sun/star/uno/XInterface.hpp>
37 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
38 
39 using namespace ::com::sun::star;
40 
41 CollatorWrapper::CollatorWrapper (
42 		const uno::Reference< lang::XMultiServiceFactory > &xServiceFactory)
43 	: mxServiceFactory (xServiceFactory)
44 {
45 	::rtl::OUString aService (RTL_CONSTASCII_USTRINGPARAM("com.sun.star.i18n.Collator"));
46 
47 	if (mxServiceFactory.is())
48 	{
49 		try
50 		{
51 			mxInternationalCollator = uno::Reference< i18n::XCollator > (
52 				mxServiceFactory->createInstance(aService), uno::UNO_QUERY);
53 		}
54 		catch (uno::Exception& rException)
55 		{
56             (void)rException;
57 			DBG_ERRORFILE ("CollatorWrapper: failed to create instance");
58 		}
59 	}
60 	else
61 	{
62 		::rtl::OUString aLibrary (RTL_CONSTASCII_USTRINGPARAM(LLCF_LIBNAME("i18n")));
63 
64 		try
65 		{
66 			uno::Reference< uno::XInterface > xInstance =
67 				::comphelper::getComponentInstance (aLibrary, aService);
68 
69 			if (xInstance.is())
70 			{
71 				uno::Any xInterface = xInstance->queryInterface (
72 					::getCppuType((const uno::Reference< i18n::XCollator >*)0) );
73 				xInterface >>= mxInternationalCollator;
74 			}
75 		}
76 		catch (uno::Exception& rException)
77 		{
78             (void)rException;
79 			DBG_ERRORFILE ("CollatorWrapper: failed to get component instance!");
80 		}
81 	}
82 
83 	DBG_ASSERT (mxInternationalCollator.is(), "CollatorWrapper: no i18n collator");
84 }
85 
86 CollatorWrapper::~CollatorWrapper()
87 {
88 }
89 
90 sal_Int32
91 CollatorWrapper::compareSubstring (
92 		const ::rtl::OUString& s1, sal_Int32 off1, sal_Int32 len1,
93         const ::rtl::OUString& s2, sal_Int32 off2, sal_Int32 len2) const
94 {
95 	try
96 	{
97 		if (mxInternationalCollator.is())
98 			return mxInternationalCollator->compareSubstring (
99 														s1, off1, len1, s2, off2, len2);
100 	}
101 	catch (uno::RuntimeException& rRuntimeException)
102 	{
103         (void)rRuntimeException;
104 		DBG_ERRORFILE ("CollatorWrapper: compareSubstring failed");
105 	}
106 
107 	return 0;
108 }
109 
110 sal_Int32
111 CollatorWrapper::compareString (const ::rtl::OUString& s1, const ::rtl::OUString& s2) const
112 {
113 	try
114 	{
115 		if (mxInternationalCollator.is())
116 			return mxInternationalCollator->compareString (s1, s2);
117 	}
118 	catch (uno::RuntimeException& rRuntimeException)
119 	{
120         (void)rRuntimeException;
121 		DBG_ERRORFILE ("CollatorWrapper: compareString failed");
122 	}
123 
124 	return 0;
125 }
126 
127 uno::Sequence< ::rtl::OUString >
128 CollatorWrapper::listCollatorAlgorithms (const lang::Locale& rLocale) const
129 {
130 	try
131 	{
132 		if (mxInternationalCollator.is())
133 			return mxInternationalCollator->listCollatorAlgorithms (rLocale);
134 	}
135 	catch (uno::RuntimeException& rRuntimeException)
136 	{
137         (void)rRuntimeException;
138 		DBG_ERRORFILE ("CollatorWrapper: listCollatorAlgorithms failed");
139 	}
140 
141 	return uno::Sequence< ::rtl::OUString > ();
142 }
143 
144 uno::Sequence< sal_Int32 >
145 CollatorWrapper::listCollatorOptions (const ::rtl::OUString& rAlgorithm) const
146 {
147 	try
148 	{
149 		if (mxInternationalCollator.is())
150 			return mxInternationalCollator->listCollatorOptions (rAlgorithm);
151 	}
152 	catch (uno::RuntimeException& rRuntimeException)
153 	{
154         (void)rRuntimeException;
155 		DBG_ERRORFILE ("CollatorWrapper: listCollatorOptions failed");
156 	}
157 
158 	return uno::Sequence< sal_Int32 > ();
159 }
160 
161 sal_Int32
162 CollatorWrapper::loadDefaultCollator (const lang::Locale& rLocale, sal_Int32 nOptions)
163 {
164 	try
165 	{
166 		if (mxInternationalCollator.is())
167 			return mxInternationalCollator->loadDefaultCollator (rLocale, nOptions);
168 	}
169 	catch (uno::RuntimeException& rRuntimeException)
170 	{
171         (void)rRuntimeException;
172 		DBG_ERRORFILE ("CollatorWrapper: loadDefaultCollator failed");
173 	}
174 
175 	return 0;
176 }
177 
178 sal_Int32
179 CollatorWrapper::loadCollatorAlgorithm (const ::rtl::OUString& rAlgorithm,
180 		const lang::Locale& rLocale, sal_Int32 nOptions)
181 {
182 	try
183 	{
184 		if (mxInternationalCollator.is())
185 			return mxInternationalCollator->loadCollatorAlgorithm (
186 														rAlgorithm, rLocale, nOptions);
187 	}
188 	catch (uno::RuntimeException& rRuntimeException)
189 	{
190         (void)rRuntimeException;
191 		DBG_ERRORFILE ("CollatorWrapper: loadCollatorAlgorithm failed");
192 	}
193 
194 	return 0;
195 
196 }
197 
198 void
199 CollatorWrapper::loadCollatorAlgorithmWithEndUserOption (
200 		const ::rtl::OUString& rAlgorithm,
201 		const lang::Locale& rLocale, const uno::Sequence< sal_Int32 >& rOption)
202 {
203 	try
204 	{
205 		if (mxInternationalCollator.is())
206 			mxInternationalCollator->loadCollatorAlgorithmWithEndUserOption (
207 														rAlgorithm, rLocale, rOption);
208 	}
209 	catch (uno::RuntimeException& rRuntimeException)
210 	{
211         (void)rRuntimeException;
212 		DBG_ERRORFILE ("CollatorWrapper: loadCollatorAlgorithmWithEndUserOption failed");
213 	}
214 }
215