24#include <osl/mutex.hxx>
36#include <com/sun/star/linguistic2/ConversionPropertyType.hpp>
37#include <com/sun/star/util/XFlushable.hpp>
38#include <com/sun/star/lang/EventObject.hpp>
39#include <com/sun/star/ucb/SimpleFileAccess.hpp>
40#include <com/sun/star/uno/Reference.h>
41#include <com/sun/star/util/XFlushListener.hpp>
42#include <com/sun/star/io/IOException.hpp>
43#include <com/sun/star/io/XInputStream.hpp>
44#include <com/sun/star/xml/sax/Writer.hpp>
45#include <com/sun/star/xml/sax/InputSource.hpp>
46#include <com/sun/star/xml/sax/SAXParseException.hpp>
47#include <com/sun/star/container/NoSuchElementException.hpp>
48#include <com/sun/star/container/ElementExistException.hpp>
67 if (rMainURL.isEmpty())
74 uno::Reference< io::XInputStream > xIn;
77 uno::Reference< ucb::XSimpleFileAccess3 > xAccess( ucb::SimpleFileAccess::create(xContext) );
78 xIn = xAccess->openFileRead( rMainURL );
80 catch (
const uno::Exception &)
82 SAL_WARN(
"linguistic",
"failed to get input stream" );
88 xml::sax::InputSource aParserInput;
89 aParserInput.aInputStream = xIn;
94 rImport.parseStream( aParserInput );
96 catch( xml::sax::SAXParseException& )
100 catch( xml::sax::SAXException& )
104 catch( io::IOException& )
114 if (rFileURL.isEmpty())
119 sal_Int32
nPos = rFileURL.lastIndexOf(
'.' );
121 aExt = rFileURL.copy(
nPos + 1 ).toAsciiLowerCase();
132 pImport->GetConversionType() != -1;
133 DBG_ASSERT( bRes,
"conversion dictionary corrupted?" );
137 nLang = pImport->GetLanguage();
138 nConvType = pImport->GetConversionType();
150 const OUString &rMainURL) :
152 aMainURL(rMainURL),
aName(
std::move(aName_)), nLanguage(nLang),
153 nConversionType(nConvType),
154 nMaxLeftCharCount(0), nMaxRightCharCount(0),
155 bMaxCharCountIsValid(true),
157 bIsModified(false), bIsActive(false)
165 if( !rMainURL.isEmpty() )
167 bool bExists =
false;
213 uno::Reference< io::XStream >
xStream;
216 uno::Reference< ucb::XSimpleFileAccess3 > xAccess( ucb::SimpleFileAccess::create(xContext) );
219 catch (
const uno::Exception &)
221 SAL_WARN(
"linguistic",
"failed to get input stream" );
229 uno::Reference< xml::sax::XWriter > xSaxWriter = xml::sax::Writer::create(xContext);
234 xSaxWriter->setOutputStream(
xStream->getOutputStream() );
238 bool bRet = pExport->Export();
239 DBG_ASSERT( !pStream->GetError(),
"I/O error while writing to stream" );
249 std::pair< ConvMap::iterator, ConvMap::iterator > aRange =
250 rMap.equal_range( rFirstText );
251 ConvMap::iterator aPos = rMap.end();
252 for (ConvMap::iterator aIt = aRange.first;
253 aIt != aRange.second && aPos == rMap.end();
256 if ((*aIt).second == rSecondText)
278 aFromLeft .emplace( rLeftText, rRightText );
365 const OUString& aText,
368 ConversionDirection eDirection,
373 if (!
pFromRight && eDirection != ConversionDirection_FROM_LEFT)
374 return uno::Sequence< OUString >();
379 OUString aLookUpText( aText.copy(nStartPos,
nLength) );
380 ConvMap &rConvMap = eDirection == ConversionDirection_FROM_LEFT ?
382 std::pair< ConvMap::iterator, ConvMap::iterator > aRange =
383 rConvMap.equal_range( aLookUpText );
385 std::vector<OUString> aRes;
386 auto nCount =
static_cast<size_t>(std::distance(aRange.first, aRange.second));
389 std::transform(aRange.first, aRange.second, std::back_inserter(aRes),
390 [](ConvMap::const_reference rEntry) { return rEntry.second; });
397 ConversionDirection eDirection )
401 if (!
pFromRight && eDirection != ConversionDirection_FROM_LEFT)
402 return uno::Sequence< OUString >();
407 ConvMap &rConvMap = eDirection == ConversionDirection_FROM_LEFT ?
409 std::vector<OUString> aRes;
410 aRes.reserve(rConvMap.size());
411 for (
auto const& elem : rConvMap)
413 OUString aCurEntry( elem.first );
418 if (std::find(aRes.begin(), aRes.end(), aCurEntry) == aRes.end())
419 aRes.push_back(aCurEntry);
427 const OUString& aLeftText,
428 const OUString& aRightText )
433 if (
HasEntry( aLeftText, aRightText ))
434 throw container::ElementExistException();
440 const OUString& aLeftText,
441 const OUString& aRightText )
446 if (!
HasEntry( aLeftText, aRightText ))
447 throw container::NoSuchElementException();
456 if (!
pFromRight && eDirection == ConversionDirection_FROM_RIGHT)
470 sal_Int16 nTmp =
static_cast<sal_Int16
>(elem.first.getLength());
480 sal_Int16 nTmp =
static_cast<sal_Int16
>(elem.first.getLength());
488 sal_Int16 nRes = eDirection == ConversionDirection_FROM_LEFT ?
490 DBG_ASSERT( nRes >= 0,
"invalid MaxCharCount" );
496 const OUString& rLeftText,
497 const OUString& rRightText,
498 sal_Int16 nPropertyType )
500 bool bHasElement =
HasEntry( rLeftText, rRightText);
502 throw container::NoSuchElementException();
513 const OUString& rLeftText,
514 const OUString& rRightText )
516 bool bHasElement =
HasEntry( rLeftText, rRightText);
518 throw container::NoSuchElementException();
520 sal_Int16 nRes = ConversionPropertyType::NOT_DEFINED;
525 PropTypeMap::iterator aIt =
pConvPropType->find( rLeftText );
527 nRes = (*aIt).second;
544 aEvtObj.Source = uno::Reference< XFlushable >(
this );
550 const uno::Reference< util::XFlushListener >& rxListener )
559 const uno::Reference< util::XFlushListener >& rxListener )
569 return "com.sun.star.lingu2.ConvDic";
virtual css::lang::Locale SAL_CALL getLocale() override
virtual void SAL_CALL addEntry(const OUString &aLeftText, const OUString &aRightText) override
sal_Int16 nConversionType
sal_Int16 nMaxRightCharCount
virtual ~ConvDic() override
void RemoveEntry(const OUString &rLeftText, const OUString &rRightText)
virtual ::sal_Int16 SAL_CALL getPropertyType(const OUString &aLeftText, const OUString &aRightText) override
bool bMaxCharCountIsValid
std::unique_ptr< ConvMap > pFromRight
virtual sal_Int16 SAL_CALL getConversionType() override
sal_Int16 nMaxLeftCharCount
virtual void SAL_CALL removeFlushListener(const css::uno::Reference< css::util::XFlushListener > &l) override
friend class ConvDicXMLExport
std::unique_ptr< PropTypeMap > pConvPropType
virtual OUString SAL_CALL getImplementationName() override
void AddEntry(const OUString &rLeftText, const OUString &rRightText)
virtual sal_Bool SAL_CALL isActive() override
virtual void SAL_CALL clear() override
::comphelper::OInterfaceContainerHelper3< css::util::XFlushListener > aFlushListeners
virtual void SAL_CALL setPropertyType(const OUString &aLeftText, const OUString &aRightText, ::sal_Int16 nPropertyType) override
virtual css::uno::Sequence< OUString > SAL_CALL getConversions(const OUString &aText, sal_Int32 nStartPos, sal_Int32 nLength, css::linguistic2::ConversionDirection eDirection, sal_Int32 nTextConversionOptions) override
virtual OUString SAL_CALL getName() override
static ConvMap::iterator GetEntry(ConvMap &rMap, const OUString &rFirstText, std::u16string_view rSecondText)
virtual void SAL_CALL removeEntry(const OUString &aLeftText, const OUString &aRightText) override
virtual sal_Bool SAL_CALL supportsService(const OUString &ServiceName) override
virtual css::uno::Sequence< OUString > SAL_CALL getConversionEntries(css::linguistic2::ConversionDirection eDirection) override
virtual void SAL_CALL addFlushListener(const css::uno::Reference< css::util::XFlushListener > &l) override
virtual void SAL_CALL flush() override
virtual void SAL_CALL setActive(sal_Bool bActivate) override
bool HasEntry(const OUString &rLeftText, std::u16string_view rRightText)
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
virtual sal_Int16 SAL_CALL getMaxCharCount(css::linguistic2::ConversionDirection eDirection) override
static css::lang::Locale convertToLocale(LanguageType nLangID, bool bResolveSystem=true)
sal_Int32 addInterface(const css::uno::Reference< ListenerT > &rxIFace)
sal_Int32 removeInterface(const css::uno::Reference< ListenerT > &rxIFace)
void notifyEach(void(SAL_CALL ListenerT::*NotificationMethod)(const EventT &), const EventT &Event)
static std::unique_ptr< SvStream > CreateStream(const OUString &rFileName, StreamMode eOpenMode, css::uno::Reference< css::awt::XWindow > xParentWin=nullptr)
static void ReadThroughDic(const OUString &rMainURL, ConvDicXMLImport &rImport)
bool IsConvDic(const OUString &rFileURL, LanguageType &nLang, sal_Int16 &nConvType)
constexpr OUStringLiteral CONV_DIC_EXT
constexpr OUStringLiteral SN_CONV_DICTIONARY
std::unordered_multimap< OUString, OUString > ConvMap
std::unordered_multimap< OUString, sal_Int16 > PropTypeMap
#define DBG_ASSERT(sCon, aError)
#define TOOLS_WARN_EXCEPTION(area, stream)
#define LANGUAGE_CHINESE_TRADITIONAL
#define LANGUAGE_CHINESE_SIMPLIFIED
#define SAL_WARN(area, stream)
css::uno::Sequence< DstElementType > containerToSequence(const SrcType &i_Container)
Reference< XComponentContext > getProcessComponentContext()
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
bool IsReadOnly(const OUString &rURL, bool *pbExist)
bool LinguIsUnspecified(LanguageType nLanguage)
Checks if a LanguageType is one of the values that denote absence of language or undetermined languag...
osl::Mutex & GetLinguMutex()
! multi-thread safe mutex for all platforms !!