Compare commits

...

1 Commits

Author SHA1 Message Date
Mario Fetka dd04b72a67 Import release 2.0 2009-07-25 14:07:41 +00:00
43 changed files with 10900 additions and 88168 deletions
+2 -2
View File
@@ -128,7 +128,7 @@ INCLUDE_DIRECTORIES( ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES} ${LIBXM
# Switch between the following two commands to force using a predefined version number
# EXECUTE_PROCESS( COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/cmake/get-svn-version.sh OUTPUT_VARIABLE KMESS_VERSION )
SET( KMESS_VERSION "2.0rc1" )
SET( KMESS_VERSION "2.0" )
#### Define compiler flags ####
@@ -156,7 +156,7 @@ ENDIF( CMAKE_COMPILER_IS_GNUCXX )
# - relwithdebinfo (release with debug info)
# - minsizerel (minsize release)
# Uncomment the next line to always force building in full debug mode
SET( CMAKE_BUILD_TYPE debugfull )
#SET( CMAKE_BUILD_TYPE debugfull )
# Enable the KMess debug output when compiling a debug build
IF( CMAKE_BUILD_TYPE STREQUAL debugfull OR KMESS_DEBUG_OUTPUT EQUAL 1 )
+27
View File
@@ -1,4 +1,31 @@
--- 2.0 released ---
2009-07-24 (dazjorz)
* Fixed bug in cmake/get-svn-version.sh on platforms where builtin echo
doesn't understand -n.
* Fixed contact list sorting etc issue ONCE AND FOR ALL.
2009-07-24 (Pano)
* Merged an updated German translation.
* Merged an updated Simplified Chinese translation by Cheng Yang.
2009-07-23 (Valerio)
* Added a class giving meaningful error messages for unsupported applications.
2009-07-21 (Pano)
* Merged an updated Arabic translation by Ma'moun Diraneyya.
2009-07-20 (Adam)
* Fix KMess crashing when transferring display pictures: note this is a
band aid fix and will need to be properly investigated for later releases.
2009-07-20 (Pano)
* Merged an updated Simplified Chinese translation by Cheng Yang.
2009-07-18 (Valerio)
* Further improved the fix for contact list tooltips with RTL languages.
--- 2.0rc1 released ---
2009-07-17 (Valerio)
+1 -1
View File
@@ -5,7 +5,7 @@
#---------------------------------------------------------------------------
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = KMess
PROJECT_NUMBER = 2.0-rc1
PROJECT_NUMBER = 2.0
OUTPUT_DIRECTORY = ./apidocs
CREATE_SUBDIRS = NO
OUTPUT_LANGUAGE = English
+8 -7
View File
@@ -1,22 +1,23 @@
KMess Feature list
========================
- 2.0 -
Support to receive and send Ink (hand-written) messages.
Support to send huge messages.
Options to copy a contact's email, name, message, listened music and links present in the name/message
Support to receive and send hand-written (Ink) messages (still doesn't work with some Messengers).
Options to copy a contact's email, name, message, listened music and links present in the name/message.
List of contact events, such as logins and logouts.
Chat Windows can be used again when reconnecting.
Chat Windows can be used again after reconnecting.
Quick retype of previous sent messages, using Ctrl+Up/Ctrl+Down.
MSN connections over HTTP, to deal with corporate firewalls which only allow connections to browse the web.
Support to chat with offline and invisible contacts.
Support to search in the contact list.
Support to send bigger chat messages.
Support to send longer chat messages.
Option to hide annoying contact emoticons.
Option to choose the browser used to open web sites, Live Mail, and MSN support sites.
Option to manually send commands to the server in developer builds.
Support to group all chats in the same chat window (tabbed chatting).
Option to select a directory where all received files will be put.
Option to choose the interval of ports used for fast file transfers.
Option to keep short notes for each contact.
Option to hide annoying contact emoticons.
Support to MSN Plus text formatting.
Support for DBus remote application control.
Option to choose a previously chosen display picture.
@@ -26,7 +27,7 @@ Support for KDE's KWallet, to store in a secure way the accounts passwords.
Automatic detection of network connection and disconnection.
Option to block notifications when the status is set to Busy.
Option to disable displaying of received winks.
Automatic reconnection to MSN after unwanted disconnections.
Automatic reconnection to MSN after unwanted disconnections with keeping of last status.
- 1.5.1 -
Contact's MSN client detection.
@@ -97,4 +98,4 @@ Chats can be configured to show timestamps when contacts send messages.
A "compact" chat format can be used to remove extraneous line breaks and reduce the size of the chat.
The chat window caption in the taskbar alternates between lower and upper case to inform the user of a received message when the window is not on top.
Internationalization support, with translations in: English, Dutch, German, Italian, Portuguese, Spanish, Turkish, Chinese, French, Catalan, Arabic, Korean, Norsk, Thai, Danish, and Estonian
There is now a method, though not absolute, to tell if a contact is blocking you. If a chat is started with a contact that appears offline, you will be informed if the contact is offline or online and blocking you.
There is now a method, though not absolute, to tell if a contact is blocking you. If a chat is started with a contact that appears offline, you will be informed if the contact is offline or online and blocking you.
+12 -3
View File
@@ -1,4 +1,9 @@
Changes between KMess 2.0 and 2.0-rc1:
--------------------------------------
- updated German translation by Panagiotis Papadopoulos.
- updated Simplified Chinese translation by Cheng Yang.
Changes between KMess 2.0-rc1 and 2.0-beta2:
--------------------------------------
- added Japanese translation by Daniel E. Moctezuma.
@@ -7,16 +12,19 @@ Changes between KMess 2.0-rc1 and 2.0-beta2:
- added fading effect for long text labels and the contact list.
- changed the image used for unknown display pictures.
- changed the application windows icons.
- changed the system tray icon with one showing both the bird and the current status.
- changed the system tray icon with one showing both the bird and the current
status.
- fixed a crash triggered by clients aborting while we're sending data.
- fixed appearance when using right-to-Left languages, like Arabic.
- fixed bug preventing temporary accounts to be correctly cleaned up.
- fixed file selection errors in chat logging.
- fixed newly added contacts appearing as not having added the user in their list.
- fixed newly added contacts appearing as not having added the user in their
list.
- improved appearance of the contact list when antialiasing is enabled.
- removed all experimental features which could not be finished in time.
- updated Arabic translation by Ma'moun Diraneyya.
- updated Brazilian Portuguese translation by Maurício Arozi Moraes and Sergio Rafael Lemke.
- updated Brazilian Portuguese translation by Maurício Arozi Moraes and Sergio
Rafael Lemke.
- updated Catalan translation by Adrià Arrufat.
- updated Finnish translation by Antony Hussi.
- updated Dutch translation by Sander Pientka and Sjors Gielen.
@@ -27,6 +35,7 @@ Changes between KMess 2.0-rc1 and 2.0-beta2:
- updated Italian translation by Valerio Pilo.
- updated Slovak translation by Rastislav Krupanský.
- updated Spanish translation by Mauricio Muñoz Lucero.
- updated Simplified Chinese translation by Cheng Yang.
- updated Traditional Chinese translation by Yen-chou Chen.
Changes between KMess 2.0-beta2 and 2.0-beta1:
+4 -4
View File
@@ -8,13 +8,13 @@ date="`date +%Y%m%d`"
# Make sure we have the right repository
if [ ! -f kmess.kdevelop ]; then
echo -n "svn (unknown)"
/bin/echo -n "svn (unknown)"
exit
fi
# Display normal version if subversion is not installed
if [ ! -x `which svnversion 2>/dev/null` ]; then
echo -n "$appver"
/bin/echo -n "$appver"
exit
fi
@@ -24,9 +24,9 @@ svnver=`LANG=C svnversion`
# see if this is not a repository.
if [ "$svnver" = "exported" ]; then
if [ -z "$KMESS_VER" ]; then
echo -n "$appver";
/bin/echo -n "$appver";
else
echo -n "$KMESS_VER";
/bin/echo -n "$KMESS_VER";
fi
exit;
fi
+605 -1091
View File
File diff suppressed because it is too large Load Diff
+733 -1629
View File
File diff suppressed because it is too large Load Diff
-6983
View File
File diff suppressed because it is too large Load Diff
+180 -380
View File
File diff suppressed because it is too large Load Diff
+1033 -2031
View File
File diff suppressed because it is too large Load Diff
+745 -2631
View File
File diff suppressed because it is too large Load Diff
-6835
View File
File diff suppressed because it is too large Load Diff
+716 -2191
View File
File diff suppressed because it is too large Load Diff
+715 -2202
View File
File diff suppressed because it is too large Load Diff
+682 -1320
View File
File diff suppressed because it is too large Load Diff
+683 -2110
View File
File diff suppressed because it is too large Load Diff
+601 -983
View File
File diff suppressed because it is too large Load Diff
+146 -249
View File
File diff suppressed because it is too large Load Diff
-6909
View File
File diff suppressed because it is too large Load Diff
-6867
View File
File diff suppressed because it is too large Load Diff
+735 -1493
View File
File diff suppressed because it is too large Load Diff
+715 -2056
View File
File diff suppressed because it is too large Load Diff
+689 -1879
View File
File diff suppressed because it is too large Load Diff
-6998
View File
File diff suppressed because it is too large Load Diff
-6665
View File
File diff suppressed because it is too large Load Diff
-7242
View File
File diff suppressed because it is too large Load Diff
-6821
View File
File diff suppressed because it is too large Load Diff
-7039
View File
File diff suppressed because it is too large Load Diff
+1027 -2297
View File
File diff suppressed because it is too large Load Diff
+597 -1226
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -60,6 +60,7 @@ SET(kmess_SOURCES
network/applications/p2papplicationbase.cpp
network/applications/p2papplication.cpp
network/applications/msnobjecttransferp2p.cpp
network/applications/unknownapplication.cpp
network/extra/directconnectionbase.cpp
network/extra/directconnectionpool.cpp
network/extra/msndirectconnection.cpp
+5 -2
View File
@@ -160,7 +160,7 @@ void Group::setName( const QString &newName )
// Change the sort position
void Group::setSortPosition( int sortPosition )
void Group::setSortPosition( int sortPosition, bool signal )
{
#ifdef KMESSDEBUG_GROUP
kDebug() << "Group " << name_ << " old sort position = " << sortPosition_
@@ -169,7 +169,10 @@ void Group::setSortPosition( int sortPosition )
oldSortPosition_ = sortPosition_;
sortPosition_ = sortPosition;
emit changedPosition( this, oldSortPosition_, sortPosition_ );
if( signal )
{
emit changedPosition( this, oldSortPosition_, sortPosition_ );
}
}
+1 -1
View File
@@ -62,7 +62,7 @@ class Group : public QObject
// Change the group name
void setName( const QString& newName );
// Change the sort position
void setSortPosition( int sortPosition );
void setSortPosition( int sortPosition, bool signal = true );
// Change the old sort position (XXX HACK FIXME OMG)
void setOldSortPosition( int oldSortPosition );
// Change the expanded state
+5 -4
View File
@@ -1056,6 +1056,7 @@ void KMessView::showToolTip( const QPoint &point )
return;
}
const QString textAlignment( QApplication::isRightToLeft() ? "right" : "left" );
const QString textDirection( "dir='" + QString(QApplication::isRightToLeft() ? "rtl" : "ltr") + "'" );
// Paint the different types of list items
@@ -1071,7 +1072,7 @@ void KMessView::showToolTip( const QPoint &point )
"<tr><td><img src='%1' width='96' height='96'/></td></tr>"
"</table>"
"</td>"
"<td align='left' valign='top' style='padding-left:10px;'>"
"<td align='" + textAlignment + "' valign='top' style='padding-" + textAlignment + ":10px;'>"
"<b>%2</b> (%3)<br/>"
"%4 %5 %6"
"</td>"
@@ -1080,7 +1081,7 @@ void KMessView::showToolTip( const QPoint &point )
"<td colspan='2'><hr width='98%'/></td>"
"</tr>"
"</table>"
"<table border='0'>"
"<table border='0' " + textDirection + " align='" + textAlignment + "'>"
"%7%8%9%10%11"
"</table>"
"</html>";
@@ -1156,11 +1157,11 @@ void KMessView::showToolTip( const QPoint &point )
QString propertyLine;
if( QApplication::isLeftToRight() )
{
propertyLine = "<tr><td align='right'><i>%1:</i>&nbsp;</td><td>%2</td></tr>";
propertyLine = "<tr><td align='right'><i>%1:</i>&nbsp;</td><td align='left'>%2</td></tr>";
}
else
{
propertyLine = "<tr><td align='left'>%2</td><td>&nbsp;<i>%1:</i></td></tr>";
propertyLine = "<tr><td align='right'>%2</td><td align='left'>&nbsp;<i>%1:</i></td></tr>";
}
// Add handle
+9 -8
View File
@@ -806,7 +806,7 @@ void ContactList::ensureGroupListValid()
kWarning() << "Found a non-special group with sortPosition < 5, resetting to " << group->getSortPosition() + 5;
#endif
// the part below will automatically fix any duplicates caused by this:
group->setSortPosition( group->getSortPosition() + 5 );
group->setSortPosition( group->getSortPosition() + 5, false );
}
else if( group->isSpecialGroup() )
{
@@ -821,14 +821,14 @@ void ContactList::ensureGroupListValid()
int highestPosition = 0;
for( int i = 0; i < groups_.count(); ++i)
{
if( groups_.at( i )->getSortPosition() > highestPosition)
if( !groups_.at( i )->isSpecialGroup() && groups_.at( i )->getSortPosition() > highestPosition)
{
highestPosition = groups_.at( i )->getSortPosition();
}
}
// check for duplicates and gaps (only check non-special groups)
for( int pos = 5; pos < groups_.count(); ++pos )
for( int pos = 5; pos <= highestPosition; ++pos )
{
matches.clear();
@@ -856,13 +856,13 @@ void ContactList::ensureGroupListValid()
if( matches.count() == 1 )
{
// it's OK, just copy this group
matches.at( 0 )->setSortPosition( pos + fillOffset );
matches.at( 0 )->setSortPosition( pos + fillOffset, false );
newGroupList << matches.at( 0 );
}
else if( matches.count() == 0 )
{
#ifdef KMESSDEBUG_CONTACTLIST_GENERAL
kWarning() << "Gap found in group list for position " << pos << ", fixing.";
kDebug() << "Gap found in group list for position " << pos << ", fixing.";
gaps++;
#endif
// there's a gap, lower all other indices in the group list
@@ -871,19 +871,20 @@ void ContactList::ensureGroupListValid()
else
{
#ifdef KMESSDEBUG_CONTACTLIST_GENERAL
kWarning() << "Duplicate found in group list for position " << pos << ", fixing.";
kDebug() << "Duplicate found in group list for position " << pos << ", fixing.";
duplicates++;
#endif
// don't increase the fillOffset for the first one
matches.at( 0 )->setSortPosition( pos + fillOffset );
matches.at( 0 )->setSortPosition( pos + fillOffset, false );
newGroupList << matches.at( 0 );
// add all the others, incrementing the index fix for every add
for( int dup = 1; dup < matches.count(); ++dup )
{
highestPosition++;
fillOffset++;
matches.at( dup )->setSortPosition( pos + fillOffset );
matches.at( dup )->setSortPosition( pos + fillOffset, false );
newGroupList << matches.at( dup );
}
}
@@ -33,6 +33,7 @@
#include "mimeapplication.h"
#include "msnobjecttransferp2p.h"
#include "p2papplication.h"
#include "unknownapplication.h"
#include <QRegExp>
@@ -636,6 +637,15 @@ P2PApplication * ApplicationList::createApplicationByEufGuid(const QString &eufG
{
return new FileTransferP2P( this );
}
else if( eufGuid == UnknownApplication::getGamesAppId()
|| eufGuid == UnknownApplication::getMeetingAppId()
|| eufGuid == UnknownApplication::getRemoteDesktopAppId()
|| eufGuid == UnknownApplication::getWebcamPullAppId()
|| eufGuid == UnknownApplication::getWebcamPushAppId()
|| eufGuid == UnknownApplication::getVoiceAppId() )
{
return new UnknownApplication( this, eufGuid );
}
else
{
#ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL
@@ -23,6 +23,7 @@
#include "../extra/p2pfragmenttracker.h"
#include "../p2pmessage.h"
#include <QPointer>
#include <QList>
@@ -413,7 +414,7 @@ class P2PApplicationBase : public Application
// Message buffer, required to deal with splitted MSNSLP messages
QBuffer *buffer_;
// The data source
QIODevice *dataSource_;
QPointer<QIODevice> dataSource_;
// The type of data to send.
P2PDataType dataType_;
// Message ID, if we're sending "fragmented" content
@@ -0,0 +1,140 @@
/***************************************************************************
unknownapplication.cpp - description
-------------------
begin : Thu Jul 23 2009
copyright : (C) 2009 by Valerio Pilo
email : "project" --at-- "kmess" --dot-- "org"
***************************************************************************/
/***************************************************************************
* *
* 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) any later version. *
* *
***************************************************************************/
#include "unknownapplication.h"
#include "../mimemessage.h"
#include <KLocalizedString>
/**
* The constructor
*/
UnknownApplication::UnknownApplication( ApplicationList *applicationList, const QString &eufGuid )
: P2PApplication( applicationList )
, applicationGuid_( eufGuid )
{
}
/**
* The destructor
*/
UnknownApplication::~UnknownApplication()
{
}
/**
* Step one of a contact-started chat: the contact invites the user
*
* @param message The invitation message
*/
void UnknownApplication::contactStarted1_ContactInvitesUser( const MimeMessage &message )
{
QString errorMessage( i18n( "The contact is inviting you for '%1', but this is not implemented yet." ) );
QString appName;
if( applicationGuid_ == getWebcamPullAppId()
|| applicationGuid_ == getWebcamPushAppId() )
{
errorMessage = errorMessage.arg( i18n( "webcam" ) );
}
else if( applicationGuid_ == getMeetingAppId() )
{
errorMessage = errorMessage.arg( I18N_NOOP( "meeting" ) );
}
else if( applicationGuid_ == getRemoteDesktopAppId() )
{
errorMessage = errorMessage.arg( I18N_NOOP( "remote desktop" ) );
}
else if( applicationGuid_ == getVoiceAppId() )
{
errorMessage = i18n( "You are invited to start a voice conversation but support for this was not installed" );
}
else if( applicationGuid_ == getGamesAppId() )
{
// Parse the context
// Contents is something like '10331021;1;Tic Tac Toe'
QByteArray decodedContext( QByteArray::fromBase64( message.getValue("Context").toLatin1() ) );
QString contextString ( QString::fromUtf16( reinterpret_cast<const ushort*>( decodedContext.data() ),
decodedContext.size() / 2 ) );
errorMessage = errorMessage.arg( contextString.section( ';', 2, 2 ) );
}
// Tell the contact we don't support the application
showSystemMessage( errorMessage, ChatMessage::CONTENT_SYSTEM_NOTICE, true );
sendCancelMessage( CANCEL_NOT_INSTALLED );
}
// Return the GUID for web applications (games)
QString UnknownApplication::getGamesAppId()
{
return "{6A13AF9C-5308-4F35-923A-67E8DDA40C2F}";
}
// Return the GUID for meeting
QString UnknownApplication::getMeetingAppId()
{
return "{44BBA842-CC51-11CF-AAFA-00AA00B6015C}";
}
// Return the GUID for remote desktop
QString UnknownApplication::getRemoteDesktopAppId()
{
return "{56b994a7-380f-410b-9985-c809d78c1bdc}";
}
// Return the GUID for webcam transfer sending
QString UnknownApplication::getWebcamPushAppId()
{
return "{4BD96FC0-AB17-4425-A14A-439185962DC8}";
}
// Return the GUID for webcam transfer receiving
QString UnknownApplication::getWebcamPullAppId()
{
return "{1C9AA97E-9C05-4583-A3BD-908A196F1E92}";
}
// Return the GUID for voice conversations
QString UnknownApplication::getVoiceAppId()
{
return "{02D3C01F-BF30-4825-A83A-DE7AF41648AA}";
}
#include "unknownapplication.moc"
@@ -0,0 +1,70 @@
/***************************************************************************
unknownapplication.h - description
-------------------
begin : Thu Jul 23 2009
copyright : (C) 2009 by Valerio Pilo
email : "project" --at-- "kmess" --dot-- "org"
***************************************************************************/
/***************************************************************************
* *
* 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) any later version. *
* *
***************************************************************************/
#ifndef UNKNOWNAPPLICATION_H
#define UNKNOWNAPPLICATION_H
#include "p2papplication.h"
/**
* Unknown application notification class.
*
* This class can be used to give useful error messages to the user when
* unsupported applications are requested by contacts.
*
* @author Valerio Pilo
* @ingroup Applications
*/
class UnknownApplication : public P2PApplication
{
Q_OBJECT
public:
// The constructor
UnknownApplication( ApplicationList *applicationList, const QString &eufGuid );
// The destructor
virtual ~UnknownApplication();
public: // Static public members
// Return the GUID for web applications (games)
static QString getGamesAppId();
// Return the GUID for meeting
static QString getMeetingAppId();
// Return the GUID for remote desktop
static QString getRemoteDesktopAppId();
// Return the GUID for webcam transfer sending
static QString getWebcamPushAppId();
// Return the GUID for webcam transfer receiving
static QString getWebcamPullAppId();
// Return the GUID for voice conversations
static QString getVoiceAppId();
private:
// Step one of a contact-started chat: the contact invites the user
void contactStarted1_ContactInvitesUser( const MimeMessage& message );
private: // Private members
// The GUID of the unsupported but known application
const QString applicationGuid_;
};
#endif
-3
View File
@@ -610,8 +610,6 @@ void MsnConnection::parseError( const QStringList &command, const QByteArray &pa
break;
case 711:
errorType = MsnSocketBase::ERROR_SERVER;
#warning after release, make this more clear
//errorMessage = i18nc("Error received from the MSN servers", "Unknown error");
errorMessage = i18n("Write is blocking");
break;
case 712:
@@ -655,7 +653,6 @@ void MsnConnection::parseError( const QStringList &command, const QByteArray &pa
// We've received a warning message: show it in a dialog box, but do not disconnect
else if( isWarning )
{
#warning TODO post-2.0: add the exact error number, command[0].toInt(), here
KMessageBox::error( 0, errorMessage, i18nc( "Error dialog box title", "MSN Error" ) );
return;
}
@@ -781,7 +781,6 @@ QByteArray MsnNotificationConnection::createTripleDes ( const QByteArray key, co
if ( ! QCA::isSupported( "tripledes-cbc" ) )
{
kWarning() << "Triple DES encryption not supported, please install qca2 packages";
#warning "Translate this after string freeze!!"
slotError(I18N_NOOP("Triple DES encryption is not supported. This means you probably do not have "
"installed qca2 or qca2-openssl. Please install it and retry"), MsnSocketBase::ERROR_AUTH_COMPUTATION);
return "";
@@ -2994,7 +2993,6 @@ void MsnNotificationConnection::slotError( QString error, MsnSocketBase::ErrorTy
break;
case MsnSocketBase::ERROR_AUTH_COMPUTATION:
#warning "Translate this after string freeze!"
message = I18N_NOOP("<p>Unable to resolve the authentication on the client<br/>"
"Maybe you do not have installed qca2 and/or qca2-plugin-ossl?</p>" );
detailedMessage = I18N_NOOP("<p>KMess could not connect to the Live Messenger servers.<br />"
+1 -3
View File
@@ -121,7 +121,7 @@ void SystemTrayWidget::displayCloseMessage( QString /*fileMenu*/ )
// Grab an image of the screen which contains the tray icon
QPixmap shot;
if( pictureArea.x() == 0 && pictureArea.y() == 0 )
{
{
#ifdef Q_WS_X11
shot = QPixmap::grabWindow( QX11Info::appRootWindow(), pictureArea.x(), pictureArea.y(), pictureArea.width(), pictureArea.height() );
#else
@@ -239,8 +239,6 @@ void SystemTrayWidget::statusChanged()
setIcon( icon );
// Change the tooltip
#warning translate this correctly after 2.0!
// QString newTooltip( i18nc( "Tray icon tooltip showing the KMess version", "KMess %1", KMESS_VERSION ) );
QString newTooltip( "KMess " KMESS_VERSION );
if( status != STATUS_OFFLINE )