Members of the KDE Community are recommended to subscribe to the kde-community mailing list at https://mail.kde.org/mailman/listinfo/kde-community to allow them to participate in important discussions and receive other important announcements

Commit 748e52bc authored by Luigi Toscano's avatar Luigi Toscano

Final porting to categorized logging

- define the logging category using the ECM macro and bump the required
  dependencies (Frameworks/ECM 5.14 for the macro itself, Qt 5.4 for the
  default category level);
- convert the really last leftovers of kDebug;
- remove endl at the end of qC* calls.
parent a03f3019
......@@ -5,7 +5,10 @@ add_definitions( -DTRANSLATION_DOMAIN=\"kmix\" )
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
find_package(ECM 5.10.0 REQUIRED NO_MODULE)
set (QT_MIN_VERSION "5.4.0")
set (KF5_MIN_VERSION "5.14.0")
find_package(ECM ${KF5_MIN_VERSION} REQUIRED NO_MODULE)
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR})
include(KDEInstallDirs)
......@@ -13,8 +16,9 @@ include(KDECMakeSettings)
include(KDECompilerSettings NO_POLICY_SCOPE)
include(ECMPackageConfigHelpers)
include(ECMInstallIcons)
include(ECMQtDeclareLoggingCategory)
find_package(Qt5 5.2.0 REQUIRED NO_MODULE COMPONENTS
find_package(Qt5 ${QT_MIN_VERSION} REQUIRED NO_MODULE COMPONENTS
Core
DBus
Gui
......@@ -22,7 +26,7 @@ find_package(Qt5 5.2.0 REQUIRED NO_MODULE COMPONENTS
Xml
)
find_package(KF5 REQUIRED COMPONENTS
find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS
Completion
Config
ConfigWidgets
......@@ -105,6 +109,11 @@ if (CANBERRA_FOUND)
endif (CANBERRA_FOUND)
ecm_qt_declare_logging_category(kmix_debug_SRCS
HEADER kmix_debug.h
IDENTIFIER KMIX_LOG
CATEGORY_NAME org.kde.kmix)
####################################################################################################
########### definitions: DBUSADAPTOR ###############################################################
####################################################################################################
......@@ -180,7 +189,7 @@ set(kmix_KDEINIT_SRCS ${kmix_adaptor_SRCS} ${kmix_backend_SRCS}
core/mixdevice.cpp
core/mixdevicecomposite.cpp
core/volume.cpp
core/kmixdebug.cpp
${kmix_debug_SRCS}
)
kf5_add_kdeinit_executable(kmix ${kmix_KDEINIT_SRCS})
......@@ -237,7 +246,7 @@ install(TARGETS kmix ${INSTALL_TARGETS_DEFAULT_ARGS} )
core/volume.cpp
core/mixertoolbox.cpp
core/kmixdevicemanager.cpp
core/kmixdebug.cpp
${kmix_debug_SRCS}
)
#qt4_add_dbus_adaptor(kded_kmixd_SRCS org.kde.KMixD.xml kmixd.h Mixer)
......@@ -300,7 +309,7 @@ set(kmixctrl_KDEINIT_SRCS ${kmix_adaptor_SRCS} ${kmix_backend_SRCS}
core/mixdevice.cpp
core/volume.cpp
core/mixertoolbox.cpp
core/kmixdebug.cpp
${kmix_debug_SRCS}
# There is no actual need for kmixdevicemanager.cpp (hotplug makes no sense in kmixctrl), but
# the dependency comes in via mixertoolbox.cpp
core/kmixdevicemanager.cpp
......
......@@ -22,7 +22,6 @@
#include "KMixApp.h"
#include <kcmdlineargs.h>
#include <kdebug.h>
#include "apps/kmix.h"
#include "core/ControlManager.h"
......
......@@ -43,7 +43,6 @@
#include <kapplication.h>
#include <kstandardaction.h>
#include <khelpmenu.h>
#include <kdebug.h>
#include <kxmlguifactory.h>
#include <kglobal.h>
#include <kactioncollection.h>
......@@ -67,7 +66,7 @@
#include "gui/dialogaddview.h"
#include "gui/dialogselectmaster.h"
#include "dbus/dbusmixsetwrapper.h"
#include "core/kmixdebug.h"
#include "kmix_debug.h"
#include <QtDBus/QDBusInterface>
#include <QtDBus/QDBusPendingCall>
#include <QKeySequence>
......
......@@ -30,7 +30,6 @@
#include <kglobal.h>
#include <kstandarddirs.h>
#include <kconfig.h>
#include <kdebug.h>
#include "gui/kmixtoolbox.h"
#include "core/GlobalConfig.h"
......
......@@ -30,7 +30,6 @@
#include <kconfig.h>
#include <kaction.h>
#include <kstandardaction.h>
#include <kdebug.h>
#include <kxmlguifactory.h>
#include <kglobal.h>
#include <kactioncollection.h>
......
......@@ -24,14 +24,13 @@
#include <k4aboutdata.h>
#include <KLocalizedString>
#include <kdebug.h>
#include <klocale.h>
#include <kglobal.h>
#include <kstandarddirs.h>
#include "KMixApp.h"
#include "core/version.h"
#include "core/kmixdebug.h"
#include "kmix_debug.h"
static const char description[] =
I18N_NOOP("KMix - KDE's full featured mini mixer");
......
......@@ -30,7 +30,6 @@
#include "core/volume.h"
// KDE
#include <kdebug.h>
#include <klocale.h>
// Qt
......
......@@ -257,7 +257,7 @@ shared_ptr<MixDevice> Mixer_Backend::recommendedMaster()
{
if ( !_mixer->isDynamic())
// This should never ever happen, as KMix does NOT accept soundcards without controls
qCCritical(KMIX_LOG) << "Mixer_Backend::recommendedMaster(): returning invalid master. This is a bug in KMix. Please file a bug report stating how you produced this." << endl;
qCCritical(KMIX_LOG) << "Mixer_Backend::recommendedMaster(): returning invalid master. This is a bug in KMix. Please file a bug report stating how you produced this.";
}
// If we reach this code path, then obiously m_recommendedMaster == 0 (see above)
......
......@@ -27,7 +27,7 @@
#include <QTimer>
#include "core/mixdevice.h"
#include "core/mixset.h"
#include "core/kmixdebug.h"
#include "kmix_debug.h"
class Mixer;
......
......@@ -23,7 +23,7 @@
#include "core/mixer.h"
#include "core/ControlManager.h"
#include "core/GlobalConfig.h"
#include "core/kmixdebug.h"
#include "kmix_debug.h"
#include <QStringList>
#include <QDBusReply>
......
......@@ -521,14 +521,14 @@ bool Mixer_OSS4::hasChangedControls()
minfo.dev = -1;
if ( wrapIoctl( ioctl(m_fd, SNDCTL_MIXERINFO, &minfo) ) < 0 )
{
qCDebug(KMIX_LOG) << "Can't get mixerinfo from card!\n" << endl;
qCDebug(KMIX_LOG) << "Can't get mixerinfo from card!\n";
return false;
}
if (!minfo.enabled)
{
// Mixer is disabled. Probably disconnected USB device or card is unavailable;
qCDebug(KMIX_LOG) << "Mixer for card is disabled!\n" << endl;
qCDebug(KMIX_LOG) << "Mixer for card is disabled!\n";
close();
return false;
}
......@@ -616,7 +616,7 @@ int Mixer_OSS4::writeVolumeToHW(const QString& id, shared_ptr<MixDevice> md)
if ( wrapIoctl( ioctl(m_fd, SNDCTL_MIX_EXTINFO, &extinfo) ) < 0 )
{
//TO DO: more specific error handling
kDebug ( 67100 ) << "failed to read info for control " << id2num(id) << endl;
qCDebug(KMIX_LOG) << "failed to read info for control " << id2num(id);
return Mixer::ERR_READ;
}
......@@ -661,7 +661,7 @@ int Mixer_OSS4::writeVolumeToHW(const QString& id, shared_ptr<MixDevice> md)
if ( wrapIoctl ( ioctl (m_fd, SNDCTL_MIX_WRITE, &mv) ) < 0 )
{
kDebug ( 67100 ) << "error writing to control" << extinfo.extname << endl;
qCDebug(KMIX_LOG) << "error writing to control" << extinfo.extname;
return Mixer::ERR_WRITE;
}
return 0;
......@@ -678,7 +678,7 @@ void Mixer_OSS4::setEnumIdHW(const QString& id, unsigned int idx)
if ( wrapIoctl ( ioctl(m_fd, SNDCTL_MIX_EXTINFO, &extinfo) ) < 0 )
{
//TO DO: more specific error handling
kDebug ( 67100 ) << "failed to read info for control " << id2num(id) << endl;
qCDebug(KMIX_LOG) << "failed to read info for control " << id2num(id);
return;
}
......@@ -711,7 +711,7 @@ void Mixer_OSS4::setEnumIdHW(const QString& id, unsigned int idx)
if ( wrapIoctl ( ioctl (m_fd, SNDCTL_MIX_WRITE, &mv) ) < 0 )
{
/* Oops, can't write to mixer */
kDebug ( 67100 ) << "error writing to control" << extinfo.extname << endl;
qCDebug(KMIX_LOG) << "error writing to control" << extinfo.extname;
}
}
......@@ -753,28 +753,28 @@ int Mixer_OSS4::wrapIoctl(int ioctlRet)
{
case EIO:
{
kDebug ( 67100 ) << "A hardware level error occurred" << endl;
qCDebug(KMIX_LOG) << "A hardware level error occurred";
break;
}
case EINVAL:
{
kDebug ( 67100 ) << "Operation caused an EINVAL. You may have found a bug in kmix OSS4 module or in OSS4 itself" << endl;
qCDebug(KMIX_LOG) << "Operation caused an EINVAL. You may have found a bug in kmix OSS4 module or in OSS4 itself";
break;
}
case ENXIO:
{
kDebug ( 67100 ) << "Operation index out of bounds or requested device does not exist - you likely found a bug in the kmix OSS4 module" << endl;
qCDebug(KMIX_LOG) << "Operation index out of bounds or requested device does not exist - you likely found a bug in the kmix OSS4 module";
break;
}
case EPERM:
case EACCES:
{
kDebug ( 67100 ) << errorText ( Mixer::ERR_PERM ) << endl;
qCDebug(KMIX_LOG) << errorText ( Mixer::ERR_PERM );
break;
}
case ENODEV:
{
kDebug ( 67100 ) << "kmix received an ENODEV error - are the OSS4 drivers loaded ?" << endl;
qCDebug(KMIX_LOG) << "kmix received an ENODEV error - are the OSS4 drivers loaded ?";
break;
}
case EPIPE:
......
......@@ -19,7 +19,7 @@
#include "ControlManager.h"
#include "core/GlobalConfig.h"
#include "core/kmixdebug.h"
#include "kmix_debug.h"
#include <QMutableListIterator>
......
......@@ -28,7 +28,7 @@
*/
#include "core/MediaController.h"
#include "core/kmixdebug.h"
#include "kmix_debug.h"
//#include <phonon/audiooutput.h>
//#include <phonon/backendcapabilities.h>
......
/*
* KMix -- KDE's full featured mini mixer
* Copyright 2015 Alexander Potashev <aspotashev@gmail.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License or (at your option) version 3 or any later version
* accepted by the membership of KDE e.V. (or its successor approved
* by the membership of KDE e.V.), which shall act as a proxy
* defined in Section 14 of version 3 of the license.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "kmixdebug.h"
Q_LOGGING_CATEGORY(KMIX_LOG, "kmix")
/*
* KMix -- KDE's full featured mini mixer
* Copyright 2015 Alexander Potashev <aspotashev@gmail.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License or (at your option) version 3 or any later version
* accepted by the membership of KDE e.V. (or its successor approved
* by the membership of KDE e.V.), which shall act as a proxy
* defined in Section 14 of version 3 of the license.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef KMIXDEBUG_H
#define KMIXDEBUG_H
#include <QtCore/QLoggingCategory>
Q_DECLARE_LOGGING_CATEGORY(KMIX_LOG)
#endif // KMIXDEBUG_H
......@@ -19,7 +19,6 @@
*/
#include "core/kmixdevicemanager.h"
#include <kdebug.h>
#ifdef __GNUC__
#warning KMix KF5 build does not support hotplugging yet
......
......@@ -23,7 +23,6 @@
#include <qregexp.h>
#include <kdebug.h>
#include <klocale.h>
#include "core/ControlPool.h"
......@@ -142,7 +141,7 @@ void MixDevice::init( Mixer* mixer, const QString& id, const QString& name, con
_moveDestinationMixSet = moveDestinationMixSet;
if ( _id.contains(' ') ) {
// The key is used in the config file. IdbusControlWrappert MUST NOT contain spaces
qCCritical(KMIX_LOG) << "MixDevice::setId(\"" << id << "\") . Invalid key - it must not contain spaces" << endl;
qCCritical(KMIX_LOG) << "MixDevice::setId(\"" << id << "\") . Invalid key - it must not contain spaces";
_id.replace(' ', '_');
}
// qCDebug(KMIX_LOG) << "MixDevice::init() _id=" << _id;
......
......@@ -25,7 +25,6 @@
#include <klocale.h>
#include <kconfig.h>
#include <kglobal.h>
#include <kdebug.h>
#include "backends/mixer_backend.h"
#include "backends/kmix-backends.cpp"
......@@ -274,9 +273,9 @@ bool Mixer::openIfValid()
else
{
if ( !m_dynamic )
qCCritical(KMIX_LOG) << "Mixer::open() no master detected." << endl;
qCCritical(KMIX_LOG) << "Mixer::open() no master detected.";
else
qCDebug(KMIX_LOG) << "Mixer::open() no master detected." << endl;
qCDebug(KMIX_LOG) << "Mixer::open() no master detected.";
QString noMaster = "---no-master-detected---";
setLocalMasterMD(noMaster); // no master
}
......
......@@ -26,7 +26,6 @@
#include <QString>
#include <QStringBuilder>
//#include <kdebug.h>
#include <klocale.h>
#include <kstandarddirs.h>
......
......@@ -23,10 +23,9 @@
//KMix
#include "mixset.h"
#include "core/mixdevice.h"
#include "core/kmixdebug.h"
#include "kmix_debug.h"
// KDE
#include <kdebug.h>
#include <kconfig.h>
#include <kconfiggroup.h>
......
......@@ -20,11 +20,11 @@
*/
#include "core/volume.h"
#include "kmix_debug.h"
// for operator<<()
#include <iostream>
#include <kdebug.h>
#include <klocalizedstring.h>
float Volume::VOLUME_STEP_DIVISOR = 20;
......
......@@ -23,9 +23,9 @@
#include <fstream>
#include <kdebug.h>
#include <QDebug>
#include <QList>
#include <QMap>
class VolumeChannel;
......
......@@ -26,7 +26,7 @@
#include "core/ControlManager.h"
#include "core/mixdevice.h"
#include "core/volume.h"
#include "core/kmixdebug.h"
#include "kmix_debug.h"
#include "dbus/dbusmixsetwrapper.h"
#include "mixeradaptor.h"
......
......@@ -29,7 +29,6 @@
#include <QHBoxLayout>
#include <kcombobox.h>
#include <kdebug.h>
#include <klocale.h>
#include "core/mixdevice.h"
......@@ -235,7 +234,7 @@ void DialogAddView::apply()
if ( button != 0 ) {
QString viewName = button->objectName();
if ( mixer == 0 ) {
qCCritical(KMIX_LOG) << "DialogAddView::createPage(): Invalid Mixer (mixer=0)" << endl;
qCCritical(KMIX_LOG) << "DialogAddView::createPage(): Invalid Mixer (mixer=0)";
return; // can not happen
}
else {
......
......@@ -30,7 +30,6 @@
#include <QHBoxLayout>
#include <kcombobox.h>
#include <kdebug.h>
#include <klocale.h>
#include "core/ControlManager.h"
......
......@@ -26,7 +26,6 @@
#include <QListWidget>
#include <kcombobox.h>
#include <kdebug.h>
#include <kiconloader.h>
#include <klocale.h>
......
......@@ -30,7 +30,6 @@
#include <QVBoxLayout>
#include <QGridLayout>
#include <kdebug.h>
#include <kdialog.h>
#include <kicon.h>
#include <KIconLoader>
......
......@@ -36,7 +36,6 @@ class QVBoxLayout;
#include <QMimeData>
// KDE
#include <kdebug.h>
#include <kdialog.h>
// KMix
......
......@@ -30,7 +30,6 @@
#include <utility>
// KDE
#include <kdebug.h>
#include <kstandarddirs.h>
// KMix
......@@ -367,7 +366,7 @@ bool GUIProfile::readProfile(const QString& ref_fileName)
} // Read OK
else {
// !! this error message about faulty profiles should probably be surrounded with i18n()
qCCritical(KMIX_LOG) << "ERROR: The profile '" << ref_fileName<< "' contains errors, and is not used." << endl;
qCCritical(KMIX_LOG) << "ERROR: The profile '" << ref_fileName<< "' contains errors, and is not used.";
}
delete gpp;
delete xmlReader;
......@@ -680,7 +679,7 @@ void ProfControl::setSubcontrols(QString sctls)
QStringListIterator qslIt(qsl);
while (qslIt.hasNext()) {
QString sctl = qslIt.next();
//qCDebug(KMIX_LOG) << "setSubcontrols found: " << sctl.toLocal8Bit().constData() << endl;
//qCDebug(KMIX_LOG) << "setSubcontrols found: " << sctl.toLocal8Bit().constData();
if ( sctl == "pvolume" ) _useSubcontrolPlayback = true;
else if ( sctl == "cvolume" ) _useSubcontrolCapture = true;
else if ( sctl == "pswitch" ) _useSubcontrolPlaybackSwitch = true;
......
......@@ -23,7 +23,7 @@
class Mixer;
#include "core/kmixdebug.h"
#include "kmix_debug.h"
#include <qxml.h>
#include <QColor>
......
......@@ -26,7 +26,6 @@
#include <kaction.h>
#include <klocale.h>
#include <kmenu.h>
#include <kdebug.h>
#include <kwindowsystem.h>
#include <kactioncollection.h>
#include <ktoggleaction.h>
......@@ -417,7 +416,7 @@ void KMixDockWidget::contextMenuAboutToShow()
{
// Enable/Disable "Muted" menu item
KToggleAction *dockMuteAction = static_cast<KToggleAction*>(findAction("dock_mute"));
qDebug() << "DOCK MUTE" << dockMuteAction;
qCDebug(KMIX_LOG) << "DOCK MUTE" << dockMuteAction;
if (dockMuteAction)
updateDockMuteAction(dockMuteAction);
}
......
......@@ -31,7 +31,6 @@
// KDE
#include <kconfig.h>
#include <kconfiggroup.h>
#include <kdebug.h>
#include <kglobal.h>
#include <kicon.h>
#include <klocale.h>
......
......@@ -24,7 +24,6 @@
#include <QWidget>
#include <QString>
//#include <kdebug.h>
#include <KComponentData>
#include <kglobal.h>
#include <kglobalaccel.h>
......
......@@ -24,8 +24,6 @@
// For INT_MAX
#include <limits.h>
#include <kdebug.h>
#include <QWidget>
#include <qpainter.h>
#include <QColor>
......
......@@ -30,7 +30,6 @@
#include <kactioncollection.h>
#include <kconfig.h>
#include <kcombobox.h>
#include <kdebug.h>
#include <kglobalaccel.h>
#include <klocale.h>
#include <kmenu.h>
......@@ -114,7 +113,7 @@ void MDWEnum::update()
_enumCombo->setCurrentIndex( m_mixdevice->enumId() );
}
else {
qCCritical(KMIX_LOG) << "MDWEnum::update() enumID=" << m_mixdevice->enumId() << " is no Enum ... skipped" << endl;
qCCritical(KMIX_LOG) << "MDWEnum::update() enumID=" << m_mixdevice->enumId() << " is no Enum ... skipped";
}
}
......
......@@ -27,7 +27,6 @@
#include <kaction.h>
#include <kmenu.h>
#include <kglobalaccel.h>
#include <kdebug.h>
#include <kactioncollection.h>
#include <ktoggleaction.h>
......@@ -743,7 +742,7 @@ void MDWSlider::setIcon( QString filename, QWidget* label )
}
else
{
qCCritical(KMIX_LOG) << "Pixmap missing. filename=" << filename << endl;
qCCritical(KMIX_LOG) << "Pixmap missing. filename=" << filename;
}
}
......
......@@ -29,7 +29,6 @@
//#include <kaction.h>
//#include <kmenu.h>
//#include <kglobalaccel.h>
//#include <kdebug.h>
//#include <ktoggleaction.h>
//#include <kactioncollection.h>
//
......
......@@ -29,7 +29,6 @@
#include <kmenu.h>
#include <kglobalaccel.h>
#include <kshortcutsdialog.h>
#include <kdebug.h>
#include <qcursor.h>
#include <QMouseEvent>
......
......@@ -21,7 +21,6 @@
#include "verticaltext.h"
#include <QPainter>
#include <kdebug.h>
......
......@@ -362,7 +362,7 @@ void ViewBase::load(KConfig *config)
// Consult GuiProfile for visibility
mdwEnabled = findMdw(mdw->mixDevice()->id(), guiCompl) != 0; // Match GUI complexity
// kWarning() << "---------- FIRST RUN: md=" << md->id() << ", guiVisibility=" << guiCompl.getId() << ", enabled=" << mdwEnabled;
// qCWarning(KMIX_LOG) << "---------- FIRST RUN: md=" << md->id() << ", guiVisibility=" << guiCompl.getId() << ", enabled=" << mdwEnabled;
if (mdwEnabled)
{
......
......@@ -32,7 +32,6 @@
// KDE
#include <kaction.h>
#include <kapplication.h>
#include <kdebug.h>
#include <kdialog.h>
#include <kicon.h>
#include <klocale.h>
......@@ -396,7 +395,7 @@ void ViewDockAreaPopup::constructionFinished()
_layoutMDW->activate();
//bool fnc = focusNextChild();
//kWarning() << "fnc=" <<fnc;
//qCWarning(KMIX_LOG) << "fnc=" <<fnc;
// qCDebug(KMIX_LOG) << "F layout()=" << layout() << ", _layoutMDW=" << _layoutMDW;
}
......
......@@ -46,7 +46,6 @@
// KDE
#include <kdebug.h>
#include <KIcon>
#include <KLocale>
......
......@@ -23,7 +23,6 @@
#include <QFontMetrics>
#include "volumeslider.h"
#include <kdebug.h>
VolumeSlider::VolumeSlider(Qt::Orientation orientation, QWidget* parent) : QSlider(orientation, parent)
,m_orientation(orientation),m_tooltip(new QLabel(parent,Qt::ToolTip))
......@@ -115,7 +114,7 @@ void VolumeSlider::mouseMoveEvent(QMouseEvent* event)
m_tooltip->move(mapToGlobal(sliderHandle.topLeft()).x(),mapToGlobal(sliderHandle.topLeft()).y()+height());
}
//kDebug() << "Position is"<<mapToGlobal(sliderHandle.topLeft()).x()<<","<<mapToGlobal(sliderHandle.topLeft()).y();
//kDebug() << "Volume is "<<percent;
//qCDebug(KMIX_LOG) << "Position is"<<mapToGlobal(sliderHandle.topLeft()).x()<<","<<mapToGlobal(sliderHandle.topLeft()).y();
//qCDebug(KMIX_LOG) << "Volume is "<<percent;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment