Verified Commit 20bfd4ec authored by Alf Gaida's avatar Alf Gaida

Adding upstream version 0.14.0.

Signed-off-by: Alf Gaida's avatarAlf Gaida <agaida@siduction.org>
parent 4ef8e84a
lxqt-notificationd-0.14.0 / 2019-01-25
======================================
* Bumped version to 0.14.0
* Notification history implemented
* Implementations fixed:
- Fixed notification styles
- Don't use automatic string conversions
- Use QLatin1String where it is more efficient
- Test app updated
* Improved cmake scripting
- Set cmake_minimum_required to 3.1.0
- Removed locale compile definitons
* Moved translations from lxqt-l10n back to lxqt-notificationd
- Removed obsolete translation fuctionality
- Added translation promo in README.md
* Translation updates
lxqt-notificationd-0.13.0 / 2018-05-21
======================================
......@@ -16,8 +34,8 @@ lxqt-notificationd-0.13.0 / 2018-05-21
* cmake: Handle CMP0071
* Change icon to preferences-desktop-notification
0.12.0 / 2017-10-21
===================
lxqt-notificationd-0.12.0 / 2017-10-21
======================================
* Release 0.12.0: Update changelog
* Set patch version
......@@ -46,8 +64,8 @@ lxqt-notificationd-0.13.0 / 2018-05-21
* Fix a typo: singals -> signals
* Bump year
0.11.1 / 2017-01-01
===================
lxqt-notificationd-0.11.1 / 2017-01-01
======================================
* Release 0.11.1: Update changelog
* Updated da translation. Removed da_DK
......@@ -55,8 +73,8 @@ lxqt-notificationd-0.13.0 / 2018-05-21
* Make CMakeList.txt more uniform.
* Remove cpack (#53)
0.11.0 / 2016-09-24
===================
lxqt-notificationd-0.11.0 / 2016-09-24
======================================
* Release 0.11.0: Add changelog
* Update and extend README.md
......@@ -73,8 +91,8 @@ lxqt-notificationd-0.13.0 / 2018-05-21
* update lxqt-config-notificationd_hu.ts
* Update lxqt-config-notificationd_it.ts
0.10.0 / 2015-10-31
===================
lxqt-notificationd-0.10.0 / 2015-10-31
======================================
* Update translations
* Remove docs/notification-spec-latest.html in favour of an upstream link
......@@ -122,8 +140,8 @@ lxqt-notificationd-0.13.0 / 2018-05-21
* Updated german translation
* Added german translation.
0.9.0 / 2015-01-06
==================
lxqt-notificationd-0.9.0 / 2015-01-06
=====================================
* Portuguese language update
* Fix typos in tests
......@@ -142,8 +160,8 @@ lxqt-notificationd-0.13.0 / 2018-05-21
* Drop Qt4 support in code
* Clean up CMakeLists.txt and drop Qt 4 support
0.8.0 / 2014-10-13
==================
lxqt-notificationd-0.8.0 / 2014-10-13
=====================================
* Adapt to the translation infrastructure
* Fix xde/lxde-qt #67 - Notifications are shown in the wrong location.
......@@ -154,13 +172,13 @@ lxqt-notificationd-0.13.0 / 2018-05-21
* Use new LXQt header files.
* Swap Spacing and Width
0.7.0 / 2014-05-07
==================
lxqt-notificationd-0.7.0 / 2014-05-07
=====================================
* Update COPYING
0.6.99 / 2014-04-30
===================
lxqt-notificationd-0.6.99 / 2014-04-30
======================================
* remove old templates from translations remove icon translations from desktop file translations
* Style fixes to the advanced config
......
cmake_minimum_required(VERSION 3.0.2 FATAL_ERROR)
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
# CMP0000: Call the cmake_minimum_required() command at the beginning of the top-level
# CMakeLists.txt file even before calling the project() command.
# The cmake_minimum_required(VERSION) command implicitly invokes the cmake_policy(VERSION)
# command to specify that the current project code is written for the given range of CMake
# versions.
project(lxqt-notificationd)
include(GNUInstallDirs)
......@@ -10,19 +14,18 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
option(UPDATE_TRANSLATIONS "Update source translation translations/*.ts files" OFF)
option(LXQT_NOTIFICATION_BUILD_TESTS "Build LXQt Notification tests" OFF)
find_package(Qt5DBus REQUIRED)
find_package(Qt5LinguistTools REQUIRED)
find_package(Qt5Widgets REQUIRED)
message(STATUS "Building with Qt${Qt5Core_VERSION}")
find_package(KF5WindowSystem REQUIRED)
find_package(lxqt REQUIRED)
set(KF5_MINIMUM_VERSION "5.36.0")
set(LXQT_MINIMUM_VERSION "0.14.0")
set(QT_MINIMUM_VERSION "5.7.1")
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
find_package(Qt5DBus ${QT_MINIMUM_VERSION} REQUIRED)
find_package(Qt5LinguistTools ${QT_MINIMUM_VERSION} REQUIRED)
find_package(Qt5Widgets ${QT_MINIMUM_VERSION} REQUIRED)
find_package(KF5WindowSystem ${KF5_MINIMUM_VERSION} REQUIRED)
find_package(lxqt ${LXQT_MINIMUM_VERSION} REQUIRED)
message(STATUS "Building with Qt${Qt5Core_VERSION}")
# Patch Version
set(LXQT_NOTIFICATIOND_PATCH_VERSION 0)
......@@ -30,7 +33,10 @@ set(LXQT_NOTIFICATIOND_PATCH_VERSION 0)
set(LXQT_NOTIFICATIOND_VERSION ${LXQT_MAJOR_VERSION}.${LXQT_MINOR_VERSION}.${LXQT_NOTIFICATIOND_PATCH_VERSION})
add_definitions(
"-DLXQT_NOTIFICATIOND_VERSION=\"${LXQT_NOTIFICATIOND_VERSION}\""
"-DQT_NO_FOREACH"
"-DQT_NO_CAST_FROM_ASCII"
"-DQT_NO_CAST_TO_ASCII"
"-DQT_NO_URL_CAST_FROM_STRING"
"-DQT_NO_CAST_FROM_BYTEARRAY"
)
include(LXQtPreventInSourceBuilds)
......@@ -41,6 +47,9 @@ include(LXQtTranslate)
add_subdirectory(config)
add_subdirectory(src)
if (LXQT_NOTIFICATION_BUILD_TESTS)
add_subdirectory(test)
endif()
## merged from lxqt-common
add_subdirectory(autostart)
......@@ -55,3 +55,13 @@ which is used to customize notifications can be opened from the panel's main
menu - Preferences - LXQt Settings - Desktop Notifications and is provided by the
[Configuration Center](https://github.com/lxqt/lxqt-config#configuration-center)
of [lxqt-config](https://github.com/lxqt/lxqt-config) as well.
## Translation (Weblate)
<a href="https://weblate.lxqt.org/projects/lxqt/lxqt-notificationd/">
<img src="https://weblate.lxqt.org/widgets/lxqt/-/lxqt-notificationd/287x66-white.png" alt="Translation status" />
</a>
<a href="https://weblate.lxqt.org/projects/lxqt/lxqt-config-notificationd/">
<img src="https://weblate.lxqt.org/widgets/lxqt/-/lxqt-config-notificationd/287x66-white.png" alt="Translation status" />
</a>
cmake_minimum_required(VERSION 3.0.2 FATAL_ERROR)
file(GLOB DESKTOP_FILES_IN *.desktop.in)
# Translations **********************************
......
# Translations
Name[cs_CZ]=Oznamovací démon
......@@ -21,16 +21,6 @@ lxqt_translate_ts(NOTIFICATIONS_CONF_QM
${NOTIFICATIONS_CONF_SRC}
${NOTIFICATIONS_CONF_UI}
INSTALL_DIR "${LXQT_TRANSLATIONS_DIR}/${PROJECT_NAME}"
PULL_TRANSLATIONS
${PULL_TRANSLATIONS}
CLEAN_TRANSLATIONS
${CLEAN_TRANSLATIONS}
TRANSLATIONS_REPO
${TRANSLATIONS_REPO}
TRANSLATIONS_REFSPEC
${TRANSLATIONS_REFSPEC}
REPO_SUBDIR
"lxqt-notificationd/${PROJECT_NAME}"
)
lxqt_app_translation_loader(QM_LOADER ${PROJECT_NAME})
......
......@@ -38,9 +38,11 @@ AdvancedSettings::AdvancedSettings(LXQt::Settings* settings, QWidget *parent):
setupUi(this);
restoreSettings();
connect(serverDecidesBox, SIGNAL(valueChanged(int)), this, SLOT(save()));
connect(spacingBox, SIGNAL(valueChanged(int)), this, SLOT(save()));
connect(widthBox, SIGNAL(valueChanged(int)), this, SLOT(save()));
connect(serverDecidesBox, QOverload<int>::of(&QSpinBox::valueChanged), this, &AdvancedSettings::save);
connect(spacingBox, QOverload<int>::of(&QSpinBox::valueChanged), this, &AdvancedSettings::save);
connect(widthBox, QOverload<int>::of(&QSpinBox::valueChanged), this, &AdvancedSettings::save);
connect(unattendedBox, QOverload<int>::of(&QSpinBox::valueChanged), this, &AdvancedSettings::save);
connect(blackListEdit, &QLineEdit::editingFinished, this, &AdvancedSettings::save);
}
AdvancedSettings::~AdvancedSettings()
......@@ -49,18 +51,30 @@ AdvancedSettings::~AdvancedSettings()
void AdvancedSettings::restoreSettings()
{
int serverDecides = mSettings->value("server_decides", 10).toInt();
int serverDecides = mSettings->value(QL1S("server_decides"), 10).toInt();
if (serverDecides <= 0)
serverDecides = 10;
serverDecidesBox->setValue(serverDecides);
spacingBox->setValue(mSettings->value("spacing", 6).toInt());
widthBox->setValue(mSettings->value("width", 300).toInt());
spacingBox->setValue(mSettings->value(QL1S("spacing"), 6).toInt());
widthBox->setValue(mSettings->value(QL1S("width"), 300).toInt());
unattendedBox->setValue(mSettings->value(QL1S("unattendedMaxNum"), 10).toInt());
blackListEdit->setText(mSettings->value(QL1S("blackList")).toStringList().join (QL1S(",")));
}
void AdvancedSettings::save()
{
mSettings->setValue("server_decides", serverDecidesBox->value());
mSettings->setValue("spacing", spacingBox->value());
mSettings->setValue("width", widthBox->value());
mSettings->setValue(QL1S("server_decides"), serverDecidesBox->value());
mSettings->setValue(QL1S("spacing"), spacingBox->value());
mSettings->setValue(QL1S("width"), widthBox->value());
mSettings->setValue(QL1S("unattendedMaxNum"), unattendedBox->value());
QString blackList = blackListEdit->text();
if (!blackList.isEmpty())
{
QStringList l = blackList.split(QL1S(","), QString::SkipEmptyParts);
l.removeDuplicates();
mSettings->setValue(QL1S("blackList"), l);
}
else
mSettings->remove(QL1S("blackList"));
}
......@@ -108,7 +108,7 @@
</layout>
</widget>
</item>
<item row="3" column="0" colspan="2">
<item row="4" column="0" colspan="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
......@@ -121,6 +121,56 @@
</property>
</spacer>
</item>
<item row="3" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Unattended Notifications</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="unattendedLabel">
<property name="text">
<string>How many to save:</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="unattendedBox"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QLabel" name="blackListLabel">
<property name="toolTip">
<string>Application name is on the top of notification.</string>
</property>
<property name="text">
<string>Ignore these applications:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="blackListEdit">
<property name="toolTip">
<string>Application name is on the top of notification.</string>
</property>
<property name="placeholderText">
<string>app1,app2,app3</string>
</property>
<property name="clearButtonEnabled">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
......
......@@ -50,7 +50,7 @@ BasicSettings::BasicSettings(LXQt::Settings* settings, QWidget *parent) :
LXQt::Notification serverTest;
QString serverName = serverTest.serverInfo().name;
if (serverName != "lxqt-notificationd")
if (serverName != QL1S("lxqt-notificationd"))
{
if (serverName.isEmpty())
warningLabel->setText(tr("<b>Warning:</b> No notifications daemon is running.\n"
......@@ -67,24 +67,24 @@ BasicSettings::~BasicSettings()
void BasicSettings::restoreSettings()
{
QString placement = mSettings->value(QStringLiteral("placement"),
QStringLiteral("bottom-right")).toString().toLower();
QString placement = mSettings->value(QL1S("placement"),
QL1S("bottom-right")).toString().toLower();
if (QStringLiteral("top-left") == placement)
if (QL1S("top-left") == placement)
topLeftRB->setChecked(true);
else if (QStringLiteral("top-center") == placement)
else if (QL1S("top-center") == placement)
topCenterRB->setChecked(true);
else if (QStringLiteral("top-right") == placement)
else if (QL1S("top-right") == placement)
topRightRB->setChecked(true);
else if (QStringLiteral("center-left") == placement)
else if (QL1S("center-left") == placement)
centerLeftRB->setChecked(true);
else if (QStringLiteral("center-right") == placement)
else if (QL1S("center-right") == placement)
centerRightRB->setChecked(true);
else if (QStringLiteral("bottom-left") == placement)
else if (QL1S("bottom-left") == placement)
bottomLeftRB->setChecked(true);
else if (QStringLiteral("bottom-center") == placement)
else if (QL1S("bottom-center") == placement)
bottomCenterRB->setChecked(true);
else if (QStringLiteral("bottom-right") == placement)
else if (QL1S("bottom-right") == placement)
bottomRightRB->setChecked(true);
}
......@@ -92,23 +92,23 @@ void BasicSettings::updateNotification()
{
QString align;
if (topLeftRB->isChecked())
align = QStringLiteral("top-left");
align = QL1S("top-left");
else if (topCenterRB->isChecked())
align = QStringLiteral("top-center");
align = QL1S("top-center");
else if (topRightRB->isChecked())
align = QStringLiteral("top-right");
align = QL1S("top-right");
else if (centerLeftRB->isChecked())
align = QStringLiteral("center-left");
align = QL1S("center-left");
else if (centerRightRB->isChecked())
align = QStringLiteral("center-right");
align = QL1S("center-right");
else if (bottomLeftRB->isChecked())
align = QStringLiteral("bottom-left");
align = QL1S("bottom-left");
else if (bottomCenterRB->isChecked())
align = QStringLiteral("bottom-center");
align = QL1S("bottom-center");
else // if (bottomRightRB->isChecked())
align = QStringLiteral("bottom-right");
align = QL1S("bottom-right");
mSettings->setValue(QStringLiteral("placement"), align);
mSettings->setValue(QL1S("placement"), align);
LXQt::Notification::notify(tr("Notification demo ") + align,
tr("This is a test notification.\n All notifications will now appear here on LXQt."),
QStringLiteral("lxqt"));
......
......@@ -25,6 +25,7 @@
*
* END_COMMON_COPYRIGHT_HEADER */
#include <LXQt/Globals>
#include <LXQt/SingleApplication>
#include <XdgIcon>
......@@ -50,7 +51,7 @@ int main(int argc, char** argv)
parser.process(a);
MainWindow w;
w.setWindowIcon(QIcon::fromTheme("preferences-desktop-theme"));
w.setWindowIcon(QIcon::fromTheme(QSL("preferences-desktop-theme")));
a.setActivationWindow(&w);
w.show();
......
......@@ -29,6 +29,7 @@
#include <QMessageBox>
#include <QtDBus/QDBusConnection>
#include <QtDBus/QDBusMessage>
#include <LXQt/Globals>
#include <LXQt/ConfigDialog>
#include "mainwindow.h"
......@@ -37,14 +38,14 @@
MainWindow::MainWindow(QWidget *parent) :
LXQt::ConfigDialog(tr("Desktop Notifications"), new LXQt::Settings("notifications"), parent)
LXQt::ConfigDialog(tr("Desktop Notifications"), new LXQt::Settings(QSL("notifications")), parent)
{
BasicSettings* basic = new BasicSettings(mSettings, this);
addPage(basic, tr("Basic Settings"), "preferences-desktop-notification");
addPage(basic, tr("Basic Settings"), QSL("preferences-desktop-notification"));
connect(this, SIGNAL(reset()), basic, SLOT(restoreSettings()));
AdvancedSettings* menu = new AdvancedSettings(mSettings, this);
addPage(menu, tr("Advanced Settings"), "preferences-desktop-notification-bell");
addPage(menu, tr("Advanced Settings"), QSL("preferences-desktop-notification-bell"));
connect(this, SIGNAL(reset()), menu, SLOT(restoreSettings()));
}
......
project(lxqt-config-notificationd)
build_component("." "")
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
<context>
<name>AdvancedSettings</name>
<message>
<location filename="../advancedsettings.ui" line="17"/>
<source>Sizes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="25"/>
<source>Width:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="32"/>
<location filename="../advancedsettings.ui" line="56"/>
<source> px</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="49"/>
<source>Spacing:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="68"/>
<source>Duration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="80"/>
<source>Some notifications set their own on-screen duration.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="92"/>
<source>Default duration:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="99"/>
<source> sec</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="127"/>
<source>Unattended Notifications</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="135"/>
<source>How many to save:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="149"/>
<location filename="../advancedsettings.ui" line="159"/>
<source>Application name is on the top of notification.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="152"/>
<source>Ignore these applications:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="162"/>
<source>app1,app2,app3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>BasicSettings</name>
<message>
<location filename="../basicsettings.ui" line="23"/>
<source>Basic Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../basicsettings.ui" line="30"/>
<source>Position on screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../basicsettings.cpp" line="56"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; No notifications daemon is running.
A fallback will be used.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../basicsettings.cpp" line="59"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; A third-party notifications daemon (%1) is running.
These settings won&apos;t have any effect on it!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../basicsettings.cpp" line="112"/>
<source>Notification demo </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../basicsettings.cpp" line="113"/>
<source>This is a test notification.
All notifications will now appear here on LXQt.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../mainwindow.cpp" line="41"/>
<source>Desktop Notifications</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="44"/>
<source>Basic Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="48"/>
<source>Advanced Settings</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ar">
<context>
<name>AdvancedSettings</name>
<message>
<location filename="../advancedsettings.ui" line="17"/>
<source>Sizes</source>
<translation>المقاسات</translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="25"/>
<source>Width:</source>
<translation>العرض:</translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="32"/>
<location filename="../advancedsettings.ui" line="56"/>
<source> px</source>
<translation> بكسل</translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="49"/>
<source>Spacing:</source>
<translation>التباعد:</translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="68"/>
<source>Duration</source>
<translation>المدة</translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="80"/>
<source>Some notifications set their own on-screen duration.</source>
<translation>تضبط بعض الإخطارات مدة عرضها على الشاشة بنفسها.</translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="92"/>
<source>Default duration:</source>
<translation>المدة المبدئية:</translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="99"/>
<source> sec</source>
<translation> ثا</translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="127"/>
<source>Unattended Notifications</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="135"/>
<source>How many to save:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="149"/>
<location filename="../advancedsettings.ui" line="159"/>
<source>Application name is on the top of notification.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="152"/>
<source>Ignore these applications:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../advancedsettings.ui" line="162"/>
<source>app1,app2,app3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>BasicSettings</name>
<message>
<location filename="../basicsettings.ui" line="23"/>
<source>Basic Settings</source>
<translation>الإعدادات الأساسية</translation>
</message>
<message>
<location filename="../basicsettings.ui" line="30"/>
<source>Position on screen</source>
<translation>المكان على الشاشة</translation>
</message>
<message>
<location filename="../basicsettings.cpp" line="56"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; No notifications daemon is running.
A fallback will be used.</source>
<translation>&lt;b&gt;تحذير:&lt;/b&gt; لا عفريت إخطارات يعمل.
سأستخدم أحد الاحتياطيين.</translation>
</message>
<message>
<location filename="../basicsettings.cpp" line="59"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; A third-party notifications daemon (%1) is running.
These settings won&apos;t have any effect on it!</source>
<translation>&lt;b&gt;تحذير:&lt;/b&gt; هناك عفريت من طرف ثالث (%1) يعمل.
لن تؤثّر هذه الإعدادات عليه!</translation>
</message>
<message>