[Libreoffice-commits] core.git: 5 commits - oox/inc oox/source reportbuilder/java reportdesign/source sc/inc sc/source

Michael Stahl mstahl at redhat.com
Wed Feb 3 22:48:14 UTC 2016


 oox/inc/pch/precompiled_oox.hxx                                                          |    1 
 oox/source/drawingml/diagram/diagram.cxx                                                 |    5 
 oox/source/drawingml/diagram/diagramlayoutatoms.cxx                                      |   23 ---
 reportbuilder/java/org/libreoffice/report/pentaho/OfficeNamespaces.java                  |    1 
 reportbuilder/java/org/libreoffice/report/pentaho/output/OfficeDocumentReportTarget.java |    1 
 reportdesign/source/core/api/ReportDefinition.cxx                                        |   18 ++
 reportdesign/source/core/inc/ReportComponent.hxx                                         |   65 +++++-----
 reportdesign/source/filter/xml/xmlExport.cxx                                             |    7 +
 sc/inc/pch/precompiled_sc.hxx                                                            |    1 
 sc/inc/pch/precompiled_scfilt.hxx                                                        |    1 
 sc/source/core/tool/userlist.cxx                                                         |    5 
 sc/source/filter/excel/excimp8.cxx                                                       |    2 
 sc/source/filter/lotus/lotattr.cxx                                                       |    2 
 sc/source/ui/sidebar/CellAppearancePropertyPanel.cxx                                     |    1 
 sc/source/ui/sidebar/ScPanelFactory.cxx                                                  |    1 
 sc/source/ui/unoobj/fmtuno.cxx                                                           |    8 -
 16 files changed, 74 insertions(+), 68 deletions(-)

New commits:
commit 0ab1a87f0dc5b65624dfcf19f59542bab7dfb670
Author: Michael Stahl <mstahl at redhat.com>
Date:   Wed Feb 3 23:19:40 2016 +0100

    reportdesign: reformat that
    
    Change-Id: Iec06e09d0051ab53bbded0759abb041ff764abef

diff --git a/reportdesign/source/core/inc/ReportComponent.hxx b/reportdesign/source/core/inc/ReportComponent.hxx
index cfdd64d..b9e4f1d 100644
--- a/reportdesign/source/core/inc/ReportComponent.hxx
+++ b/reportdesign/source/core/inc/ReportComponent.hxx
@@ -37,44 +37,45 @@ namespace reportdesign
     class OReportComponentProperties
     {
     public:
-        css::uno::WeakReference< css::container::XChild >                           m_xParent;
-        css::uno::Reference< css::uno::XComponentContext >                          m_xContext;
-        css::uno::Reference< css::lang::XMultiServiceFactory >                      m_xFactory;
-        css::uno::Reference< css::drawing::XShape >                                 m_xShape;
-        css::uno::Reference< css::uno::XAggregation >                               m_xProxy;
-        css::uno::Reference< css::beans::XPropertySet >                             m_xProperty;
-        css::uno::Reference< css::lang::XTypeProvider >                             m_xTypeProvider;
-        css::uno::Reference< css::lang::XUnoTunnel >                                m_xUnoTunnel;
-        css::uno::Reference< css::lang::XServiceInfo >                              m_xServiceInfo;
-        css::uno::Sequence< OUString >                                              m_aMasterFields;
-        css::uno::Sequence< OUString >                                              m_aDetailFields;
-        OUString                                                                    m_sName;
-        ::sal_Int32                                                                 m_nHeight;
-        ::sal_Int32                                                                 m_nWidth;
-        ::sal_Int32                                                                 m_nPosX;
-        ::sal_Int32                                                                 m_nPosY;
-        ::sal_Int32                                                                 m_nBorderColor;
-        ::sal_Int16                                                                 m_nBorder;
-        bool                                                                        m_bPrintRepeatedValues;
+        css::uno::WeakReference<css::container::XChild> m_xParent;
+        css::uno::Reference<css::uno::XComponentContext> m_xContext;
+        css::uno::Reference<css::lang::XMultiServiceFactory> m_xFactory;
+        css::uno::Reference<css::drawing::XShape> m_xShape;
+        css::uno::Reference<css::uno::XAggregation> m_xProxy;
+        css::uno::Reference<css::beans::XPropertySet> m_xProperty;
+        css::uno::Reference<css::lang::XTypeProvider> m_xTypeProvider;
+        css::uno::Reference<css::lang::XUnoTunnel> m_xUnoTunnel;
+        css::uno::Reference<css::lang::XServiceInfo> m_xServiceInfo;
+        css::uno::Sequence<OUString> m_aMasterFields;
+        css::uno::Sequence<OUString> m_aDetailFields;
+        OUString m_sName;
+        ::sal_Int32 m_nHeight;
+        ::sal_Int32 m_nWidth;
+        ::sal_Int32 m_nPosX;
+        ::sal_Int32 m_nPosY;
+        ::sal_Int32 m_nBorderColor;
+        ::sal_Int16 m_nBorder;
+        bool m_bPrintRepeatedValues;
 
-        OReportComponentProperties(css::uno::Reference< css::uno::XComponentContext > const & _xContext
-            )
-            :m_xContext(_xContext)
-            ,m_nHeight(0)
-            ,m_nWidth(0)
-            ,m_nPosX(0)
-            ,m_nPosY(0)
-            ,m_nBorderColor(0)
-            ,m_nBorder(2)
-            ,m_bPrintRepeatedValues(true)
+        OReportComponentProperties(
+                css::uno::Reference<css::uno::XComponentContext> const& xContext)
+            : m_xContext(xContext)
+            , m_nHeight(0)
+            , m_nWidth(0)
+            , m_nPosX(0)
+            , m_nPosY(0)
+            , m_nBorderColor(0)
+            , m_nBorder(2)
+            , m_bPrintRepeatedValues(true)
         {}
         ~OReportComponentProperties();
 
-        void setShape(css::uno::Reference< css::drawing::XShape >& _xShape
-                    ,const css::uno::Reference< css::report::XReportComponent>& _xTunnel
-                    ,oslInterlockedCount& _rRefCount);
+        void setShape(css::uno::Reference<css::drawing::XShape>& xShape,
+             const css::uno::Reference<css::report::XReportComponent>& xTunnel,
+             oslInterlockedCount& rRefCount);
     };
 }
+
 #endif // INCLUDED_REPORTDESIGN_SOURCE_CORE_INC_REPORTCOMPONENT_HXX
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 969a760e2bad7f65c28eba425af1751946b09d76
Author: Michael Stahl <mstahl at redhat.com>
Date:   Wed Feb 3 22:39:46 2016 +0100

    reportbuilder: tdf#92720: add loext namespace
    
    ... to allow export of paragraphs in shapes.
    
    (regression from 6acc6c011d3afd6834efeee1b2efe43652a86f2e)
    
    Change-Id: I2c23e686a2cfcd997d3393b0f9fb4cdcab7252b7

diff --git a/reportbuilder/java/org/libreoffice/report/pentaho/OfficeNamespaces.java b/reportbuilder/java/org/libreoffice/report/pentaho/OfficeNamespaces.java
index 2774359..6a7d144 100644
--- a/reportbuilder/java/org/libreoffice/report/pentaho/OfficeNamespaces.java
+++ b/reportbuilder/java/org/libreoffice/report/pentaho/OfficeNamespaces.java
@@ -51,6 +51,7 @@ public class OfficeNamespaces
     public static final String OOREPORT_NS = "http://openoffice.org/2005/report";
     public static final String GRDDL_NS = "http://www.w3.org/2003/g/data-view#";
     public static final String CONFIG = "urn:oasis:names:tc:opendocument:xmlns:config:1.0";
+    public static final String LOEXT_NS = "urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0";
 
 
     private OfficeNamespaces()
diff --git a/reportbuilder/java/org/libreoffice/report/pentaho/output/OfficeDocumentReportTarget.java b/reportbuilder/java/org/libreoffice/report/pentaho/output/OfficeDocumentReportTarget.java
index 2889a8f..e629d43 100644
--- a/reportbuilder/java/org/libreoffice/report/pentaho/output/OfficeDocumentReportTarget.java
+++ b/reportbuilder/java/org/libreoffice/report/pentaho/output/OfficeDocumentReportTarget.java
@@ -383,6 +383,7 @@ public abstract class OfficeDocumentReportTarget extends AbstractReportTarget
             rootAttributes.addNamespaceDeclaration("xsd", OfficeNamespaces.XSD_NS);
             rootAttributes.addNamespaceDeclaration("xsi", OfficeNamespaces.XSI_NS);
             rootAttributes.addNamespaceDeclaration("grddl", OfficeNamespaces.GRDDL_NS);
+            rootAttributes.addNamespaceDeclaration("loext", OfficeNamespaces.LOEXT_NS);
             rootAttributes.setAttribute(OfficeNamespaces.OFFICE_NS, "version",
                     ODF_VERSION);
 
diff --git a/reportdesign/source/filter/xml/xmlExport.cxx b/reportdesign/source/filter/xml/xmlExport.cxx
index 4207d4d..ad72374 100644
--- a/reportdesign/source/filter/xml/xmlExport.cxx
+++ b/reportdesign/source/filter/xml/xmlExport.cxx
@@ -246,6 +246,13 @@ ORptExport::ORptExport(const Reference< XComponentContext >& _rxContext, OUStrin
     if( getExportFlags() & (SvXMLExportFlags::STYLES|SvXMLExportFlags::AUTOSTYLES|SvXMLExportFlags::MASTERSTYLES|SvXMLExportFlags::CONTENT) )
     {
         _GetNamespaceMap().Add( GetXMLToken(XML_NP_XHTML),GetXMLToken(XML_N_XHTML), XML_NAMESPACE_XHTML );
+        // loext, needed for paragraphs inside shapes
+        if (getDefaultVersion() > SvtSaveOptions::ODFVER_012)
+        {
+            _GetNamespaceMap().Add(
+                GetXMLToken(XML_NP_LO_EXT), GetXMLToken(XML_N_LO_EXT),
+                XML_NAMESPACE_LO_EXT);
+        }
     }
     // GRDDL: to convert RDFa and meta.xml to RDF
     if( getExportFlags() & (SvXMLExportFlags::META|SvXMLExportFlags::STYLES|SvXMLExportFlags::AUTOSTYLES|SvXMLExportFlags::MASTERSTYLES|SvXMLExportFlags::CONTENT) )
commit 131ebdeb2f26a697029d2e561743345ddc8a8b32
Author: Michael Stahl <mstahl at redhat.com>
Date:   Wed Feb 3 17:41:53 2016 +0100

    reportdesign: try harder in getDocumentBaseURL()
    
    OReportDefinition is always an embedded object, and may contain embedded
    objects itself.  Try to get a base URL for loading the nested embedded
    objects from the parent.  We actually need it before setParent() is
    called, so search the media descriptor too.
    
    Change-Id: I319127cd5938d4a79778345fce65a4d58bd54877

diff --git a/reportdesign/source/core/api/ReportDefinition.cxx b/reportdesign/source/core/api/ReportDefinition.cxx
index 648f163..1cbc191 100644
--- a/reportdesign/source/core/api/ReportDefinition.cxx
+++ b/reportdesign/source/core/api/ReportDefinition.cxx
@@ -2549,7 +2549,23 @@ bool OReportDefinition::isEnableSetModified() const
 
 OUString OReportDefinition::getDocumentBaseURL() const
 {
-    return const_cast<OReportDefinition*>(this)->getURL();
+    // TODO: should this be in getURL()? not sure...
+    uno::Reference<frame::XModel> const xParent(
+        const_cast<OReportDefinition*>(this)->getParent(), uno::UNO_QUERY);
+    if (xParent.is())
+    {
+        return xParent->getURL();
+    }
+
+    ::osl::MutexGuard aGuard(m_aMutex);
+    ::connectivity::checkDisposed(ReportDefinitionBase::rBHelper.bDisposed);
+    for (beans::PropertyValue const& it : m_pImpl->m_aArgs)
+    {
+        if (it.Name == "DocumentBaseURL")
+            return it.Value.get<OUString>();
+    }
+
+    return OUString();
 }
 
 uno::Reference< frame::XTitle > OReportDefinition::impl_getTitleHelper_throw()
commit 0fadfd3c17a4ec9bd3e51deb22074422e1b4c330
Author: Michael Stahl <mstahl at redhat.com>
Date:   Wed Feb 3 16:13:58 2016 +0100

    sc: replace boost::bind with C++11 lambda
    
    Change-Id: I516ffb7510f52cceff0cae6970c6ab699a7889be

diff --git a/sc/inc/pch/precompiled_sc.hxx b/sc/inc/pch/precompiled_sc.hxx
index ed95b2d..c73aa98 100644
--- a/sc/inc/pch/precompiled_sc.hxx
+++ b/sc/inc/pch/precompiled_sc.hxx
@@ -56,7 +56,6 @@
 #include <unordered_set>
 #include <utility>
 #include <vector>
-#include <boost/bind.hpp>
 #include <boost/checked_delete.hpp>
 #include <boost/intrusive_ptr.hpp>
 #include <boost/math/special_functions/log1p.hpp>
diff --git a/sc/inc/pch/precompiled_scfilt.hxx b/sc/inc/pch/precompiled_scfilt.hxx
index 8feccbb..655f610 100644
--- a/sc/inc/pch/precompiled_scfilt.hxx
+++ b/sc/inc/pch/precompiled_scfilt.hxx
@@ -48,7 +48,6 @@
 #include <unordered_set>
 #include <utility>
 #include <vector>
-#include <boost/bind.hpp>
 #include <boost/checked_delete.hpp>
 #include <boost/noncopyable.hpp>
 #include <boost/optional/optional.hpp>
diff --git a/sc/source/core/tool/userlist.cxx b/sc/source/core/tool/userlist.cxx
index 39344a9..b9206f4 100644
--- a/sc/source/core/tool/userlist.cxx
+++ b/sc/source/core/tool/userlist.cxx
@@ -26,7 +26,6 @@
 #include <unotools/transliterationwrapper.hxx>
 #include <o3tl/make_unique.hxx>
 
-#include <boost/bind.hpp>
 #include <algorithm>
 
 namespace {
@@ -338,7 +337,9 @@ bool ScUserList::operator!=( const ScUserList& r ) const
 
 bool ScUserList::HasEntry( const OUString& rStr ) const
 {
-    return ::std::any_of(maData.begin(), maData.end(), ::boost::bind(&ScUserListData::GetString, _1) == rStr);
+    return ::std::any_of(maData.begin(), maData.end(),
+        [&] (std::unique_ptr<ScUserListData> const& pData)
+            { return pData->GetString() == rStr; } );
 }
 
 ScUserList::iterator ScUserList::begin()
diff --git a/sc/source/filter/excel/excimp8.cxx b/sc/source/filter/excel/excimp8.cxx
index d14e1f6..b5e7e1b 100644
--- a/sc/source/filter/excel/excimp8.cxx
+++ b/sc/source/filter/excel/excimp8.cxx
@@ -21,8 +21,6 @@
 
 #include "excimp8.hxx"
 
-#include <boost/bind.hpp>
-
 #include <scitems.hxx>
 #include <comphelper/processfactory.hxx>
 #include <comphelper/sequence.hxx>
diff --git a/sc/source/filter/lotus/lotattr.cxx b/sc/source/filter/lotus/lotattr.cxx
index 974267c..23b4c5d 100644
--- a/sc/source/filter/lotus/lotattr.cxx
+++ b/sc/source/filter/lotus/lotattr.cxx
@@ -19,8 +19,6 @@
 
 #include "lotattr.hxx"
 
-#include <boost/bind.hpp>
-
 #include <editeng/boxitem.hxx>
 #include <editeng/brushitem.hxx>
 #include <editeng/justifyitem.hxx>
diff --git a/sc/source/ui/sidebar/CellAppearancePropertyPanel.cxx b/sc/source/ui/sidebar/CellAppearancePropertyPanel.cxx
index 23ba189..4623c24 100644
--- a/sc/source/ui/sidebar/CellAppearancePropertyPanel.cxx
+++ b/sc/source/ui/sidebar/CellAppearancePropertyPanel.cxx
@@ -33,7 +33,6 @@
 #include <editeng/lineitem.hxx>
 #include <vcl/svapp.hxx>
 #include <vcl/settings.hxx>
-#include <boost/bind.hpp>
 #include <svx/sidebar/PopupContainer.hxx>
 #include "CellLineStyleControl.hxx"
 #include "CellLineStylePopup.hxx"
diff --git a/sc/source/ui/sidebar/ScPanelFactory.cxx b/sc/source/ui/sidebar/ScPanelFactory.cxx
index fb46432..9e584d8 100644
--- a/sc/source/ui/sidebar/ScPanelFactory.cxx
+++ b/sc/source/ui/sidebar/ScPanelFactory.cxx
@@ -35,7 +35,6 @@
 #include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
 #include <comphelper/namedvaluecollection.hxx>
 #include <cppuhelper/supportsservice.hxx>
-#include <boost/bind.hpp>
 
 using namespace css;
 using namespace css::uno;
diff --git a/sc/source/ui/unoobj/fmtuno.cxx b/sc/source/ui/unoobj/fmtuno.cxx
index 4a66d9f..1c83d4a 100644
--- a/sc/source/ui/unoobj/fmtuno.cxx
+++ b/sc/source/ui/unoobj/fmtuno.cxx
@@ -17,8 +17,6 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
 
-#include <boost/bind.hpp>
-
 #include <vcl/svapp.hxx>
 #include <comphelper/servicehelper.hxx>
 
@@ -231,7 +229,9 @@ void ScTableConditionalFormat::FillFormat( ScConditionalFormat& rFormat,
 
 ScTableConditionalFormat::~ScTableConditionalFormat()
 {
-    std::for_each(aEntries.begin(),aEntries.end(),boost::bind(&ScTableConditionalEntry::release,_1));
+    std::for_each(aEntries.begin(), aEntries.end(),
+        [] (ScTableConditionalEntry *const pEntry) { pEntry->release(); } );
+
 }
 
 void ScTableConditionalFormat::AddEntry_Impl(const ScCondFormatEntryItem& aEntry)
@@ -362,7 +362,7 @@ void SAL_CALL ScTableConditionalFormat::clear() throw(uno::RuntimeException, std
 {
     SolarMutexGuard aGuard;
     std::for_each(aEntries.begin(),aEntries.end(),
-                  boost::bind(&ScTableConditionalEntry::release,_1));
+        [] (ScTableConditionalEntry *const pEntry) { pEntry->release(); } );
 
     aEntries.clear();
 }
commit 1fe41c378fdc3261fb86f3abeb93c7d918c74fb5
Author: Michael Stahl <mstahl at redhat.com>
Date:   Wed Feb 3 16:02:34 2016 +0100

    oox: replace boost::bind with C++11 lambda
    
    Change-Id: I8b3c029db18f62cc41e5fc12582e10bf2a67d2c7

diff --git a/oox/inc/pch/precompiled_oox.hxx b/oox/inc/pch/precompiled_oox.hxx
index bf9089b..ab6de3c 100644
--- a/oox/inc/pch/precompiled_oox.hxx
+++ b/oox/inc/pch/precompiled_oox.hxx
@@ -42,7 +42,6 @@
 #include <unordered_map>
 #include <vector>
 #include <boost/algorithm/string.hpp>
-#include <boost/bind.hpp>
 #include <boost/intrusive_ptr.hpp>
 #include <boost/next_prior.hpp>
 #include <boost/noncopyable.hpp>
diff --git a/oox/source/drawingml/diagram/diagram.cxx b/oox/source/drawingml/diagram/diagram.cxx
index ef8b389..04bda5b 100644
--- a/oox/source/drawingml/diagram/diagram.cxx
+++ b/oox/source/drawingml/diagram/diagram.cxx
@@ -18,7 +18,6 @@
  */
 
 #include <functional>
-#include <boost/bind.hpp>
 
 #include <com/sun/star/awt/Point.hpp>
 #include <com/sun/star/awt/Size.hpp>
@@ -76,10 +75,10 @@ void DiagramData::dump()
 {
     OSL_TRACE("Dgm: DiagramData # of cnx: %zu", maConnections.size() );
     std::for_each( maConnections.begin(), maConnections.end(),
-                  boost::bind( &dgm::Connection::dump, _1 ) );
+            [] (dgm::Connection & rConnection) { rConnection.dump(); } );
     OSL_TRACE("Dgm: DiagramData # of pt: %zu", maPoints.size() );
     std::for_each( maPoints.begin(), maPoints.end(),
-                  boost::bind( &dgm::Point::dump, _1 ) );
+            [] (dgm::Point & rPoint) { rPoint.dump(); } );
 }
 
 void Diagram::setData( const DiagramDataPtr & pData)
diff --git a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx
index 1d0b78e..5e50ce7 100644
--- a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx
+++ b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx
@@ -20,7 +20,6 @@
 #include "diagramlayoutatoms.hxx"
 
 #include <functional>
-#include <boost/bind.hpp>
 
 #include <osl/diagnose.h>
 #include <basegfx/numeric/ftools.hxx>
@@ -86,7 +85,7 @@ void LayoutAtom::dump(int level)
                typeid(*this).name() );
     const std::vector<LayoutAtomPtr>& pChildren=getChildren();
     std::for_each( pChildren.begin(), pChildren.end(),
-                   boost::bind( &LayoutAtom::dump, _1, level + 1 ) );
+        [level] (LayoutAtomPtr const& pAtom) { pAtom->dump(level + 1); } );
 }
 
 ForEachAtom::ForEachAtom(const Reference< XFastAttributeList >& xAttributes)
@@ -584,9 +583,7 @@ void ShapeCreationVisitor::defaultVisit(LayoutAtom& rAtom)
 {
     const std::vector<LayoutAtomPtr>& pChildren=rAtom.getChildren();
     std::for_each( pChildren.begin(), pChildren.end(),
-                   boost::bind( &LayoutAtom::accept,
-                                _1,
-                                boost::ref(*this)) );
+        [this] (LayoutAtomPtr const& pAtom) { pAtom->accept(*this); } );
 }
 
 void ShapeCreationVisitor::visit(ConstraintAtom& /*rAtom*/)
@@ -611,9 +608,7 @@ void ShapeCreationVisitor::visit(ForEachAtom& rAtom)
         // getPointsPresNameMap()
         ShallowPresNameVisitor aVisitor(mrDgm);
         std::for_each( pChildren.begin(), pChildren.end(),
-                       boost::bind( &LayoutAtom::accept,
-                                    _1,
-                                    boost::ref(aVisitor)) );
+            [&] (LayoutAtomPtr const& pAtom) { pAtom->accept(aVisitor); } );
         nChildren = aVisitor.getCount();
     }
 
@@ -627,9 +622,7 @@ void ShapeCreationVisitor::visit(ForEachAtom& rAtom)
     {
         // TODO there is likely some conditions
         std::for_each( pChildren.begin(), pChildren.end(),
-                       boost::bind( &LayoutAtom::accept,
-                                    _1,
-                                    boost::ref(*this)) );
+            [this] (LayoutAtomPtr const& pAtom) { pAtom->accept(*this); } );
     }
 
     // and restore idx
@@ -697,9 +690,7 @@ void ShapeLayoutingVisitor::defaultVisit(LayoutAtom& rAtom)
     // visit all children, one of them needs to be the layout algorithm
     const std::vector<LayoutAtomPtr>& pChildren=rAtom.getChildren();
     std::for_each( pChildren.begin(), pChildren.end(),
-                   boost::bind( &LayoutAtom::accept,
-                                _1,
-                                boost::ref(*this)) );
+        [this] (LayoutAtomPtr const& pAtom) { pAtom->accept(*this); } );
 }
 
 void ShapeLayoutingVisitor::visit(ConstraintAtom& /*rAtom*/)
@@ -738,9 +729,7 @@ void ShallowPresNameVisitor::defaultVisit(LayoutAtom& rAtom)
     // name set
     const std::vector<LayoutAtomPtr>& pChildren=rAtom.getChildren();
     std::for_each( pChildren.begin(), pChildren.end(),
-                   boost::bind( &LayoutAtom::accept,
-                                _1,
-                                boost::ref(*this)) );
+        [this] (LayoutAtomPtr const& pAtom) { pAtom->accept(*this); } );
 }
 
 void ShallowPresNameVisitor::visit(ConstraintAtom& /*rAtom*/)


More information about the Libreoffice-commits mailing list