[Libreoffice-commits] core.git: 3 commits - sfx2/source ucb/source

Stephan Bergmann sbergman at redhat.com
Thu May 23 08:46:57 PDT 2013


 sfx2/source/doc/docfile.cxx                        |   15 
 ucb/source/core/ucb.cxx                            |    6 
 ucb/source/inc/regexpmap.hxx                       |  494 +++++++++++++++++
 ucb/source/inc/regexpmap.tpt                       |  579 ---------------------
 ucb/source/ucp/webdav-neon/NeonPropFindRequest.cxx |    2 
 5 files changed, 496 insertions(+), 600 deletions(-)

New commits:
commit aac817bca6951a42bfe6c8fbfd86163190f96997
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Thu May 23 17:42:51 2013 +0200

    Related rhbz#961460: Fix regression around OUString::compareTo usage
    
    ...originally introduced with 8da928423add3fdb94baee2a3f3fa053390f828e "Remove
    RTL_CONSTASCII_(U)STRINGPARAM in ucb(ucp)," leading to "IsFolder" not being
    properly set in the WebDAV UCP, leading to failure when saving documents.
    
    Change-Id: Id2cc98582c9feffaa501a68069cd606fb420fd29

diff --git a/ucb/source/ucp/webdav-neon/NeonPropFindRequest.cxx b/ucb/source/ucp/webdav-neon/NeonPropFindRequest.cxx
index 0ec097c..c5945f2 100644
--- a/ucb/source/ucp/webdav-neon/NeonPropFindRequest.cxx
+++ b/ucb/source/ucp/webdav-neon/NeonPropFindRequest.cxx
@@ -135,7 +135,7 @@ extern "C" int NPFR_propfind_iter( void* userdata,
             if ( !aValue.isEmpty() )
             {
                 aValue = stripDavNamespace( aValue ).toAsciiLowerCase();
-                if ( aValue == "<collection" )
+                if ( aValue.startsWith("<collection") )
                 {
                     thePropertyValue.Value
                         <<= OUString("collection");
commit 3f5c45b70864af95a6362acf4684fb57eb85e348
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Thu May 23 17:17:09 2013 +0200

    rhbz#961460: Don't needlessly pass URLs through INetURLObject
    
    The WebDAV UCP uses https/davs URLs that may contain a userinfo (cf. RFC 3986)
    part, and INetURLObject does not support that (in accordance with RFCs 2818 and
    2616) and thus creates an empty INET_PROT_NOT_VALID INetURLObject for such a
    URL, leading to failure when trying to save a document to such a URL.
    (Regression introduced with 966d20e35d5a2be2fce6c204af5c156c3ead7063 "CMIS ucp:
    write documents back to CMIS server.")
    
    Change-Id: Ifd396852b211cab1d29575da7fccb32306479f93

diff --git a/sfx2/source/doc/docfile.cxx b/sfx2/source/doc/docfile.cxx
index 8d22eb4..746ba20 100644
--- a/sfx2/source/doc/docfile.cxx
+++ b/sfx2/source/doc/docfile.cxx
@@ -1949,6 +1949,7 @@ void SfxMedium::Transfer_Impl()
 
             ::ucbhelper::Content aDestContent;
             ::ucbhelper::Content::create( aDestURL, xComEnv, comphelper::getProcessComponentContext(), aDestContent );
+            // For checkin, we need the object URL, not the parent folder:
             if ( !IsInCheckIn( ) )
             {
                 // Get the parent URL from the XChild if possible: why would the URL necessarily have
@@ -1964,13 +1965,11 @@ void SfxMedium::Transfer_Impl()
                     }
                 }
 
-                if ( !sParentUrl.isEmpty() )
-                    aDest = INetURLObject( sParentUrl );
-            }
-            else
-            {
-                // For checkin, we need the object URL, not the parent folder
-                aDest = INetURLObject( aDestURL );
+                if ( sParentUrl.isEmpty() )
+                    aDestURL = aDest.GetMainURL( INetURLObject::NO_DECODE );
+                        // adjust to above aDest.removeSegment()
+                else
+                    aDestURL = sParentUrl;
             }
 
             // LongName wasn't defined anywhere, only used here... get the Title instead
@@ -1983,7 +1982,7 @@ void SfxMedium::Transfer_Impl()
 
             try
             {
-                aTransferContent = ::ucbhelper::Content( aDest.GetMainURL( INetURLObject::NO_DECODE ), xComEnv, comphelper::getProcessComponentContext() );
+                aTransferContent = ::ucbhelper::Content( aDestURL, xComEnv, comphelper::getProcessComponentContext() );
             }
             catch (const ::com::sun::star::ucb::ContentCreationException& ex)
             {
commit 3a8cde7099c48574c3f5491c2cb964bfec21a5e3
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Thu May 23 12:27:29 2013 +0200

    Fold regexpmap.tpt inline template definitions into regexpmap.hxx
    
    Change-Id: I443367fc355a8fdea3156f85dde65cf43795f1bc

diff --git a/ucb/source/core/ucb.cxx b/ucb/source/core/ucb.cxx
index 324641d..493ff51 100644
--- a/ucb/source/core/ucb.cxx
+++ b/ucb/source/core/ucb.cxx
@@ -44,12 +44,6 @@
 
 #include "ucb.hxx"
 
-// Definitions for ProviderMap_Impl (Solaris wouldn't find explicit template
-// instantiations for these in another compilation unit...):
-#ifndef _UCB_REGEXPMAP_TPT_
-#include <regexpmap.tpt>
-#endif
-
 using namespace cppu;
 using namespace com::sun::star::uno;
 using namespace com::sun::star::lang;
diff --git a/ucb/source/inc/regexpmap.hxx b/ucb/source/inc/regexpmap.hxx
index 3e960d1..dc1f95d 100644
--- a/ucb/source/inc/regexpmap.hxx
+++ b/ucb/source/inc/regexpmap.hxx
@@ -20,9 +20,15 @@
 #ifndef _UCB_REGEXPMAP_HXX_
 #define _UCB_REGEXPMAP_HXX_
 
+#include "sal/config.h"
+
+#include <list>
+
 #include <rtl/ustring.hxx>
 #include <sal/types.h>
 
+#include "regexp.hxx"
+
 namespace ucb_impl {
 
 template< typename Val > class RegexpMap;
@@ -49,11 +55,199 @@ private:
 };
 
 //============================================================================
-template< typename Val > class RegexpMapIterImpl;
-    // MSC doesn't like this to be a private RegexpMapConstIter member
-    // class...
 
 template< typename Val >
+struct Entry
+{
+    Regexp m_aRegexp;
+    Val m_aValue;
+
+    inline Entry(Regexp const & rTheRegexp, Val const & rTheValue):
+        m_aRegexp(rTheRegexp), m_aValue(rTheValue) {}
+};
+
+//============================================================================
+template< typename Val > class List: public std::list< Entry< Val > > {};
+
+//============================================================================
+template< typename Val >
+struct RegexpMapImpl
+{
+    List< Val > m_aList[Regexp::KIND_DOMAIN + 1];
+    Entry< Val > * m_pDefault;
+
+    RegexpMapImpl(): m_pDefault(0) {}
+
+    ~RegexpMapImpl() { delete m_pDefault; }
+};
+
+//============================================================================
+template< typename Val >
+class RegexpMapIterImpl
+{
+public:
+    typedef RegexpMapImpl< Val > MapImpl;
+    typedef typename List< Val >::iterator ListIterator;
+
+    // Solaris needs these for the ctor...
+
+    inline RegexpMapIterImpl();
+
+    inline RegexpMapIterImpl(MapImpl * pTheMap, int nTheList,
+                             ListIterator aTheIndex);
+
+    RegexpMapIterImpl(RegexpMapImpl< Val > * pTheMap, bool bBegin);
+
+    RegexpMapIterImpl(RegexpMapIterImpl const & rOther);
+
+    RegexpMapIterImpl & operator =(RegexpMapIterImpl const & rOther);
+
+    bool operator ==(RegexpMapIterImpl const & rOther) const;
+
+    RegexpMapImpl< Val > const * getMap() const { return m_pMap; }
+
+    int getList() const { return m_nList; }
+
+    typename List< Val >::iterator const & getIndex() const { return m_aIndex; }
+
+    void next();
+
+    RegexpMapEntry< Val > & get();
+
+private:
+    mutable RegexpMapEntry< Val > m_aEntry;
+    typename List< Val >::iterator m_aIndex;
+    RegexpMapImpl< Val > * m_pMap;
+    int m_nList;
+    mutable bool m_bEntrySet;
+
+    void setEntry() const;
+};
+
+template< typename Val >
+inline RegexpMapIterImpl< Val >::RegexpMapIterImpl():
+    m_aEntry(rtl::OUString(), 0),
+    m_pMap(0),
+    m_nList(-1),
+    m_bEntrySet(false)
+{}
+
+template< typename Val >
+inline RegexpMapIterImpl< Val >::RegexpMapIterImpl(MapImpl * pTheMap,
+                                                   int nTheList,
+                                                   ListIterator aTheIndex):
+    m_aEntry(rtl::OUString(), 0),
+    m_aIndex(aTheIndex),
+    m_pMap(pTheMap),
+    m_nList(nTheList),
+    m_bEntrySet(false)
+{}
+
+template< typename Val >
+void RegexpMapIterImpl< Val >::setEntry() const
+{
+    if (!m_bEntrySet)
+    {
+        Entry< Val > const & rTheEntry
+            = m_nList == -1 ? *m_pMap->m_pDefault : *m_aIndex;
+        m_aEntry
+            = RegexpMapEntry< Val >(rTheEntry.m_aRegexp.getRegexp(false),
+                                    const_cast< Val * >(&rTheEntry.m_aValue));
+        m_bEntrySet = true;
+    }
+}
+
+template< typename Val >
+RegexpMapIterImpl< Val >::RegexpMapIterImpl(RegexpMapImpl< Val > * pTheMap,
+                                            bool bBegin):
+    m_aEntry(rtl::OUString(), 0),
+    m_pMap(pTheMap),
+    m_bEntrySet(false)
+{
+    if (bBegin)
+    {
+        m_nList = -1;
+        if (!m_pMap->m_pDefault)
+            next();
+    }
+    else
+    {
+        m_nList = Regexp::KIND_DOMAIN;
+        m_aIndex = m_pMap->m_aList[Regexp::KIND_DOMAIN].end();
+    }
+}
+
+template< typename Val >
+RegexpMapIterImpl< Val >::RegexpMapIterImpl(RegexpMapIterImpl const & rOther):
+    m_aEntry(rOther.m_aEntry), m_pMap(rOther.m_pMap), m_nList(rOther.m_nList),
+    m_bEntrySet(rOther.m_bEntrySet)
+{
+    if (m_nList != -1)
+        m_aIndex = rOther.m_aIndex;
+}
+
+template< typename Val >
+RegexpMapIterImpl< Val > & RegexpMapIterImpl< Val >::operator =(
+    RegexpMapIterImpl const & rOther)
+{
+    if (this != &rOther)
+    {
+        m_aEntry = rOther.m_aEntry;
+        m_pMap = rOther.m_pMap;
+        m_nList = rOther.m_nList;
+        m_bEntrySet = rOther.m_bEntrySet;
+        if (m_nList == -1)
+            m_aIndex = typename List< Val >::iterator();
+        else
+            m_aIndex = rOther.m_aIndex;
+    }
+    return *this;
+}
+
+template< typename Val >
+bool RegexpMapIterImpl< Val >::operator ==(RegexpMapIterImpl const & rOther)
+    const
+{
+    return m_pMap == rOther.m_pMap
+           && m_nList == rOther.m_nList
+           && (m_nList == -1 || m_aIndex == rOther.m_aIndex);
+}
+
+template< typename Val >
+void RegexpMapIterImpl< Val >::next()
+{
+    switch (m_nList)
+    {
+        case Regexp::KIND_DOMAIN:
+            if (m_aIndex == m_pMap->m_aList[m_nList].end())
+                return;
+        default:
+            ++m_aIndex;
+            if (m_nList == Regexp::KIND_DOMAIN
+                || m_aIndex != m_pMap->m_aList[m_nList].end())
+                break;
+        case -1:
+            do
+            {
+                ++m_nList;
+                m_aIndex = m_pMap->m_aList[m_nList].begin();
+            }
+            while (m_nList < Regexp::KIND_DOMAIN
+                   && m_aIndex == m_pMap->m_aList[m_nList].end());
+            break;
+    }
+    m_bEntrySet = false;
+}
+
+template< typename Val >
+RegexpMapEntry< Val > & RegexpMapIterImpl< Val >::get()
+{
+    setEntry();
+    return m_aEntry;
+}
+
+//============================================================================
+template< typename Val >
 class RegexpMapConstIter
 {
     friend class RegexpMap< Val >; // to access m_pImpl, ctor
@@ -85,6 +279,71 @@ private:
     RegexpMapConstIter(RegexpMapIterImpl< Val > * pTheImpl);
 };
 
+template< typename Val >
+RegexpMapConstIter< Val >::RegexpMapConstIter(RegexpMapIterImpl< Val > *
+                                                  pTheImpl):
+    m_pImpl(pTheImpl)
+{}
+
+template< typename Val >
+RegexpMapConstIter< Val >::RegexpMapConstIter():
+    m_pImpl(new RegexpMapIterImpl< Val >)
+{}
+
+template< typename Val >
+RegexpMapConstIter< Val >::RegexpMapConstIter(RegexpMapConstIter const &
+                                                  rOther):
+    m_pImpl(new RegexpMapIterImpl< Val >(*rOther.m_pImpl))
+{}
+
+template< typename Val >
+RegexpMapConstIter< Val >::~RegexpMapConstIter()
+{
+    delete m_pImpl;
+}
+
+template< typename Val >
+RegexpMapConstIter< Val > &
+RegexpMapConstIter< Val >::operator =(RegexpMapConstIter const & rOther)
+{
+    *m_pImpl = *rOther.m_pImpl;
+    return *this;
+}
+
+template< typename Val >
+RegexpMapConstIter< Val > & RegexpMapConstIter< Val >::operator ++()
+{
+    m_pImpl->next();
+    return *this;
+}
+
+template< typename Val >
+RegexpMapConstIter< Val > RegexpMapConstIter< Val >::operator ++(int)
+{
+    RegexpMapConstIter aTemp(*this);
+    m_pImpl->next();
+    return aTemp;
+}
+
+template< typename Val >
+RegexpMapEntry< Val > const & RegexpMapConstIter< Val >::operator *() const
+{
+    return m_pImpl->get();
+}
+
+template< typename Val >
+RegexpMapEntry< Val > const * RegexpMapConstIter< Val >::operator ->() const
+{
+    return &m_pImpl->get();
+}
+
+template< typename Val >
+bool RegexpMapConstIter< Val >::equals(RegexpMapConstIter const & rOther)
+    const
+{
+    return *m_pImpl == *rOther.m_pImpl;
+}
+
 //============================================================================
 template< typename Val >
 class RegexpMapIter: public RegexpMapConstIter< Val >
@@ -110,11 +369,52 @@ private:
     RegexpMapIter(RegexpMapIterImpl< Val > * pTheImpl);
 };
 
-//============================================================================
-template< typename Val > struct RegexpMapImpl;
-    // MSC doesn't like this to be a RegexpMap member class...
+template< typename Val >
+RegexpMapIter< Val >::RegexpMapIter(RegexpMapIterImpl< Val > * pTheImpl):
+    RegexpMapConstIter< Val >(pTheImpl)
+{}
+
+template< typename Val >
+RegexpMapIter< Val > & RegexpMapIter< Val >::operator ++()
+{
+    this->m_pImpl->next();
+    return *this;
+}
+
+template< typename Val >
+RegexpMapIter< Val > RegexpMapIter< Val >::operator ++(int)
+{
+    RegexpMapIter aTemp(*this);
+    this->m_pImpl->next();
+    return aTemp;
+}
 
 template< typename Val >
+RegexpMapEntry< Val > & RegexpMapIter< Val >::operator *()
+{
+    return this->m_pImpl->get();
+}
+
+template< typename Val >
+RegexpMapEntry< Val > const & RegexpMapIter< Val >::operator *() const
+{
+    return this->m_pImpl->get();
+}
+
+template< typename Val >
+RegexpMapEntry< Val > * RegexpMapIter< Val >::operator ->()
+{
+    return &this->m_pImpl->get();
+}
+
+template< typename Val >
+RegexpMapEntry< Val > const * RegexpMapIter< Val >::operator ->() const
+{
+    return &this->m_pImpl->get();
+}
+
+//============================================================================
+template< typename Val >
 class RegexpMap
 {
 public:
@@ -159,6 +459,188 @@ private:
     RegexpMapImpl< Val > * m_pImpl;
 };
 
+template< typename Val >
+RegexpMap< Val >::RegexpMap():
+    m_pImpl(new RegexpMapImpl< Val >)
+{}
+
+template< typename Val >
+RegexpMap< Val >::RegexpMap(RegexpMap const & rOther):
+    m_pImpl(new RegexpMapImpl< Val >(*rOther.m_pImpl))
+{}
+
+template< typename Val >
+RegexpMap< Val >::~RegexpMap()
+{
+    delete m_pImpl;
+}
+
+template< typename Val >
+RegexpMap< Val > & RegexpMap< Val >::operator =(RegexpMap const & rOther)
+{
+    *m_pImpl = *rOther.m_pImpl;
+    return *this;
+}
+
+template< typename Val >
+bool RegexpMap< Val >::add(rtl::OUString const & rKey, Val const & rValue,
+                           bool bOverwrite, rtl::OUString * pReverse)
+{
+    Regexp aRegexp(Regexp::parse(rKey));
+
+    if (aRegexp.isDefault())
+    {
+        if (m_pImpl->m_pDefault)
+        {
+            if (!bOverwrite)
+                return false;
+            delete m_pImpl->m_pDefault;
+        }
+        m_pImpl->m_pDefault = new Entry< Val >(aRegexp, rValue);
+    }
+    else
+    {
+        List< Val > & rTheList = m_pImpl->m_aList[aRegexp.getKind()];
+
+        typename List< Val >::iterator aEnd(rTheList.end());
+        for (typename List< Val >::iterator aIt(rTheList.begin()); aIt != aEnd; ++aIt)
+        {
+            if (aIt->m_aRegexp == aRegexp)
+            {
+                if (bOverwrite)
+                {
+                    rTheList.erase(aIt);
+                    break;
+                }
+                else
+                    return false;
+            }
+        }
+
+        rTheList.push_back(Entry< Val >(aRegexp, rValue));
+    }
+
+    if (pReverse)
+        *pReverse = aRegexp.getRegexp(true);
+
+    return true;
+}
+
+template< typename Val >
+typename RegexpMap< Val >::iterator RegexpMap< Val >::find(rtl::OUString const & rKey,
+                                                  rtl::OUString * pReverse)
+{
+    Regexp aRegexp(Regexp::parse(rKey));
+
+    if (pReverse)
+        *pReverse = aRegexp.getRegexp(true);
+
+    if (aRegexp.isDefault())
+    {
+        if (m_pImpl->m_pDefault)
+            return RegexpMapIter< Val >(new RegexpMapIterImpl< Val >(m_pImpl,
+                                                                     true));
+    }
+    else
+    {
+        List< Val > & rTheList = m_pImpl->m_aList[aRegexp.getKind()];
+
+        typename List< Val > ::iterator aEnd(rTheList.end());
+        for (typename List< Val >::iterator aIt(rTheList.begin()); aIt != aEnd; ++aIt)
+            if (aIt->m_aRegexp == aRegexp)
+                return RegexpMapIter< Val >(new RegexpMapIterImpl< Val >(
+                                                    m_pImpl,
+                                                    aRegexp.getKind(), aIt));
+    }
+
+    return RegexpMapIter< Val >(new RegexpMapIterImpl< Val >(m_pImpl, false));
+}
+
+template< typename Val >
+void RegexpMap< Val >::erase(iterator const & rPos)
+{
+    if (rPos.m_pImpl->getMap() == m_pImpl)
+    {
+        if (rPos.m_pImpl->getList() == -1)
+        {
+            if (m_pImpl->m_pDefault)
+            {
+                delete m_pImpl->m_pDefault;
+                m_pImpl->m_pDefault = 0;
+            }
+        }
+        else
+            m_pImpl->m_aList[rPos.m_pImpl->getList()].
+                         erase(rPos.m_pImpl->getIndex());
+    }
+}
+
+template< typename Val >
+typename RegexpMap< Val >::iterator RegexpMap< Val >::begin()
+{
+    return RegexpMapIter< Val >(new RegexpMapIterImpl< Val >(m_pImpl, true));
+}
+
+template< typename Val >
+typename RegexpMap< Val >::const_iterator RegexpMap< Val >::begin() const
+{
+    return RegexpMapConstIter< Val >(new RegexpMapIterImpl< Val >(m_pImpl,
+                                                                  true));
+}
+
+template< typename Val >
+typename RegexpMap< Val >::iterator RegexpMap< Val >::end()
+{
+    return RegexpMapIter< Val >(new RegexpMapIterImpl< Val >(m_pImpl, false));
+}
+
+template< typename Val >
+typename RegexpMap< Val >::const_iterator RegexpMap< Val >::end() const
+{
+    return RegexpMapConstIter< Val >(new RegexpMapIterImpl< Val >(m_pImpl,
+                                                                  false));
+}
+
+template< typename Val >
+bool RegexpMap< Val >::empty() const
+{
+    return !m_pImpl->m_pDefault
+           && m_pImpl->m_aList[Regexp::KIND_PREFIX].empty()
+           && m_pImpl->m_aList[Regexp::KIND_AUTHORITY].empty()
+           && m_pImpl->m_aList[Regexp::KIND_DOMAIN].empty();
+}
+
+template< typename Val >
+typename RegexpMap< Val >::size_type RegexpMap< Val >::size() const
+{
+    return (m_pImpl->m_pDefault ? 1 : 0)
+               + m_pImpl->m_aList[Regexp::KIND_PREFIX].size()
+               + m_pImpl->m_aList[Regexp::KIND_AUTHORITY].size()
+               + m_pImpl->m_aList[Regexp::KIND_DOMAIN].size();
+}
+
+template< typename Val >
+Val const * RegexpMap< Val >::map(rtl::OUString const & rString,
+                                  rtl::OUString * pTranslation,
+                                  bool * pTranslated) const
+{
+    for (int n = Regexp::KIND_DOMAIN; n >= Regexp::KIND_PREFIX; --n)
+    {
+        List< Val > const & rTheList = m_pImpl->m_aList[n];
+
+        typename List< Val >::const_iterator aEnd(rTheList.end());
+        for (typename List< Val >::const_iterator aIt(rTheList.begin()); aIt != aEnd;
+             ++aIt)
+            if (aIt->m_aRegexp.matches(rString, pTranslation, pTranslated))
+                return &aIt->m_aValue;
+    }
+    if (m_pImpl->m_pDefault
+        && m_pImpl->m_pDefault->m_aRegexp.matches(rString, pTranslation,
+                                                  pTranslated))
+        return &m_pImpl->m_pDefault->m_aValue;
+    return 0;
+}
+
 }
 
 //============================================================================
diff --git a/ucb/source/inc/regexpmap.tpt b/ucb/source/inc/regexpmap.tpt
deleted file mode 100644
index a5836e6..0000000
--- a/ucb/source/inc/regexpmap.tpt
+++ /dev/null
@@ -1,579 +0,0 @@
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- *   Licensed to the Apache Software Foundation (ASF) under one or more
- *   contributor license agreements. See the NOTICE file distributed
- *   with this work for additional information regarding copyright
- *   ownership. The ASF licenses this file to you under the Apache
- *   License, Version 2.0 (the "License"); you may not use this file
- *   except in compliance with the License. You may obtain a copy of
- *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#ifndef _UCB_REGEXPMAP_TPT_
-#define _UCB_REGEXPMAP_TPT_
-
-#include <regexpmap.hxx>
-#include <list>
-#include <rtl/ustring.hxx>
-
-#include "regexp.hxx"
-
-using namespace ucb_impl;
-
-namespace ucb_impl {
-
-//============================================================================
-
-template< typename Val >
-struct Entry
-{
-	Regexp m_aRegexp;
-	Val m_aValue;
-
-	inline Entry(Regexp const & rTheRegexp, Val const & rTheValue):
-		m_aRegexp(rTheRegexp), m_aValue(rTheValue) {}
-};
-
-//============================================================================
-template< typename Val > class List: public std::list< Entry< Val > > {};
-
-//============================================================================
-//
-//  RegexpMapIterImpl
-//
-//============================================================================
-
-template< typename Val >
-class RegexpMapIterImpl
-{
-public:
-	typedef RegexpMapImpl< Val > MapImpl;
-	typedef typename List< Val >::iterator ListIterator;
-
-	// Solaris needs these for the ctor...
-
-	inline RegexpMapIterImpl();
-
-	inline RegexpMapIterImpl(MapImpl * pTheMap, int nTheList,
-							 ListIterator aTheIndex);
-
-	RegexpMapIterImpl(RegexpMapImpl< Val > * pTheMap, bool bBegin);
-
-	RegexpMapIterImpl(RegexpMapIterImpl const & rOther);
-
-	RegexpMapIterImpl & operator =(RegexpMapIterImpl const & rOther);
-
-	bool operator ==(RegexpMapIterImpl const & rOther) const;
-
-	RegexpMapImpl< Val > const * getMap() const { return m_pMap; }
-
-	int getList() const { return m_nList; }
-
-	typename List< Val >::iterator const & getIndex() const { return m_aIndex; }
-
-	void next();
-
-	RegexpMapEntry< Val > & get();
-
-private:
-	mutable RegexpMapEntry< Val > m_aEntry;
-	typename List< Val >::iterator m_aIndex;
-	RegexpMapImpl< Val > * m_pMap;
-	int m_nList;
-	mutable bool m_bEntrySet;
-
-	void setEntry() const;
-};
-
-}
-
-template< typename Val >
-inline RegexpMapIterImpl< Val >::RegexpMapIterImpl():
-	m_aEntry(rtl::OUString(), 0),
-	m_pMap(0),
-	m_nList(-1),
-	m_bEntrySet(false)
-{}
-
-template< typename Val >
-inline RegexpMapIterImpl< Val >::RegexpMapIterImpl(MapImpl * pTheMap,
-												   int nTheList,
-												   ListIterator aTheIndex):
-	m_aEntry(rtl::OUString(), 0),
-	m_aIndex(aTheIndex),
-	m_pMap(pTheMap),
-	m_nList(nTheList),
-	m_bEntrySet(false)
-{}
-
-//============================================================================
-template< typename Val >
-void RegexpMapIterImpl< Val >::setEntry() const
-{
-	if (!m_bEntrySet)
-	{
-		Entry< Val > const & rTheEntry
-			= m_nList == -1 ? *m_pMap->m_pDefault : *m_aIndex;
-		m_aEntry
-			= RegexpMapEntry< Val >(rTheEntry.m_aRegexp.getRegexp(false),
-									const_cast< Val * >(&rTheEntry.m_aValue));
-		m_bEntrySet = true;
-	}
-}
-
-//============================================================================
-template< typename Val >
-RegexpMapIterImpl< Val >::RegexpMapIterImpl(RegexpMapImpl< Val > * pTheMap,
-											bool bBegin):
-	m_aEntry(rtl::OUString(), 0),
-	m_pMap(pTheMap),
-	m_bEntrySet(false)
-{
-	if (bBegin)
-	{
-		m_nList = -1;
-		if (!m_pMap->m_pDefault)
-			next();
-	}
-	else
-	{
-		m_nList = Regexp::KIND_DOMAIN;
-		m_aIndex = m_pMap->m_aList[Regexp::KIND_DOMAIN].end();
-	}
-}
-
-//============================================================================
-template< typename Val >
-RegexpMapIterImpl< Val >::RegexpMapIterImpl(RegexpMapIterImpl const & rOther):
-    m_aEntry(rOther.m_aEntry), m_pMap(rOther.m_pMap), m_nList(rOther.m_nList),
-    m_bEntrySet(rOther.m_bEntrySet)
-{
-    if (m_nList != -1)
-        m_aIndex = rOther.m_aIndex;
-}
-
-//============================================================================
-template< typename Val >
-RegexpMapIterImpl< Val > & RegexpMapIterImpl< Val >::operator =(
-    RegexpMapIterImpl const & rOther)
-{
-    if (this != &rOther)
-    {
-        m_aEntry = rOther.m_aEntry;
-        m_pMap = rOther.m_pMap;
-        m_nList = rOther.m_nList;
-        m_bEntrySet = rOther.m_bEntrySet;
-        if (m_nList == -1)
-            m_aIndex = typename List< Val >::iterator();
-        else
-            m_aIndex = rOther.m_aIndex;
-    }
-    return *this;
-}
-
-//============================================================================
-template< typename Val >
-bool RegexpMapIterImpl< Val >::operator ==(RegexpMapIterImpl const & rOther)
-	const
-{
-	return m_pMap == rOther.m_pMap
-		   && m_nList == rOther.m_nList
-		   && (m_nList == -1 || m_aIndex == rOther.m_aIndex);
-}
-
-//============================================================================
-template< typename Val >
-void RegexpMapIterImpl< Val >::next()
-{
-	switch (m_nList)
-	{
-		case Regexp::KIND_DOMAIN:
-			if (m_aIndex == m_pMap->m_aList[m_nList].end())
-				return;
-		default:
-			++m_aIndex;
-			if (m_nList == Regexp::KIND_DOMAIN
-				|| m_aIndex != m_pMap->m_aList[m_nList].end())
-				break;
-		case -1:
-			do
-			{
-				++m_nList;
-				m_aIndex = m_pMap->m_aList[m_nList].begin();
-			}
-			while (m_nList < Regexp::KIND_DOMAIN
-				   && m_aIndex == m_pMap->m_aList[m_nList].end());
-			break;
-	}
-	m_bEntrySet = false;
-}
-
-//============================================================================
-template< typename Val >
-RegexpMapEntry< Val > & RegexpMapIterImpl< Val >::get()
-{
-	setEntry();
-	return m_aEntry;
-}
-
-//============================================================================
-//
-//  RegexpMapConstIter
-//
-//============================================================================
-
-template< typename Val >
-RegexpMapConstIter< Val >::RegexpMapConstIter(RegexpMapIterImpl< Val > *
-											      pTheImpl):
-	m_pImpl(pTheImpl)
-{}
-
-//============================================================================
-template< typename Val >
-RegexpMapConstIter< Val >::RegexpMapConstIter():
-	m_pImpl(new RegexpMapIterImpl< Val >)
-{}
-
-//============================================================================
-template< typename Val >
-RegexpMapConstIter< Val >::RegexpMapConstIter(RegexpMapConstIter const &
-											      rOther):
-	m_pImpl(new RegexpMapIterImpl< Val >(*rOther.m_pImpl))
-{}
-
-//============================================================================
-template< typename Val >
-RegexpMapConstIter< Val >::~RegexpMapConstIter()
-{
-	delete m_pImpl;
-}
-
-//============================================================================
-template< typename Val >
-RegexpMapConstIter< Val > &
-RegexpMapConstIter< Val >::operator =(RegexpMapConstIter const & rOther)
-{
-	*m_pImpl = *rOther.m_pImpl;
-	return *this;
-}
-
-//============================================================================
-template< typename Val >
-RegexpMapConstIter< Val > & RegexpMapConstIter< Val >::operator ++()
-{
-	m_pImpl->next();
-	return *this;
-}
-
-//============================================================================
-template< typename Val >
-RegexpMapConstIter< Val > RegexpMapConstIter< Val >::operator ++(int)
-{
-	RegexpMapConstIter aTemp(*this);
-	m_pImpl->next();
-	return aTemp;
-}
-
-//============================================================================
-template< typename Val >
-RegexpMapEntry< Val > const & RegexpMapConstIter< Val >::operator *() const
-{
-	return m_pImpl->get();
-}
-
-//============================================================================
-template< typename Val >
-RegexpMapEntry< Val > const * RegexpMapConstIter< Val >::operator ->() const
-{
-	return &m_pImpl->get();
-}
-
-//============================================================================
-template< typename Val >
-bool RegexpMapConstIter< Val >::equals(RegexpMapConstIter const & rOther)
-	const
-{
-	return *m_pImpl == *rOther.m_pImpl;
-}
-
-//============================================================================
-//
-//  RegexpMapIter
-//
-//============================================================================
-
-template< typename Val >
-RegexpMapIter< Val >::RegexpMapIter(RegexpMapIterImpl< Val > * pTheImpl):
-	RegexpMapConstIter< Val >(pTheImpl)
-{}
-
-//============================================================================
-template< typename Val >
-RegexpMapIter< Val > & RegexpMapIter< Val >::operator ++()
-{
-	this->m_pImpl->next();
-	return *this;
-}
-
-//============================================================================
-template< typename Val >
-RegexpMapIter< Val > RegexpMapIter< Val >::operator ++(int)
-{
-	RegexpMapIter aTemp(*this);
-	this->m_pImpl->next();
-	return aTemp;
-}
-
-//============================================================================
-template< typename Val >
-RegexpMapEntry< Val > & RegexpMapIter< Val >::operator *()
-{
-	return this->m_pImpl->get();
-}
-
-//============================================================================
-template< typename Val >
-RegexpMapEntry< Val > const & RegexpMapIter< Val >::operator *() const
-{
-	return this->m_pImpl->get();
-}
-
-//============================================================================
-template< typename Val >
-RegexpMapEntry< Val > * RegexpMapIter< Val >::operator ->()
-{
-	return &this->m_pImpl->get();
-}
-
-//============================================================================
-template< typename Val >
-RegexpMapEntry< Val > const * RegexpMapIter< Val >::operator ->() const
-{
-	return &this->m_pImpl->get();
-}
-
-//============================================================================
-//
-//  RegexpMap
-//
-//============================================================================
-
-namespace ucb_impl {
-
-template< typename Val >
-struct RegexpMapImpl
-{
-	List< Val > m_aList[Regexp::KIND_DOMAIN + 1];
-	Entry< Val > * m_pDefault;
-
-	RegexpMapImpl(): m_pDefault(0) {}
-
-	~RegexpMapImpl() { delete m_pDefault; }
-};
-
-}
-
-//============================================================================
-template< typename Val >
-RegexpMap< Val >::RegexpMap():
-	m_pImpl(new RegexpMapImpl< Val >)
-{}
-
-//============================================================================
-template< typename Val >
-RegexpMap< Val >::RegexpMap(RegexpMap const & rOther):
-	m_pImpl(new RegexpMapImpl< Val >(*rOther.m_pImpl))
-{}
-
-//============================================================================
-template< typename Val >
-RegexpMap< Val >::~RegexpMap()
-{
-	delete m_pImpl;
-}
-
-//============================================================================
-template< typename Val >
-RegexpMap< Val > & RegexpMap< Val >::operator =(RegexpMap const & rOther)
-{
-	*m_pImpl = *rOther.m_pImpl;
-	return *this;
-}
-
-//============================================================================
-template< typename Val >
-bool RegexpMap< Val >::add(rtl::OUString const & rKey, Val const & rValue,
-						   bool bOverwrite, rtl::OUString * pReverse)
-{
-	Regexp aRegexp(Regexp::parse(rKey));
-
-	if (aRegexp.isDefault())
-	{
-		if (m_pImpl->m_pDefault)
-		{
-			if (!bOverwrite)
-				return false;
-			delete m_pImpl->m_pDefault;
-		}
-		m_pImpl->m_pDefault = new Entry< Val >(aRegexp, rValue);
-	}
-	else
-	{
-		List< Val > & rTheList = m_pImpl->m_aList[aRegexp.getKind()];
-
-		typename List< Val >::iterator aEnd(rTheList.end());
-		for (typename List< Val >::iterator aIt(rTheList.begin()); aIt != aEnd; ++aIt)
-		{
-			if (aIt->m_aRegexp == aRegexp)
-			{
-				if (bOverwrite)
-				{
-					rTheList.erase(aIt);
-					break;
-				}
-				else
-					return false;
-			}
-		}
-
-		rTheList.push_back(Entry< Val >(aRegexp, rValue));
-	}
-
-	if (pReverse)
-		*pReverse = aRegexp.getRegexp(true);
-
-	return true;
-}
-
-//============================================================================
-template< typename Val >
-typename RegexpMap< Val >::iterator RegexpMap< Val >::find(rtl::OUString const & rKey,
-												  rtl::OUString * pReverse)
-{
-	Regexp aRegexp(Regexp::parse(rKey));
-
-	if (pReverse)
-		*pReverse = aRegexp.getRegexp(true);
-
-	if (aRegexp.isDefault())
-	{
-		if (m_pImpl->m_pDefault)
-			return RegexpMapIter< Val >(new RegexpMapIterImpl< Val >(m_pImpl,
-																	 true));
-	}
-	else
-	{
-		List< Val > & rTheList = m_pImpl->m_aList[aRegexp.getKind()];
-
-		typename List< Val > ::iterator aEnd(rTheList.end());
-		for (typename List< Val >::iterator aIt(rTheList.begin()); aIt != aEnd; ++aIt)
-			if (aIt->m_aRegexp == aRegexp)
-				return RegexpMapIter< Val >(new RegexpMapIterImpl< Val >(
-					                                m_pImpl,
-													aRegexp.getKind(), aIt));
-	}
-
-	return RegexpMapIter< Val >(new RegexpMapIterImpl< Val >(m_pImpl, false));
-}
-
-//============================================================================
-template< typename Val >
-void RegexpMap< Val >::erase(iterator const & rPos)
-{
-	if (rPos.m_pImpl->getMap() == m_pImpl)
-	{
-		if (rPos.m_pImpl->getList() == -1)
-		{
-			if (m_pImpl->m_pDefault)
-			{
-				delete m_pImpl->m_pDefault;
-				m_pImpl->m_pDefault = 0;
-			}
-		}
-		else
-			m_pImpl->m_aList[rPos.m_pImpl->getList()].
-				         erase(rPos.m_pImpl->getIndex());
-	}
-}
-
-//============================================================================
-template< typename Val >
-typename RegexpMap< Val >::iterator RegexpMap< Val >::begin()
-{
-	return RegexpMapIter< Val >(new RegexpMapIterImpl< Val >(m_pImpl, true));
-}
-
-//============================================================================
-template< typename Val >
-typename RegexpMap< Val >::const_iterator RegexpMap< Val >::begin() const
-{
-	return RegexpMapConstIter< Val >(new RegexpMapIterImpl< Val >(m_pImpl,
-																  true));
-}
-
-//============================================================================
-template< typename Val >
-typename RegexpMap< Val >::iterator RegexpMap< Val >::end()
-{
-	return RegexpMapIter< Val >(new RegexpMapIterImpl< Val >(m_pImpl, false));
-}
-
-//============================================================================
-template< typename Val >
-typename RegexpMap< Val >::const_iterator RegexpMap< Val >::end() const
-{
-	return RegexpMapConstIter< Val >(new RegexpMapIterImpl< Val >(m_pImpl,
-																  false));
-}
-
-//============================================================================
-template< typename Val >
-bool RegexpMap< Val >::empty() const
-{
-	return !m_pImpl->m_pDefault
-		   && m_pImpl->m_aList[Regexp::KIND_PREFIX].empty()
-		   && m_pImpl->m_aList[Regexp::KIND_AUTHORITY].empty()
-		   && m_pImpl->m_aList[Regexp::KIND_DOMAIN].empty();
-}
-
-//============================================================================
-template< typename Val >
-typename RegexpMap< Val >::size_type RegexpMap< Val >::size() const
-{
-	return (m_pImpl->m_pDefault ? 1 : 0)
-		       + m_pImpl->m_aList[Regexp::KIND_PREFIX].size()
-		       + m_pImpl->m_aList[Regexp::KIND_AUTHORITY].size()
-		       + m_pImpl->m_aList[Regexp::KIND_DOMAIN].size();
-}
-
-//============================================================================
-template< typename Val >
-Val const * RegexpMap< Val >::map(rtl::OUString const & rString,
-								  rtl::OUString * pTranslation,
-								  bool * pTranslated) const
-{
-	for (int n = Regexp::KIND_DOMAIN; n >= Regexp::KIND_PREFIX; --n)
-	{
-		List< Val > const & rTheList = m_pImpl->m_aList[n];
-
-		typename List< Val >::const_iterator aEnd(rTheList.end());
-		for (typename List< Val >::const_iterator aIt(rTheList.begin()); aIt != aEnd;
-			 ++aIt)
-			if (aIt->m_aRegexp.matches(rString, pTranslation, pTranslated))
-				return &aIt->m_aValue;
-	}
-	if (m_pImpl->m_pDefault
-		&& m_pImpl->m_pDefault->m_aRegexp.matches(rString, pTranslation,
-												  pTranslated))
-		return &m_pImpl->m_pDefault->m_aValue;
-	return 0;
-}
-
-#endif // _UCB_REGEXPMAP_TPT_


More information about the Libreoffice-commits mailing list