summaryrefslogtreecommitdiffstats
path: root/kopete/protocols/meanwhile
diff options
context:
space:
mode:
Diffstat (limited to 'kopete/protocols/meanwhile')
-rw-r--r--kopete/protocols/meanwhile/Makefile.am37
-rw-r--r--kopete/protocols/meanwhile/README53
-rw-r--r--kopete/protocols/meanwhile/icons/Makefile.am2
-rw-r--r--kopete/protocols/meanwhile/icons/cr128-app-meanwhile_protocol.pngbin0 -> 6751 bytes
-rw-r--r--kopete/protocols/meanwhile/icons/cr16-action-meanwhile_away.pngbin0 -> 959 bytes
-rw-r--r--kopete/protocols/meanwhile/icons/cr16-action-meanwhile_dnd.pngbin0 -> 920 bytes
-rw-r--r--kopete/protocols/meanwhile/icons/cr16-action-meanwhile_idle.pngbin0 -> 395 bytes
-rw-r--r--kopete/protocols/meanwhile/icons/cr16-action-meanwhile_unknown.pngbin0 -> 412 bytes
-rw-r--r--kopete/protocols/meanwhile/icons/cr16-app-meanwhile_protocol.pngbin0 -> 800 bytes
-rw-r--r--kopete/protocols/meanwhile/icons/cr22-app-meanwhile_protocol.pngbin0 -> 1138 bytes
-rw-r--r--kopete/protocols/meanwhile/icons/cr32-app-meanwhile_protocol.pngbin0 -> 1573 bytes
-rw-r--r--kopete/protocols/meanwhile/icons/cr48-app-meanwhile_protocol.pngbin0 -> 2493 bytes
-rw-r--r--kopete/protocols/meanwhile/icons/cr64-app-meanwhile_protocol.pngbin0 -> 3351 bytes
-rw-r--r--kopete/protocols/meanwhile/icons/crsc-app-meanwhile_protocol.svgzbin0 -> 1131 bytes
-rw-r--r--kopete/protocols/meanwhile/kopete_meanwhile.desktop58
-rw-r--r--kopete/protocols/meanwhile/meanwhileaccount.cpp274
-rw-r--r--kopete/protocols/meanwhile/meanwhileaccount.h121
-rw-r--r--kopete/protocols/meanwhile/meanwhileaddcontactpage.cpp74
-rw-r--r--kopete/protocols/meanwhile/meanwhileaddcontactpage.h45
-rw-r--r--kopete/protocols/meanwhile/meanwhilecontact.cpp132
-rw-r--r--kopete/protocols/meanwhile/meanwhilecontact.h68
-rw-r--r--kopete/protocols/meanwhile/meanwhileeditaccountwidget.cpp194
-rw-r--r--kopete/protocols/meanwhile/meanwhileeditaccountwidget.h51
-rw-r--r--kopete/protocols/meanwhile/meanwhileplugin.cpp37
-rw-r--r--kopete/protocols/meanwhile/meanwhileplugin.h47
-rw-r--r--kopete/protocols/meanwhile/meanwhileprotocol.cpp126
-rw-r--r--kopete/protocols/meanwhile/meanwhileprotocol.h77
-rw-r--r--kopete/protocols/meanwhile/meanwhilesession.cpp965
-rw-r--r--kopete/protocols/meanwhile/meanwhilesession.h350
-rw-r--r--kopete/protocols/meanwhile/ui/Makefile.am8
-rw-r--r--kopete/protocols/meanwhile/ui/empty.cpp0
-rw-r--r--kopete/protocols/meanwhile/ui/meanwhileaddcontactbase.ui111
-rw-r--r--kopete/protocols/meanwhile/ui/meanwhileeditaccountbase.ui437
33 files changed, 3267 insertions, 0 deletions
diff --git a/kopete/protocols/meanwhile/Makefile.am b/kopete/protocols/meanwhile/Makefile.am
new file mode 100644
index 00000000..e161fac3
--- /dev/null
+++ b/kopete/protocols/meanwhile/Makefile.am
@@ -0,0 +1,37 @@
+METASOURCES = AUTO
+SUBDIRS = ui icons
+
+AM_CPPFLAGS = $(KOPETE_INCLUDES) \
+ -I$(srcdir)/ui \
+ -I./ui \
+ $(all_includes) \
+ $(MEANWHILE_CFLAGS)
+
+noinst_HEADERS = \
+ meanwhileprotocol.h \
+ meanwhileaddcontactpage.h \
+ meanwhileeditaccountwidget.h \
+ meanwhileaccount.h \
+ meanwhilecontact.h \
+ meanwhilesession.h \
+ meanwhileplugin.h
+
+kde_module_LTLIBRARIES = kopete_meanwhile.la
+
+kopete_meanwhile_la_SOURCES = \
+ meanwhileprotocol.cpp \
+ meanwhileaddcontactpage.cpp \
+ meanwhileeditaccountwidget.cpp \
+ meanwhileaccount.cpp \
+ meanwhilecontact.cpp \
+ meanwhilesession.cpp \
+ meanwhileplugin.cpp
+
+kopete_meanwhile_la_LDFLAGS = -no-undefined -module \
+ $(KDE_PLUGIN) $(all_libraries)
+
+kopete_meanwhile_la_LIBADD = $(top_builddir)/kopete/libkopete/libkopete.la \
+ ui/libkopetemeanwhileui.la $(MEANWHILE_LIBS)
+
+service_DATA = kopete_meanwhile.desktop
+servicedir= $(kde_servicesdir)
diff --git a/kopete/protocols/meanwhile/README b/kopete/protocols/meanwhile/README
new file mode 100644
index 00000000..5c77dbf6
--- /dev/null
+++ b/kopete/protocols/meanwhile/README
@@ -0,0 +1,53 @@
+This is a kopete plugin for meanwhile using the libmeanwhile library.
+
+To INSTALL
+==========
+
+1. install libmeanwhile
+2. install kopete with the meanwhile plugin.
+
+installing libmeanwhile
+=======================
+from http://meanwhile.sf.net - use version 0.3
+Refer to INSTALL in the meanwhile code. Run configure without specifying the --with_gaim_src
+ # autogen.sh
+ # ./configure --prefix=/usr
+ # make
+ # su -c make install
+
+installing kopete with meanwhile plugin
+=======================================
+1. Get kopete src from kopete.kde.org (latest cvs)
+2. move this directory to $KOPETE_SRC/kopete/protocols/meanwhile,
+3. patch the configure script in $KOPETE_SRC to pickup meanwhile
+ in $KOPETE_SRC
+ # patch -P0 < kopete/protocols/meanwhile/configure.patch
+4. patch Makefile.am in protocols with protocols-makefile.patch
+ in $KOPETE_SRC
+ # patch -P0 < kopete/protocols/meanwhile/protocols-makefile.patch
+5. run automake to process this Makefile.am
+ in $KOPETE_SRC
+ # automake kopete/protocols/Makefile
+6. libmeanwhile uses glib and kopete's makefile have no references to glib, so
+ edit $KOPETE_SRC/kopete/protocols/meanwhile/Makefile.am and verify that
+ GLIB_INCLUDES points to the right places. These variables are currently
+ set for Fedora-core-1. If you have to modify the variable, rebuild the
+ makefile.
+ in $KOPETE_SRC
+ # automake kopete/protocols/meanwhile/Makefile
+7. follow the steps defined in kopete INSTALL:
+ on fedora/redhat this could be (from $KOPETE_SRC)
+ # ./configure --prefix=/usr/
+ # make
+ # make install
+7.1 if you want to install only meanwhile on an existing copy of kopete,
+ after the make, try make install in
+ $KOPETE_SRC/kopete/protocols/meanwhile
+
+8. enjoy*.
+
+* Hopefully i have fixed this, but when you try to add accounts and you
+donot find meanwhile listed, copy kopete/protocols/meanwhile/kopete_meanwhile.desktop
+to $KDE_DIR/share/services (/usr/share/services on fedora).
+* If you find the icons for meanwhile missing, overwrite Makefile in
+ kopete/protocols/meanwhile/icons with Makefile.siva
diff --git a/kopete/protocols/meanwhile/icons/Makefile.am b/kopete/protocols/meanwhile/icons/Makefile.am
new file mode 100644
index 00000000..9143c6b4
--- /dev/null
+++ b/kopete/protocols/meanwhile/icons/Makefile.am
@@ -0,0 +1,2 @@
+kopeteicondir = $(kde_datadir)/kopete/icons
+kopeteicon_ICON = AUTO
diff --git a/kopete/protocols/meanwhile/icons/cr128-app-meanwhile_protocol.png b/kopete/protocols/meanwhile/icons/cr128-app-meanwhile_protocol.png
new file mode 100644
index 00000000..93289326
--- /dev/null
+++ b/kopete/protocols/meanwhile/icons/cr128-app-meanwhile_protocol.png
Binary files differ
diff --git a/kopete/protocols/meanwhile/icons/cr16-action-meanwhile_away.png b/kopete/protocols/meanwhile/icons/cr16-action-meanwhile_away.png
new file mode 100644
index 00000000..9dc152db
--- /dev/null
+++ b/kopete/protocols/meanwhile/icons/cr16-action-meanwhile_away.png
Binary files differ
diff --git a/kopete/protocols/meanwhile/icons/cr16-action-meanwhile_dnd.png b/kopete/protocols/meanwhile/icons/cr16-action-meanwhile_dnd.png
new file mode 100644
index 00000000..df361d8d
--- /dev/null
+++ b/kopete/protocols/meanwhile/icons/cr16-action-meanwhile_dnd.png
Binary files differ
diff --git a/kopete/protocols/meanwhile/icons/cr16-action-meanwhile_idle.png b/kopete/protocols/meanwhile/icons/cr16-action-meanwhile_idle.png
new file mode 100644
index 00000000..4b97a931
--- /dev/null
+++ b/kopete/protocols/meanwhile/icons/cr16-action-meanwhile_idle.png
Binary files differ
diff --git a/kopete/protocols/meanwhile/icons/cr16-action-meanwhile_unknown.png b/kopete/protocols/meanwhile/icons/cr16-action-meanwhile_unknown.png
new file mode 100644
index 00000000..673c937a
--- /dev/null
+++ b/kopete/protocols/meanwhile/icons/cr16-action-meanwhile_unknown.png
Binary files differ
diff --git a/kopete/protocols/meanwhile/icons/cr16-app-meanwhile_protocol.png b/kopete/protocols/meanwhile/icons/cr16-app-meanwhile_protocol.png
new file mode 100644
index 00000000..69767ef3
--- /dev/null
+++ b/kopete/protocols/meanwhile/icons/cr16-app-meanwhile_protocol.png
Binary files differ
diff --git a/kopete/protocols/meanwhile/icons/cr22-app-meanwhile_protocol.png b/kopete/protocols/meanwhile/icons/cr22-app-meanwhile_protocol.png
new file mode 100644
index 00000000..87aec661
--- /dev/null
+++ b/kopete/protocols/meanwhile/icons/cr22-app-meanwhile_protocol.png
Binary files differ
diff --git a/kopete/protocols/meanwhile/icons/cr32-app-meanwhile_protocol.png b/kopete/protocols/meanwhile/icons/cr32-app-meanwhile_protocol.png
new file mode 100644
index 00000000..72cf82ab
--- /dev/null
+++ b/kopete/protocols/meanwhile/icons/cr32-app-meanwhile_protocol.png
Binary files differ
diff --git a/kopete/protocols/meanwhile/icons/cr48-app-meanwhile_protocol.png b/kopete/protocols/meanwhile/icons/cr48-app-meanwhile_protocol.png
new file mode 100644
index 00000000..49c08f76
--- /dev/null
+++ b/kopete/protocols/meanwhile/icons/cr48-app-meanwhile_protocol.png
Binary files differ
diff --git a/kopete/protocols/meanwhile/icons/cr64-app-meanwhile_protocol.png b/kopete/protocols/meanwhile/icons/cr64-app-meanwhile_protocol.png
new file mode 100644
index 00000000..f4b008e7
--- /dev/null
+++ b/kopete/protocols/meanwhile/icons/cr64-app-meanwhile_protocol.png
Binary files differ
diff --git a/kopete/protocols/meanwhile/icons/crsc-app-meanwhile_protocol.svgz b/kopete/protocols/meanwhile/icons/crsc-app-meanwhile_protocol.svgz
new file mode 100644
index 00000000..55e6ef45
--- /dev/null
+++ b/kopete/protocols/meanwhile/icons/crsc-app-meanwhile_protocol.svgz
Binary files differ
diff --git a/kopete/protocols/meanwhile/kopete_meanwhile.desktop b/kopete/protocols/meanwhile/kopete_meanwhile.desktop
new file mode 100644
index 00000000..80aa6383
--- /dev/null
+++ b/kopete/protocols/meanwhile/kopete_meanwhile.desktop
@@ -0,0 +1,58 @@
+[Desktop Entry]
+Type=Service
+X-Kopete-Version=1000900
+Icon=meanwhile_protocol
+ServiceTypes=Kopete/Protocol
+X-KDE-Library=kopete_meanwhile
+X-Kopete-Messaging-Protocol=messaging/meanwhile
+X-KDE-PluginInfo-Author=Jeremy Kerr
+X-KDE-PluginInfo-Email=jk@ozlabs.org
+X-KDE-PluginInfo-Name=kopete_meanwhile
+X-KDE-PluginInfo-Version=0.0.1
+X-KDE-PluginInfo-Website=http://kopete.kde.org
+X-KDE-PluginInfo-Category=Protocols
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=false
+Name=Meanwhile
+Name[is]=Á meðan
+Name[mk]=Во меѓувреме
+Name[nb]=Imens
+Name[ne]=उक्त अवधि
+Name[sk]=Medzitým
+Name[ta]=இடைப்பட்ட பொழுதில்
+Comment=Meanwhile (Lotus Sametime) Protocol
+Comment[bg]=Протокол с Meanwhile (Lotus Sametime)
+Comment[ca]=Protocol Meanwhile (Lotus Sametime)
+Comment[cs]=Meanwhile (Lotus Sametime) protokol
+Comment[da]=Meanwhile-protokol (Lotus Sametime)
+Comment[de]=Meanwhile-Protokoll (Lotus Sametime)
+Comment[el]=Πρωτόκολλο Meanwhile (Lotus Sametime)
+Comment[es]=Protocolo Meanwhile (Lotus Sametime)
+Comment[et]=Meanwhile (Lotus Sametime) protokoll
+Comment[fa]=قرارداد Meanwhile‌ (گاهی لوتوس)
+Comment[fr]=Protocole Meanwhile (Lotus Sametime)
+Comment[he]=פרוטוקול Meanwhile
+Comment[hu]=Protokoll a Meanwhile (Lotus Sametime) használatához
+Comment[is]="Meanwhile" (Lotus Sametimr) samskipturegla
+Comment[it]=Protocollo Meanwhile (Lotus Sametime)
+Comment[ja]=Meanwhile (Lotus Sametime) プロトコル
+Comment[km]=ពីធីការ Meanwhile (Lotus Sametime)
+Comment[lt]=Meanwhile (Lotus Sametime) protokolas
+Comment[nb]=Programtillegg for Meanwhile-protokoll (Lotus Sametime)
+Comment[nds]=Meanwhile-Protokoll (Lotus Sametime)
+Comment[ne]=उक्त समयको (उही समयको लोटस) प्रोटोकल
+Comment[nl]=Procotol voor Meanwhile (Lotus Sametime)
+Comment[pl]=Protokół Meanwhile (Lotus Sametime)
+Comment[pt]=Protocolo Meanwhile (Lotus Sametime)
+Comment[pt_BR]=Protocolo Meanwhile (Lotus Sametime)
+Comment[ru]=Протокол Meanwhile (Lotus Sametime)
+Comment[sk]=Meanwhile (Lotus Sametime) Protokol
+Comment[sl]=Protokol Meanwhile (Lotus Sametime)
+Comment[sr]=Протокол Meanwhile (Lotus Sametime)
+Comment[sr@Latn]=Protokol Meanwhile (Lotus Sametime)
+Comment[sv]=Meanwhile-protokoll (Lotus Sametime)
+Comment[tr]=Meanwhile Protokolü
+Comment[uk]=Протокол Meanwhile (Lotus Sametime)
+Comment[zh_CN]=Meanwhile (Lotus Sametime) 协议
+Comment[zh_TW]=Meanwhile (Lotus Sametime)協定外掛程式
diff --git a/kopete/protocols/meanwhile/meanwhileaccount.cpp b/kopete/protocols/meanwhile/meanwhileaccount.cpp
new file mode 100644
index 00000000..c130475b
--- /dev/null
+++ b/kopete/protocols/meanwhile/meanwhileaccount.cpp
@@ -0,0 +1,274 @@
+/*
+ meanwhileaccount.cpp - a meanwhile account
+
+ Copyright (c) 2003-2004 by Sivaram Gottimukkala <suppandi@gmail.com>
+ Copyright (c) 2005 by Jeremy Kerr <jk@ozlabs.org>
+
+ Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.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 <signal.h>
+#include "meanwhileprotocol.h"
+#include "meanwhileplugin.h"
+#include "meanwhileaccount.h"
+#include "meanwhilecontact.h"
+#include "meanwhilesession.h"
+#include "kopetechatsession.h"
+#include "kopetecontactlist.h"
+#include "kopetepassword.h"
+
+#include <kaction.h>
+#include <kpopupmenu.h>
+#include <klocale.h>
+#include <kconfigbase.h>
+#include "kopeteaway.h"
+#include <kinputdialog.h>
+#include <kmessagebox.h>
+#include <qdict.h>
+
+MeanwhileAccount::MeanwhileAccount(
+ MeanwhileProtocol *parent,
+ const QString &accountID,
+ const char *name)
+ : Kopete::PasswordedAccount(parent, accountID, 0, name)
+{
+ HERE;
+ m_meanwhileId = accountID;
+ m_session = 0L;
+ setMyself(new MeanwhileContact(m_meanwhileId, m_meanwhileId, this,
+ Kopete::ContactList::self()->myself()));
+ setOnlineStatus(parent->statusOffline);
+ infoPlugin = new MeanwhilePlugin();
+}
+
+MeanwhileAccount::~MeanwhileAccount()
+{
+ if (m_session)
+ delete m_session;
+}
+
+void MeanwhileAccount::setPlugin(MeanwhilePlugin *plugin)
+{
+ delete infoPlugin;
+ infoPlugin = plugin;
+}
+
+bool MeanwhileAccount::createContact(
+ const QString & contactId ,
+ Kopete::MetaContact * parentContact)
+{
+ MeanwhileContact* newContact = new MeanwhileContact(contactId,
+ parentContact->displayName(), this, parentContact);
+
+ MeanwhileProtocol *p = static_cast<MeanwhileProtocol *>(protocol());
+
+ if ((newContact != 0L) && (m_session != 0L)
+ && (myself()->onlineStatus() !=
+ p->statusOffline))
+ m_session->addContact(newContact);
+
+ return newContact != 0L;
+}
+
+void MeanwhileAccount::connectWithPassword(const QString &password)
+{
+ if (password.isEmpty()) {
+ disconnect(Kopete::Account::Manual);
+ return;
+ }
+
+ if (m_session == 0L) {
+ m_session = new MeanwhileSession(this);
+ if (m_session == 0L) {
+ mwDebug() << "session creation failed" << endl;
+ return;
+ }
+
+ QObject::connect(m_session,
+ SIGNAL(sessionStateChange(Kopete::OnlineStatus)),
+ this, SLOT(slotSessionStateChange(Kopete::OnlineStatus)));
+ QObject::connect(m_session,
+ SIGNAL(serverNotification(const QString &)),
+ this, SLOT(slotServerNotification(const QString&)));
+
+ }
+
+ if (m_session == 0L) {
+ mwDebug() << "No memory for session" << endl;
+ return;
+ }
+
+ if (!m_session->isConnected() && !m_session->isConnecting())
+ m_session->connect(password);
+
+ m_session->setStatus(initialStatus());
+}
+
+void MeanwhileAccount::disconnect()
+{
+ disconnect(Manual);
+}
+
+void MeanwhileAccount::disconnect(Kopete::Account::DisconnectReason reason)
+{
+ if (m_session == 0L)
+ return;
+
+ MeanwhileProtocol *p = static_cast<MeanwhileProtocol *>(protocol());
+ setAllContactsStatus(p->statusOffline);
+ disconnected(reason);
+ emit isConnectedChanged();
+
+ delete m_session;
+ m_session = 0L;
+}
+
+KActionMenu * MeanwhileAccount::actionMenu()
+{
+ KActionMenu *menu = Kopete::Account::actionMenu();
+
+ menu->popupMenu()->insertSeparator();
+
+#if 0
+ menu->insert(new KAction(i18n("&Change Status Message"), QString::null, 0,
+ this, SLOT(meanwhileChangeStatus()), this,
+ "meanwhileChangeStatus"));
+ //infoPlugin->addCustomMenus(theMenu);
+#endif
+ return menu;
+}
+
+QString MeanwhileAccount::getServerName()
+{
+ return configGroup()->readEntry("Server");
+}
+
+int MeanwhileAccount::getServerPort()
+{
+ return configGroup()->readNumEntry("Port");
+}
+
+void MeanwhileAccount::setServerName(const QString &server)
+{
+ configGroup()->writeEntry("Server", server);
+}
+
+void MeanwhileAccount::setServerPort(int port)
+{
+ configGroup()->writeEntry("Port", port);
+}
+
+void MeanwhileAccount::setClientID(int client, int major, int minor)
+{
+ configGroup()->writeEntry("clientID", client);
+ configGroup()->writeEntry("clientVersionMajor", major);
+ configGroup()->writeEntry("clientVersionMinor", minor);
+}
+
+void MeanwhileAccount::resetClientID()
+{
+ configGroup()->deleteEntry("clientID");
+ configGroup()->deleteEntry("clientVersionMajor");
+ configGroup()->deleteEntry("clientVersionMinor");
+}
+
+bool MeanwhileAccount::getClientIDParams(int *clientID,
+ int *verMajor, int *verMinor)
+{
+ bool custom_id = configGroup()->hasKey("clientID");
+
+ MeanwhileSession::getDefaultClientIDParams(clientID, verMajor, verMinor);
+
+ if (custom_id) {
+ *clientID = configGroup()->readUnsignedNumEntry("clientID", *clientID);
+ *verMajor = configGroup()->readUnsignedNumEntry("clientVersionMajor",
+ *verMinor);
+ *verMinor = configGroup()->readUnsignedNumEntry("clientVersionMinor",
+ *verMinor);
+ }
+
+ return custom_id;
+}
+
+void MeanwhileAccount::slotServerNotification(const QString &mesg)
+{
+ KMessageBox::queuedMessageBox(0, KMessageBox::Error , mesg,
+ i18n("Meanwhile Plugin: Message from server"), KMessageBox::Notify);
+}
+
+QString MeanwhileAccount::meanwhileId() const
+{
+ return m_meanwhileId;
+}
+
+void MeanwhileAccount::setAway(bool away, const QString &reason)
+{
+ MeanwhileProtocol *p = static_cast<MeanwhileProtocol *>(protocol());
+ setOnlineStatus(away ? p->statusIdle : p->statusOnline, reason);
+}
+
+void MeanwhileAccount::setOnlineStatus(const Kopete::OnlineStatus &status,
+ const QString &reason)
+{
+ HERE;
+ Kopete::OnlineStatus oldstatus = myself()->onlineStatus();
+
+ mwDebug() << "From: " << oldstatus.description() << "(" <<
+ oldstatus.internalStatus() << "):" << oldstatus.isDefinitelyOnline()
+ << endl;
+ mwDebug() << "To: " << status.description() << "(" <<
+ status.internalStatus() << "):" << status.isDefinitelyOnline() << endl;
+
+ if (oldstatus == status)
+ return;
+
+ if (!oldstatus.isDefinitelyOnline() && status.isDefinitelyOnline()) {
+ connect();
+
+ } else if (oldstatus.isDefinitelyOnline() && !status.isDefinitelyOnline()) {
+ disconnect(Kopete::Account::Manual);
+
+ } else if (m_session)
+ /* todo: check session state? */
+ m_session->setStatus(status, reason);
+
+ else
+ mwDebug() << "Trying to set status, but no session exists" << endl;
+
+ /* we should set this on the callback below */
+ //myself()->setOnlineStatus(status);
+}
+
+void MeanwhileAccount::syncContactsToServer()
+{
+ if (m_session != 0L)
+ m_session->syncContactsToServer();
+}
+
+void MeanwhileAccount::slotSessionStateChange(Kopete::OnlineStatus status)
+{
+ HERE;
+ Kopete::OnlineStatus oldstatus = myself()->onlineStatus();
+ myself()->setOnlineStatus(status);
+
+ if (status.isDefinitelyOnline() != oldstatus.isDefinitelyOnline()) {
+ if (status.isDefinitelyOnline())
+ m_session->addContacts(contacts());
+ emit isConnectedChanged();
+ }
+}
+
+MeanwhileSession *MeanwhileAccount::session()
+{
+ return m_session;
+}
+
+#include "meanwhileaccount.moc"
diff --git a/kopete/protocols/meanwhile/meanwhileaccount.h b/kopete/protocols/meanwhile/meanwhileaccount.h
new file mode 100644
index 00000000..d08b07c5
--- /dev/null
+++ b/kopete/protocols/meanwhile/meanwhileaccount.h
@@ -0,0 +1,121 @@
+/*
+ meanwhileaccount.h - meanwhile account
+
+ Copyright (c) 2003-2004 by Sivaram Gottimukkala <suppandi@gmail.com>
+ Copyright (c) 2005 by Jeremy Kerr <jk@ozlabs.org>
+
+ Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.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 MEANWHILEACCOUNT_H
+#define MEANWHILEACCOUNT_H
+
+#include <kopetepasswordedaccount.h>
+#include "meanwhileprotocol.h"
+#include "meanwhileplugin.h"
+
+class MeanwhileSession;
+
+/**
+ * A class to handle a single Meanwhile Account.
+ */
+class MeanwhileAccount : public Kopete::PasswordedAccount
+{
+ Q_OBJECT
+public:
+ /**
+ * Create a new Meanwhile account
+ * @param protocol The MeanwhileProtocol that this acccount is for
+ * @param accountID The (meanwhile) account id of this account
+ * @param name The name of this account
+ */
+ MeanwhileAccount(MeanwhileProtocol *protocol, const QString &accountID,
+ const char *name = 0L);
+
+ ~MeanwhileAccount();
+
+ virtual bool createContact(const QString &contactId,
+ Kopete::MetaContact *parentContact);
+
+ virtual void connectWithPassword(const QString &password);
+
+ virtual void disconnect();
+
+ virtual void disconnect(Kopete::Account::DisconnectReason reason);
+
+ virtual KActionMenu *actionMenu();
+
+ /** Get the server host name */
+ QString getServerName();
+ /** Get the server port */
+ int getServerPort();
+ /** Set the server host name */
+ void setServerName(const QString &server);
+ /** Set the server port */
+ void setServerPort(int port);
+ /** Provide an information plugin for this account */
+ void setPlugin(MeanwhilePlugin *plugin);
+
+ /** Set the client identification parameters for the sametime connection */
+ void setClientID(int client, int major, int minor);
+
+ /* returns true if custom IDs are in use, and populates the args */
+ bool getClientIDParams(int *clientID, int *verMajor, int *verMinor);
+
+ /** Reset client identification parameters to their defaults */
+ void resetClientID();
+
+ MeanwhilePlugin *infoPlugin;
+
+ /**
+ * Save the current contact list to the server
+ */
+ void syncContactsToServer();
+
+ /**
+ * Get a reference to the meanwhile session object, if one exists
+ */
+ MeanwhileSession *session();
+
+ /**
+ * Get the meanwhile id for this account
+ * @return The meanwhile ID for the account
+ */
+ QString meanwhileId() const;
+
+public slots:
+ /**
+ * Called by the session to notify that the state has changed
+ */
+ void slotSessionStateChange(Kopete::OnlineStatus status);
+
+ /**
+ * Called by the session when a notification message has been received
+ */
+ void slotServerNotification(const QString &mesg);
+
+ /** Reimplemented from Kopete::Account */
+ void setOnlineStatus(const Kopete::OnlineStatus& status,
+ const QString &reason = QString::null);
+ void setAway(bool away, const QString&reason = QString::null);
+
+private:
+ /** Current online status */
+ Kopete::OnlineStatus status;
+
+ /** A meanwhile session */
+ MeanwhileSession *m_session;
+
+ /* The user id for this account */
+ QString m_meanwhileId;
+};
+
+#endif
diff --git a/kopete/protocols/meanwhile/meanwhileaddcontactpage.cpp b/kopete/protocols/meanwhile/meanwhileaddcontactpage.cpp
new file mode 100644
index 00000000..8709700b
--- /dev/null
+++ b/kopete/protocols/meanwhile/meanwhileaddcontactpage.cpp
@@ -0,0 +1,74 @@
+/*
+ meanwhileaddcontactpage.cpp - add a contact
+
+ Copyright (c) 2003-2004 by Sivaram Gottimukkala <suppandi@gmail.com>
+
+ Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.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 "meanwhileaddcontactpage.h"
+#include <qpushbutton.h>
+#include <qlayout.h>
+#include <kopeteaccount.h>
+#include <kopetemetacontact.h>
+#include <qlineedit.h>
+
+#include "meanwhileprotocol.h"
+#include "meanwhileaccount.h"
+#include "meanwhileplugin.h"
+
+MeanwhileAddContactPage::MeanwhileAddContactPage(
+ QWidget* parent,
+ Kopete::Account *_account)
+ : AddContactPage(parent, 0L), theAccount(_account),
+ theParent(parent)
+{
+ ( new QVBoxLayout( this ) )->setAutoAdd( true );
+ theDialog = new MeanwhileAddContactBase(this);
+ MeanwhileAccount *account =
+ static_cast<MeanwhileAccount *>(_account);
+ if (account->infoPlugin->canProvideMeanwhileId())
+ {
+ QObject::connect(theDialog->btnFindUser, SIGNAL(clicked()),
+ SLOT(slotFindUser()));
+ }
+ else
+ theDialog->btnFindUser->setDisabled(true);
+ theDialog->show();
+}
+
+MeanwhileAddContactPage::~MeanwhileAddContactPage()
+{
+}
+
+void MeanwhileAddContactPage::slotFindUser()
+{
+ MeanwhileAccount *account =
+ static_cast<MeanwhileAccount *>(theAccount);
+ account->infoPlugin->getMeanwhileId(theParent,
+ theDialog->contactID);
+}
+
+bool MeanwhileAddContactPage::apply(
+ Kopete::Account* a,
+ Kopete::MetaContact* m )
+{
+ QString displayName = theDialog->contactID->text();
+ MeanwhileAccount* myAccount = static_cast<MeanwhileAccount*>(a);
+ return myAccount->addContact(displayName, m, Kopete::Account::ChangeKABC );
+}
+
+bool MeanwhileAddContactPage::validateData()
+{
+ return ! theDialog->contactID->text().isEmpty();
+}
+
+#include "meanwhileaddcontactpage.moc"
diff --git a/kopete/protocols/meanwhile/meanwhileaddcontactpage.h b/kopete/protocols/meanwhile/meanwhileaddcontactpage.h
new file mode 100644
index 00000000..889b2707
--- /dev/null
+++ b/kopete/protocols/meanwhile/meanwhileaddcontactpage.h
@@ -0,0 +1,45 @@
+/*
+ meanwhileaddcontactpage.h - add a contact
+
+ Copyright (c) 2003-2004 by Sivaram Gottimukkala <suppandi@gmail.com>
+
+ Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.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 MEANWHILEADDCONTACTPAGE_H
+#define MEANWHILEADDCONTACTPAGE_H
+
+#include <addcontactpage.h>
+#include "meanwhileaddcontactbase.h"
+
+namespace Kopete { class Account; }
+namespace Kopete { class MetaContact; }
+
+class MeanwhileAddContactPage : public AddContactPage
+{
+ Q_OBJECT
+public:
+ MeanwhileAddContactPage( QWidget* parent = 0,
+ Kopete::Account *account=0);
+ ~MeanwhileAddContactPage();
+
+ virtual bool apply(Kopete::Account* a, Kopete::MetaContact* m);
+ virtual bool validateData();
+
+protected:
+ MeanwhileAddContactBase *theDialog;
+ Kopete::Account *theAccount;
+ QWidget *theParent;
+public slots:
+ void slotFindUser();
+};
+
+#endif
diff --git a/kopete/protocols/meanwhile/meanwhilecontact.cpp b/kopete/protocols/meanwhile/meanwhilecontact.cpp
new file mode 100644
index 00000000..fd30bc46
--- /dev/null
+++ b/kopete/protocols/meanwhile/meanwhilecontact.cpp
@@ -0,0 +1,132 @@
+/*
+ meanwhilecontact.cpp - a meanwhile contact
+
+ Copyright (c) 2003-2004 by Sivaram Gottimukkala <suppandi@gmail.com>
+
+ Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.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 <kaction.h>
+#include <kdebug.h>
+#include <klocale.h>
+
+#include "kopeteaccount.h"
+#include "kopetechatsessionmanager.h"
+#include "kopetemetacontact.h"
+
+#include "meanwhileprotocol.h"
+#include "meanwhilesession.h"
+#include "meanwhileaccount.h"
+#include "meanwhilecontact.h"
+#include "meanwhileplugin.h"
+
+MeanwhileContact::MeanwhileContact(QString userId, QString nickname,
+ MeanwhileAccount *account, Kopete::MetaContact *parent)
+ : Kopete::Contact(account, userId, parent)
+{
+ setNickName(nickname);
+ m_msgManager = 0L;
+ m_meanwhileId = userId;
+ setOnlineStatus(static_cast<MeanwhileProtocol *>(account->protocol())
+ ->statusOffline);
+}
+
+MeanwhileContact::~MeanwhileContact()
+{
+}
+
+bool MeanwhileContact::isReachable()
+{
+ return isOnline();
+}
+
+void MeanwhileContact::serialize(QMap<QString, QString> &serializedData,
+ QMap<QString, QString> &addressBookData)
+{
+ Kopete::Contact::serialize(serializedData, addressBookData);
+}
+
+void MeanwhileContact::showContactSettings()
+{
+}
+
+void MeanwhileContact::slotUserInfo()
+{
+ MeanwhileAccount *theAccount = static_cast<MeanwhileAccount *>( account());
+ theAccount->infoPlugin->showUserInfo(m_meanwhileId);
+}
+
+Kopete::ChatSession* MeanwhileContact::manager(CanCreateFlags canCreate)
+{
+ if (m_msgManager != 0L || canCreate == Kopete::Contact::CannotCreate)
+ return m_msgManager;
+
+ QPtrList<Kopete::Contact> contacts;
+ contacts.append(this);
+ m_msgManager = Kopete::ChatSessionManager::self()->
+ create(account()->myself(), contacts, protocol());
+
+ connect(m_msgManager,
+ SIGNAL(messageSent(Kopete::Message&, Kopete::ChatSession*)),
+ this, SLOT(sendMessage(Kopete::Message&)));
+
+ connect(m_msgManager, SIGNAL(myselfTyping(bool)),
+ this, SLOT(slotSendTyping(bool)));
+
+ connect(m_msgManager, SIGNAL(destroyed()),
+ this, SLOT(slotChatSessionDestroyed()));
+
+ return m_msgManager;
+}
+
+QString MeanwhileContact::meanwhileId() const
+{
+ return m_meanwhileId;
+}
+
+void MeanwhileContact::sendMessage(Kopete::Message &message)
+{
+ static_cast<MeanwhileAccount *>(account())->session()->sendMessage(message);
+}
+
+void MeanwhileContact::slotSendTyping(bool isTyping)
+{
+ static_cast<MeanwhileAccount *>(account())->session()->
+ sendTyping(this, isTyping);
+}
+
+void MeanwhileContact::receivedMessage(const QString &message)
+{
+ Kopete::ContactPtrList contactList;
+ contactList.append(account()->myself());
+ Kopete::Message kmessage(this, contactList, message,
+ Kopete::Message::Inbound);
+
+ manager(Kopete::Contact::CanCreate)->appendMessage(kmessage);
+}
+
+void MeanwhileContact::sync(unsigned int changed)
+{
+ if (changed)
+ static_cast<MeanwhileAccount *>(account())->syncContactsToServer();
+}
+
+void MeanwhileContact::slotChatSessionDestroyed()
+{
+ m_msgManager->deref();
+ m_msgManager = 0L;
+}
+
+#include "meanwhilecontact.moc"
+
+// vim: set noet ts=4 sts=4 sw=4:
+
diff --git a/kopete/protocols/meanwhile/meanwhilecontact.h b/kopete/protocols/meanwhile/meanwhilecontact.h
new file mode 100644
index 00000000..eface094
--- /dev/null
+++ b/kopete/protocols/meanwhile/meanwhilecontact.h
@@ -0,0 +1,68 @@
+/*
+ meanwhilecontact.h - a contact
+
+ Copyright (c) 2003-2004 by Sivaram Gottimukkala <suppandi@gmail.com>
+
+ Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.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 MEANWHILECONTACT_H
+#define MEANWHILECONTACT_H
+
+#include <qmap.h>
+#include "kopetecontact.h"
+#include "kopetemessage.h"
+#include "meanwhileaccount.h"
+
+class KAction;
+class KActionCollection;
+namespace Kopete { class Account; }
+namespace Kopete { class ChatSession; }
+namespace Kopete { class MetaContact; }
+
+class MeanwhileContact : public Kopete::Contact
+{
+ Q_OBJECT
+public:
+
+ MeanwhileContact(QString userId, QString nickname,
+ MeanwhileAccount *account, Kopete::MetaContact *parent);
+ ~MeanwhileContact();
+
+ virtual bool isReachable();
+
+ virtual void serialize(QMap<QString, QString> &serializedData,
+ QMap<QString, QString> &addressBookData);
+
+ virtual Kopete::ChatSession *manager(
+ CanCreateFlags canCreate = CanCreate);
+
+ QString meanwhileId() const;
+
+ virtual void sync(unsigned int changed = 0xff);
+
+public slots:
+
+ void sendMessage( Kopete::Message &message );
+ void receivedMessage( const QString &message );
+ virtual void slotUserInfo();
+
+protected slots:
+ void showContactSettings();
+ void slotChatSessionDestroyed();
+ void slotSendTyping(bool isTyping);
+
+private:
+ QString m_meanwhileId;
+ Kopete::ChatSession *m_msgManager;
+};
+
+#endif
diff --git a/kopete/protocols/meanwhile/meanwhileeditaccountwidget.cpp b/kopete/protocols/meanwhile/meanwhileeditaccountwidget.cpp
new file mode 100644
index 00000000..f3d05710
--- /dev/null
+++ b/kopete/protocols/meanwhile/meanwhileeditaccountwidget.cpp
@@ -0,0 +1,194 @@
+/*
+ meanwhileeditaccountwidget.cpp - edit an account
+
+ Copyright (c) 2003-2004 by Sivaram Gottimukkala <suppandi@gmail.com>
+
+ Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.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 <qlayout.h>
+#include <qlineedit.h>
+#include <qcheckbox.h>
+#include <qpushbutton.h>
+#include <qspinbox.h>
+#include <qcombobox.h>
+#include <kdebug.h>
+#include <kopeteaccount.h>
+#include <kopetepasswordwidget.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include "meanwhileprotocol.h"
+#include "meanwhileaccount.h"
+#include "meanwhileeditaccountwidget.h"
+#include "meanwhilesession.h"
+
+#define DEFAULT_SERVER "messaging.opensource.ibm.com"
+#define DEFAULT_PORT 1533
+
+void MeanwhileEditAccountWidget::setupClientList()
+{
+ const struct MeanwhileClientID *id;
+ int i = 0;
+
+ for (id = MeanwhileSession::getClientIDs(); id->name; id++, i++) {
+ QString name = QString("%1 (0x%2)")
+ .arg(QString(id->name))
+ .arg(id->id, 0, 16);
+
+ mClientID->insertItem(name, i);
+
+ if (id->id == mwLogin_MEANWHILE)
+ mClientID->setCurrentItem(i);
+ }
+}
+
+void MeanwhileEditAccountWidget::selectClientListItem(int selectedID)
+{
+ const struct MeanwhileClientID *id;
+ int i = 0;
+
+ for (id = MeanwhileSession::getClientIDs(); id->name; id++, i++) {
+ if (id->id == selectedID) {
+ mClientID->setCurrentItem(i);
+ break;
+ }
+ }
+}
+
+MeanwhileEditAccountWidget::MeanwhileEditAccountWidget(
+ QWidget* parent,
+ Kopete::Account* theAccount,
+ MeanwhileProtocol *theProtocol)
+ : MeanwhileEditAccountBase(parent),
+ KopeteEditAccountWidget( theAccount )
+{
+ protocol = theProtocol;
+
+ /* setup client identifier combo box */
+ setupClientList();
+
+ if (account())
+ {
+ int clientID, verMajor, verMinor;
+ bool useCustomID;
+
+ mScreenName->setText(account()->accountId());
+ mScreenName->setReadOnly(true);
+ mScreenName->setDisabled(true);
+ mPasswordWidget->load(&static_cast<MeanwhileAccount*>(account())->password());
+ mAutoConnect->setChecked(account()->excludeConnect());
+
+ MeanwhileAccount *myAccount = static_cast<MeanwhileAccount *>(account());
+ useCustomID = myAccount->getClientIDParams(&clientID,
+ &verMajor, &verMinor);
+
+ mServerName->setText(myAccount->getServerName());
+ mServerPort->setValue(myAccount->getServerPort());
+
+ if (useCustomID) {
+ selectClientListItem(clientID);
+ mClientVersionMajor->setValue(verMajor);
+ mClientVersionMinor->setValue(verMinor);
+ chkCustomClientID->setChecked(true);
+ }
+
+ }
+ else
+ {
+ slotSetServer2Default();
+ }
+
+ QObject::connect(btnServerDefaults, SIGNAL(clicked()),
+ SLOT(slotSetServer2Default()));
+
+ show();
+}
+
+MeanwhileEditAccountWidget::~MeanwhileEditAccountWidget()
+{
+}
+
+
+Kopete::Account* MeanwhileEditAccountWidget::apply()
+{
+ if(!account())
+ setAccount(new MeanwhileAccount(protocol, mScreenName->text()));
+
+ MeanwhileAccount *myAccount = static_cast<MeanwhileAccount *>(account());
+
+ myAccount->setExcludeConnect(mAutoConnect->isChecked());
+
+ mPasswordWidget->save(&static_cast<MeanwhileAccount*>(account())->password());
+
+ myAccount->setServerName(mServerName->text());
+ myAccount->setServerPort(mServerPort->value());
+
+ if (chkCustomClientID->isChecked()) {
+ const struct MeanwhileClientID *ids = MeanwhileSession::getClientIDs();
+ myAccount->setClientID(ids[mClientID->currentItem()].id,
+ mClientVersionMajor->value(),
+ mClientVersionMinor->value());
+ } else {
+ myAccount->resetClientID();
+ }
+
+ return myAccount;
+}
+
+bool MeanwhileEditAccountWidget::validateData()
+{
+ if(mScreenName->text().isEmpty())
+ {
+ KMessageBox::queuedMessageBox(this, KMessageBox::Sorry,
+ i18n("<qt>You must enter a valid screen name.</qt>"),
+ i18n("Meanwhile Plugin"));
+ return false;
+ }
+ if( !mPasswordWidget->validate() )
+ {
+ KMessageBox::queuedMessageBox(this, KMessageBox::Sorry,
+ i18n("<qt>You must deselect password remembering or enter a valid password.</qt>"),
+ i18n("Meanwhile Plugin"));
+ return false;
+ }
+ if (mServerName->text().isEmpty())
+ {
+ KMessageBox::queuedMessageBox(this, KMessageBox::Sorry,
+ i18n("<qt>You must enter the server's hostname/ip address.</qt>"),
+ i18n("Meanwhile Plugin"));
+ return false;
+ }
+ if (mServerPort->text() == 0)
+ {
+ KMessageBox::queuedMessageBox(this, KMessageBox::Sorry,
+ i18n("<qt>0 is not a valid port number.</qt>"),
+ i18n("Meanwhile Plugin"));
+ return false;
+ }
+ return true;
+}
+
+void MeanwhileEditAccountWidget::slotSetServer2Default()
+{
+ int clientID, verMajor, verMinor;
+
+ MeanwhileSession::getDefaultClientIDParams(&clientID,
+ &verMajor, &verMinor);
+
+ mServerName->setText(DEFAULT_SERVER);
+ mServerPort->setValue(DEFAULT_PORT);
+ chkCustomClientID->setChecked(false);
+ selectClientListItem(clientID);
+ mClientVersionMajor->setValue(verMajor);
+ mClientVersionMinor->setValue(verMinor);
+}
+
+#include "meanwhileeditaccountwidget.moc"
diff --git a/kopete/protocols/meanwhile/meanwhileeditaccountwidget.h b/kopete/protocols/meanwhile/meanwhileeditaccountwidget.h
new file mode 100644
index 00000000..9e05465b
--- /dev/null
+++ b/kopete/protocols/meanwhile/meanwhileeditaccountwidget.h
@@ -0,0 +1,51 @@
+/*
+ meanwhileeditaccountwidget.h - edit an account
+
+ Copyright (c) 2003-2004 by Sivaram Gottimukkala <suppandi@gmail.com>
+
+ Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.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 MEANWHILEEDITACCOUNTWIDGET_H
+#define MEANWHILEEDITACCOUNTWIDGET_H
+
+#include <qwidget.h>
+#include <editaccountwidget.h>
+#include "meanwhileeditaccountbase.h"
+
+class QVBoxLayout;
+namespace Kopete { class Account; }
+
+class MeanwhileEditAccountWidget :
+ public MeanwhileEditAccountBase,
+ public KopeteEditAccountWidget
+{
+Q_OBJECT
+public:
+ MeanwhileEditAccountWidget( QWidget* parent,
+ Kopete::Account* account,
+ MeanwhileProtocol *protocol);
+
+ ~MeanwhileEditAccountWidget();
+
+ virtual Kopete::Account* apply();
+
+ virtual bool validateData();
+protected slots:
+ void slotSetServer2Default();
+protected:
+ MeanwhileProtocol *protocol;
+private:
+ void setupClientList();
+ void selectClientListItem(int selectedID);
+};
+
+#endif
diff --git a/kopete/protocols/meanwhile/meanwhileplugin.cpp b/kopete/protocols/meanwhile/meanwhileplugin.cpp
new file mode 100644
index 00000000..d8f617cb
--- /dev/null
+++ b/kopete/protocols/meanwhile/meanwhileplugin.cpp
@@ -0,0 +1,37 @@
+/*
+ meanwhileplugin.cpp - a plugin to provide more functions
+
+ Copyright (c) 2003-2004 by Sivaram Gottimukkala <suppandi@gmail.com>
+
+ Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.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 <qwidget.h>
+#include <qlineedit.h>
+#include "meanwhileplugin.h"
+
+void MeanwhilePlugin::getMeanwhileId(QWidget * /*parent*/,
+ QLineEdit * /*fillThis*/)
+{
+}
+
+bool MeanwhilePlugin::canProvideMeanwhileId()
+{
+ return false;
+}
+
+void MeanwhilePlugin::showUserInfo(const QString &/*userid*/)
+{
+}
+
+void MeanwhilePlugin::addCustomMenus(KActionMenu *menu)
+{
+}
diff --git a/kopete/protocols/meanwhile/meanwhileplugin.h b/kopete/protocols/meanwhile/meanwhileplugin.h
new file mode 100644
index 00000000..b2ddbdcb
--- /dev/null
+++ b/kopete/protocols/meanwhile/meanwhileplugin.h
@@ -0,0 +1,47 @@
+/*
+ meanwhileplugin.h - provide helpers for meanwhile from an external plugin
+
+ Copyright (c) 2003-2004 by Sivaram Gottimukkala <suppandi@gmail.com>
+
+ Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.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 __MEANWHILE_PLUGIN_H__
+#define __MEANWHILE_PLUGIN_H__
+
+#include "qstring.h"
+#include <kaction.h>
+
+class QLineEdit;
+
+class MeanwhilePlugin
+{
+public:
+ /* do something when the find button on add contact is hit
+ * - like do lookups in company databases
+ * when done fill 'fillThis' with the id of the contact
+ */
+ virtual void getMeanwhileId(QWidget *parent,QLineEdit *fillThis);
+ /* can this plugin provide the above functionality */
+ virtual bool canProvideMeanwhileId();
+
+ /* show user info has been selected - the meanwhile server doesnt
+ * seem to have any info...maybe you can find it somewhere else
+ */
+ virtual void showUserInfo(const QString &userid);
+
+ /* if you want to provide more functions on the rightclick dropdown
+ * menu...implement this
+ */
+ virtual void addCustomMenus(KActionMenu *menu);
+};
+
+#endif
diff --git a/kopete/protocols/meanwhile/meanwhileprotocol.cpp b/kopete/protocols/meanwhile/meanwhileprotocol.cpp
new file mode 100644
index 00000000..434de2f3
--- /dev/null
+++ b/kopete/protocols/meanwhile/meanwhileprotocol.cpp
@@ -0,0 +1,126 @@
+/*
+ meanwhileprotocol.cpp - the meanwhile protocol
+
+ Copyright (c) 2003-2004 by Sivaram Gottimukkala <suppandi@gmail.com>
+
+ Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.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 "meanwhileprotocol.h"
+#include "meanwhileaddcontactpage.h"
+#include "meanwhileeditaccountwidget.h"
+#include "meanwhileaccount.h"
+#include <kgenericfactory.h>
+#include "kopeteaccountmanager.h"
+#include "kopeteglobal.h"
+#include "kopeteonlinestatusmanager.h"
+
+#include "mw_common.h"
+
+typedef KGenericFactory<MeanwhileProtocol> MeanwhileProtocolFactory;
+K_EXPORT_COMPONENT_FACTORY(kopete_meanwhile,
+ MeanwhileProtocolFactory("kopete_meanwhile"))
+
+MeanwhileProtocol::MeanwhileProtocol(QObject* parent, const char *name,
+ const QStringList &/*args*/)
+: Kopete::Protocol(MeanwhileProtocolFactory::instance(), parent, name),
+
+ statusOffline(Kopete::OnlineStatus::Offline, 25, this, 0, QString::null,
+ i18n("Offline"), i18n("Offline"),
+ Kopete::OnlineStatusManager::Offline,
+ Kopete::OnlineStatusManager::DisabledIfOffline),
+
+ statusOnline(Kopete::OnlineStatus::Online, 25, this, mwStatus_ACTIVE,
+ QString::null, i18n("Online"), i18n("Online"),
+ Kopete::OnlineStatusManager::Online, 0),
+
+ statusAway(Kopete::OnlineStatus::Away, 20, this, mwStatus_AWAY,
+ "meanwhile_away", i18n("Away"), i18n("Away"),
+ Kopete::OnlineStatusManager::Away,
+ Kopete::OnlineStatusManager::HasAwayMessage),
+
+ statusBusy(Kopete::OnlineStatus::Away, 25, this, mwStatus_BUSY,
+ "meanwhile_dnd", i18n("Busy"), i18n("Busy"),
+ Kopete::OnlineStatusManager::Busy,
+ Kopete::OnlineStatusManager::HasAwayMessage),
+
+ statusIdle(Kopete::OnlineStatus::Away, 30, this, mwStatus_AWAY,
+ "meanwhile_idle", i18n("Idle"), i18n("Idle"),
+ Kopete::OnlineStatusManager::Idle, 0),
+
+ statusAccountOffline(Kopete::OnlineStatus::Offline, 0, this, 0,
+ QString::null, i18n("Account Offline")),
+
+ statusMessage(QString::fromLatin1("statusMessage"),
+ i18n("Status Message"), QString::null, false, true),
+
+ awayMessage(Kopete::Global::Properties::self()->awayMessage())
+{
+ HERE;
+
+ addAddressBookField("messaging/meanwhile", Kopete::Plugin::MakeIndexField);
+}
+
+MeanwhileProtocol::~MeanwhileProtocol()
+{
+}
+
+AddContactPage * MeanwhileProtocol::createAddContactWidget(QWidget *parent,
+ Kopete::Account *account )
+{
+ return new MeanwhileAddContactPage(parent, account);
+}
+
+KopeteEditAccountWidget * MeanwhileProtocol::createEditAccountWidget(
+ Kopete::Account *account, QWidget *parent )
+{
+ return new MeanwhileEditAccountWidget(parent, account, this);
+}
+
+Kopete::Account *MeanwhileProtocol::createNewAccount(const QString &accountId)
+{
+ return new MeanwhileAccount(this, accountId, accountId.ascii());
+}
+
+Kopete::Contact *MeanwhileProtocol::deserializeContact(
+ Kopete::MetaContact *metaContact,
+ const QMap<QString,
+ QString> &serializedData,
+ const QMap<QString, QString> & /* addressBookData */ )
+{
+ QString contactId = serializedData[ "contactId" ];
+ QString accountId = serializedData[ "accountId" ];
+
+ MeanwhileAccount *theAccount =
+ static_cast<MeanwhileAccount*>(
+ Kopete::AccountManager::self()->
+ findAccount(pluginId(), accountId));
+
+ if(!theAccount)
+ {
+ return 0;
+ }
+
+ theAccount->addContact(contactId, metaContact, Kopete::Account::DontChangeKABC);
+ return theAccount->contacts()[contactId];
+}
+
+const Kopete::OnlineStatus MeanwhileProtocol::accountOfflineStatus()
+{
+ return statusAccountOffline;
+}
+
+const Kopete::OnlineStatus MeanwhileProtocol::lookupStatus(
+ enum Kopete::OnlineStatusManager::Categories cats)
+{
+ return Kopete::OnlineStatusManager::self()->onlineStatus(this, cats);
+}
+#include "meanwhileprotocol.moc"
diff --git a/kopete/protocols/meanwhile/meanwhileprotocol.h b/kopete/protocols/meanwhile/meanwhileprotocol.h
new file mode 100644
index 00000000..aa7a9861
--- /dev/null
+++ b/kopete/protocols/meanwhile/meanwhileprotocol.h
@@ -0,0 +1,77 @@
+/*
+ meanwhileprotocl.h - the meanwhile protocol definition
+
+ Copyright (c) 2005 by Jeremy Kerr <jk@ozlabs.org>
+ Copyright (c) 2003-2004 by Sivaram Gottimukkala <suppandi@gmail.com>
+
+ Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.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 MEANWHILEPROTOCOL_H
+#define MEANWHILEPROTOCOL_H
+
+#include <kopeteprotocol.h>
+
+#include "kopetecontact.h"
+#include "kopetemetacontact.h"
+#include "kopeteonlinestatus.h"
+#include "kopeteonlinestatusmanager.h"
+#include "addcontactpage.h"
+
+#include <kdebug.h>
+#define MEANWHILE_DEBUG 14200
+#define HERE kdDebug(MEANWHILE_DEBUG) << k_funcinfo << endl
+#define mwDebug() kdDebug(MEANWHILE_DEBUG)
+
+class MeanwhileAccount;
+class MeanwhileEditAccountWidget;
+class MeanwhileAddContactPage;
+
+class MeanwhileProtocol : public Kopete::Protocol
+{
+ Q_OBJECT
+public:
+ MeanwhileProtocol(QObject *parent, const char *name,
+ const QStringList &args);
+
+ ~MeanwhileProtocol();
+
+ virtual AddContactPage *createAddContactWidget(QWidget *parent,
+ Kopete::Account *account);
+
+ virtual KopeteEditAccountWidget *createEditAccountWidget(
+ Kopete::Account *account, QWidget *parent);
+
+ virtual Kopete::Account *createNewAccount(const QString &accountId);
+
+ virtual Kopete::Contact *deserializeContact(
+ Kopete::MetaContact *metaContact,
+ const QMap<QString,QString> &serializedData,
+ const QMap<QString, QString> &addressBookData);
+
+ const Kopete::OnlineStatus accountOfflineStatus();
+
+ const Kopete::OnlineStatus lookupStatus(
+ enum Kopete::OnlineStatusManager::Categories cats);
+
+ const Kopete::OnlineStatus statusOffline;
+ const Kopete::OnlineStatus statusOnline;
+ const Kopete::OnlineStatus statusAway;
+ const Kopete::OnlineStatus statusBusy;
+ const Kopete::OnlineStatus statusIdle;
+ const Kopete::OnlineStatus statusAccountOffline;
+
+ Kopete::ContactPropertyTmpl statusMessage;
+ Kopete::ContactPropertyTmpl awayMessage;
+
+};
+
+#endif
diff --git a/kopete/protocols/meanwhile/meanwhilesession.cpp b/kopete/protocols/meanwhile/meanwhilesession.cpp
new file mode 100644
index 00000000..974ca4af
--- /dev/null
+++ b/kopete/protocols/meanwhile/meanwhilesession.cpp
@@ -0,0 +1,965 @@
+/*
+ meanwhilesession.cpp - interface to the 'C' meanwhile library
+
+ Copyright (c) 2003-2004 by Sivaram Gottimukkala <suppandi@gmail.com>
+ Copyright (c) 2005 by Jeremy Kerr <jk@ozlabs.org>
+
+ Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.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 <string.h>
+#include <stdlib.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+
+#include <kopetepassword.h>
+#include <kopetechatsession.h>
+#include <kopetegroup.h>
+#include <kopetecontactlist.h>
+#include "meanwhilesession.h"
+#include "meanwhileprotocol.h"
+
+#include <mw_channel.h>
+#include <mw_message.h>
+#include <mw_error.h>
+#include <mw_service.h>
+#include <mw_session.h>
+#include <mw_srvc_aware.h>
+#include <mw_srvc_conf.h>
+#include <mw_srvc_im.h>
+#include <mw_srvc_store.h>
+#include <mw_cipher.h>
+#include <mw_st_list.h>
+
+#define set_session_handler(a,b) sessionHandler.a = _handleSession ## b
+#define set_aware_handler(a,b) awareHandler.a = _handleAware ## b
+#define set_aware_list_handler(a,b) \
+ awareListHandler.a = _handleAwareList ## b
+#define set_im_handler(a,b) imHandler.a = _handleIm ## b
+
+#define get_protocol() (static_cast<MeanwhileProtocol *>(account->protocol()))
+
+static struct MeanwhileClientID ids[] = {
+ { mwLogin_LIB, "Lotus Binary Library" },
+ { mwLogin_JAVA_WEB, "Lotus Java Applet", },
+ { mwLogin_BINARY, "Lotus Binary App", },
+ { mwLogin_JAVA_APP, "Lotus Java App", },
+ { mwLogin_LINKS, "Sametime Links", },
+
+ { mwLogin_NOTES_6_5, "Notes 6.5", },
+ { mwLogin_NOTES_6_5_3, "Notes 6.5.3", },
+ { mwLogin_NOTES_7_0_beta, "Notes 7.0 beta", },
+ { mwLogin_NOTES_7_0, "Notes 7.0", },
+ { mwLogin_ICT, "ICT", },
+ { mwLogin_ICT_1_7_8_2, "ICT 1.7.8.2", },
+ { mwLogin_ICT_SIP, "ICT SIP", },
+ { mwLogin_NOTESBUDDY_4_14, "NotesBuddy 4.14", },
+ { mwLogin_NOTESBUDDY_4_15, "NotesBuddy 4.15" },
+ { mwLogin_NOTESBUDDY_4_16, "NotesBuddy 4.16" },
+ { mwLogin_SANITY, "Sanity", },
+ { mwLogin_ST_PERL, "ST Perl", },
+ { mwLogin_PMR_ALERT, "PMR Alert", },
+ { mwLogin_TRILLIAN, "Trillian", },
+ { mwLogin_TRILLIAN_IBM, "Trillian (IBM)", },
+ { mwLogin_MEANWHILE, "Meanwhile Library", },
+ { 0, NULL },
+};
+
+MeanwhileSession::MeanwhileSession(MeanwhileAccount *account)
+{
+ HERE;
+ this->account = account;
+ session = 0L;
+ socket = 0L;
+ state = mwSession_STOPPED;
+
+ /* set up main session hander */
+ memset(&sessionHandler, 0, sizeof(sessionHandler));
+ set_session_handler(io_write, IOWrite);
+ set_session_handler(io_close, IOClose);
+ set_session_handler(on_stateChange, StateChange);
+ set_session_handler(on_setPrivacyInfo, SetPrivacyInfo);
+ set_session_handler(on_setUserStatus, SetUserStatus);
+ set_session_handler(on_admin, Admin);
+ set_session_handler(on_announce, Announce);
+ set_session_handler(clear, Clear);
+
+ session = mwSession_new(&sessionHandler);
+ mwSession_setClientData(session, this, 0L);
+
+ /* set up the aware service */
+ memset(&awareHandler, 0, sizeof(awareHandler));
+ set_aware_handler(on_attrib, Attrib);
+
+ awareService = mwServiceAware_new(session, &awareHandler);
+ mwSession_addService(session, (struct mwService *)awareService);
+
+ /* create an aware list */
+ memset(&awareListHandler, 0, sizeof(awareListHandler));
+ set_aware_list_handler(on_aware, Aware);
+ set_aware_list_handler(on_attrib, Attrib);
+ awareList = mwAwareList_new(awareService, &awareListHandler);
+ mwAwareList_setClientData(awareList, this, 0L);
+
+ /* set up an im service */
+ memset(&imHandler, 0, sizeof(imHandler));
+ set_im_handler(conversation_opened, ConvOpened);
+ set_im_handler(conversation_closed, ConvClosed);
+ set_im_handler(conversation_recv, ConvReceived);
+ imHandler.place_invite = 0L;
+ imHandler.clear = 0L;
+
+ imService = mwServiceIm_new(session, &imHandler);
+ mwService_setClientData((struct mwService *)imService, this, 0L);
+ mwSession_addService(session, (struct mwService *) imService);
+
+ /* add resolve service */
+ resolveService = mwServiceResolve_new(session);
+ mwService_setClientData((struct mwService *)resolveService, this, 0L);
+ mwSession_addService(session, (struct mwService *) resolveService);
+
+ /* storage service */
+ storageService = mwServiceStorage_new(session);
+ mwService_setClientData((struct mwService *)storageService, this, 0L);
+ mwSession_addService(session, (struct mwService *) storageService);
+
+#if 0
+ /* conference service setup - just declines invites for now. */
+ memset(&conf_handler, 0, sizeof(conf_handler));
+ conf_handler.on_invited = _conference_invite;
+
+ srvc_conf = mwServiceConference_new(session, &conf_handler);
+ mwService_setClientData((struct mwService *)srvc_conf, this, 0L);
+ mwSession_addService(session, (struct mwService *) srvc_conf);
+#endif
+
+ /* add a necessary cipher */
+ mwSession_addCipher(session, mwCipher_new_RC2_40(session));
+ mwSession_addCipher(session, mwCipher_new_RC2_128(session));
+}
+
+MeanwhileSession::~MeanwhileSession()
+{
+ HERE;
+ if (isConnected() || isConnecting())
+ disconnect();
+
+ mwSession_removeService(session, mwService_STORAGE);
+ mwSession_removeService(session, mwService_RESOLVE);
+ mwSession_removeService(session, mwService_IM);
+ mwSession_removeService(session, mwService_AWARE);
+
+ mwAwareList_free(awareList);
+ mwService_free(MW_SERVICE(storageService));
+ mwService_free(MW_SERVICE(resolveService));
+ mwService_free(MW_SERVICE(imService));
+ mwService_free(MW_SERVICE(awareService));
+ mwCipher_free(mwSession_getCipher(session, mwCipher_RC2_40));
+ mwCipher_free(mwSession_getCipher(session, mwCipher_RC2_128));
+
+ mwSession_free(session);
+
+ if (socket)
+ delete socket;
+}
+
+void MeanwhileSession::getDefaultClientIDParams(int *clientID,
+ int *verMajor, int *verMinor)
+{
+ *clientID = mwLogin_MEANWHILE;
+ *verMajor = MW_PROTOCOL_VERSION_MAJOR;
+ *verMinor = MW_PROTOCOL_VERSION_MINOR;
+}
+
+/* external interface called by meanwhileaccount */
+void MeanwhileSession::connect(QString password)
+{
+ int port, clientID, versionMajor, versionMinor;
+ bool useCustomID;
+ QString host;
+
+ HERE;
+
+ host = account->getServerName();
+ port = account->getServerPort();
+ useCustomID = account->getClientIDParams(&clientID,
+ &versionMajor, &versionMinor);
+
+ KExtendedSocket *sock = new KExtendedSocket(host, port,
+ KExtendedSocket::bufferedSocket);
+
+ if (sock->connect()) {
+ KMessageBox::queuedMessageBox(0, KMessageBox::Error,
+ i18n( "Could not connect to server"), i18n("Meanwhile Plugin"),
+ KMessageBox::Notify);
+ delete sock;
+ return;
+ }
+ socket = sock;
+ /* we want to receive signals when there is data to read */
+ sock->enableRead(true);
+ QObject::connect(sock, SIGNAL(readyRead()), this,
+ SLOT(slotSocketDataAvailable()));
+ QObject::connect(sock, SIGNAL(closed(int)), this,
+ SLOT(slotSocketClosed(int)));
+
+ /* set login details */
+ mwSession_setProperty(session, mwSession_AUTH_USER_ID,
+ g_strdup(account->meanwhileId().ascii()), g_free);
+ mwSession_setProperty(session, mwSession_AUTH_PASSWORD,
+ g_strdup(password.ascii()), g_free);
+
+ /* set client type parameters */
+ if (useCustomID) {
+ mwSession_setProperty(session, mwSession_CLIENT_TYPE_ID,
+ GUINT_TO_POINTER(clientID), NULL);
+ mwSession_setProperty(session, mwSession_CLIENT_VER_MAJOR,
+ GUINT_TO_POINTER(versionMajor), NULL);
+ mwSession_setProperty(session, mwSession_CLIENT_VER_MINOR,
+ GUINT_TO_POINTER(versionMinor), NULL);
+ }
+
+ mwDebug() << "ids: "
+ << mwSession_getProperty(session, mwSession_CLIENT_TYPE_ID) << " v"
+ << mwSession_getProperty(session, mwSession_CLIENT_VER_MAJOR) << "."
+ << mwSession_getProperty(session, mwSession_CLIENT_VER_MINOR) <<
+ endl;
+
+ /* go!! */
+ mwSession_start(session);
+}
+
+void MeanwhileSession::disconnect()
+{
+ HERE;
+ if (state == mwSession_STOPPED || state == mwSession_STOPPING)
+ return;
+
+ mwSession_stop(session, ERR_SUCCESS);
+}
+
+bool MeanwhileSession::isConnected()
+{
+ return mwSession_isStarted(session);
+}
+
+bool MeanwhileSession::isConnecting()
+{
+ return mwSession_isStarting(session);
+}
+
+static void free_id_block(void *data, void *p)
+{
+ if (p != 0L || data == 0L)
+ return;
+ struct mwAwareIdBlock *id = (struct mwAwareIdBlock *)data;
+ free(id->user);
+ free(id);
+}
+
+void MeanwhileSession::addContacts(const QDict<Kopete::Contact>& contacts)
+{
+ HERE;
+ QDictIterator<Kopete::Contact> it(contacts);
+ GList *buddies = 0L;
+
+ /** Convert our QDict of kopete contact to a GList of meanwhile buddies */
+ for( ; it.current(); ++it) {
+ MeanwhileContact *contact =
+ static_cast<MeanwhileContact *>(it.current());
+ struct mwAwareIdBlock *id = (struct mwAwareIdBlock *)
+ malloc(sizeof(*id));
+ if (id == 0L)
+ continue;
+ id->user = strdup(contact->meanwhileId().ascii());
+ id->community = 0L;
+ id->type = mwAware_USER;
+ buddies = g_list_append(buddies, id);
+ }
+
+ mwAwareList_addAware(awareList, buddies);
+
+ g_list_foreach(buddies, free_id_block, 0L);
+ g_list_free(buddies);
+}
+
+/* private functions used only by the meanwhile session object */
+void MeanwhileSession::addContact(const Kopete::Contact *contact)
+{
+ HERE;
+ struct mwAwareIdBlock id = { mwAware_USER,
+ strdup(static_cast<const MeanwhileContact *>(contact)
+ ->meanwhileId().ascii()),
+ 0L };
+
+ GList *buddies = g_list_prepend(0L, &id);
+ mwAwareList_addAware(awareList, buddies);
+ g_list_free(buddies);
+ free(id.user);
+}
+
+int MeanwhileSession::sendMessage(Kopete::Message &message)
+{
+ HERE;
+ MeanwhileContact *contact =
+ static_cast<MeanwhileContact *>(message.to().first());
+ if (!contact) {
+ mwDebug() << "No target for message!" <<endl;
+ return 0;
+ }
+
+ struct mwIdBlock target = { strdup(contact->meanwhileId().ascii()), 0L };
+ struct mwConversation *conv;
+
+ conv = mwServiceIm_getConversation(imService, &target);
+ free(target.user);
+ if (conv == 0L) {
+ mwDebug() << "No target for conversation with '"
+ << contact->meanwhileId() << "'" << endl;
+ return 0;
+ }
+
+ struct ConversationData *convdata = (struct ConversationData *)
+ mwConversation_getClientData(conv);
+
+ if (convdata == 0L) {
+ convdata = createConversationData(conv, contact, true);
+ if (convdata == 0L) {
+ mwDebug() << "No memory for conversation data!" << endl;
+ return 0;
+ }
+ }
+
+ /* if there's other messages in the queue, or the conversation isn't open,
+ * then append to the queue instead of sending right away */
+ if ((convdata->queue && !convdata->queue->isEmpty()) ||
+ !mwConversation_isOpen(conv)) {
+ convdata->queue->append(message);
+ mwConversation_open(conv);
+
+ } else if (!mwConversation_send(conv, mwImSend_PLAIN,
+ message.plainBody().ascii())) {
+ convdata->chat->appendMessage(message);
+ convdata->chat->messageSucceeded();
+ }
+ return 1;
+}
+
+void MeanwhileSession::sendTyping(MeanwhileContact *contact, bool isTyping)
+{
+ HERE;
+ struct mwIdBlock target = { strdup(contact->meanwhileId().ascii()), 0L };
+ struct mwConversation *conv;
+
+ conv = mwServiceIm_getConversation(imService, &target);
+ free(target.user);
+ if (conv == 0L)
+ return;
+
+ if (mwConversation_isOpen(conv))
+ mwConversation_send(conv, mwImSend_TYPING, (void *)isTyping);
+}
+
+void MeanwhileSession::setStatus(Kopete::OnlineStatus status,
+ const QString msg)
+{
+ HERE;
+ mwDebug() << "setStatus: " << status.description() << "("
+ << status.internalStatus() << ")" << endl;
+ if (status.internalStatus() == 0)
+ return;
+
+ struct mwUserStatus stat;
+ mwUserStatus_clone(&stat, mwSession_getUserStatus(session));
+
+ free(stat.desc);
+
+ stat.status = (mwStatusType)status.internalStatus();
+ if (msg.isNull() || msg.isEmpty())
+ stat.desc = strdup(status.description().ascii());
+ else
+ stat.desc = strdup(msg.ascii());
+
+ mwSession_setUserStatus(session, &stat);
+ /* will free stat.desc */
+ mwUserStatus_clear(&stat);
+}
+
+void MeanwhileSession::syncContactsToServer()
+{
+ HERE;
+ struct mwSametimeList *list = mwSametimeList_new();
+
+ /* set up a fallback group for top-level contacts */
+ struct mwSametimeGroup *topstgroup = mwSametimeGroup_new(list,
+ mwSametimeGroup_DYNAMIC, "People");
+ mwSametimeGroup_setOpen(topstgroup, true);
+
+ QDictIterator<Kopete::Contact> it(account->contacts());
+ for( ; it.current(); ++it ) {
+ MeanwhileContact *contact =
+ static_cast<MeanwhileContact *>(it.current());
+
+ /* Find the group that the metacontact is in */
+ Kopete::MetaContact *mc = contact->metaContact();
+ /* myself doesn't have a metacontact */
+ if (mc == 0L)
+ continue;
+
+ Kopete::Group *contactgroup = mc->groups().getFirst();
+ if (contactgroup == 0L)
+ continue;
+
+ if (contactgroup->type() == Kopete::Group::Temporary)
+ continue;
+
+ struct mwSametimeGroup *stgroup;
+ if (contactgroup->type() == Kopete::Group::TopLevel) {
+ stgroup = topstgroup;
+ } else {
+ /* find (or create) a matching sametime list group */
+ stgroup = mwSametimeList_findGroup(list,
+ contactgroup->displayName().ascii());
+ if (stgroup == 0L) {
+ stgroup = mwSametimeGroup_new(list, mwSametimeGroup_DYNAMIC,
+ contactgroup->displayName().ascii());
+ }
+ mwSametimeGroup_setOpen(stgroup, contactgroup->isExpanded());
+ mwSametimeGroup_setAlias(stgroup,
+ contactgroup->pluginData(account->protocol(), "alias")
+ .ascii());
+ }
+
+ /* now add the user (by IDBlock) */
+ struct mwIdBlock id =
+ { (gchar*)contact->meanwhileId().ascii(), 0L };
+ struct mwSametimeUser *stuser = mwSametimeUser_new(stgroup,
+ mwSametimeUser_NORMAL, &id);
+
+ mwSametimeUser_setAlias(stuser, contact->nickName().ascii());
+ }
+
+ /* store! */
+ struct mwPutBuffer *buf = mwPutBuffer_new();
+ struct mwStorageUnit *unit = mwStorageUnit_new(mwStore_AWARE_LIST);
+ struct mwOpaque *opaque = mwStorageUnit_asOpaque(unit);
+
+ mwSametimeList_put(buf, list);
+ mwPutBuffer_finalize(opaque, buf);
+
+ mwServiceStorage_save(storageService, unit, NULL, NULL, NULL);
+
+ mwSametimeList_free(list);
+}
+
+void MeanwhileSession::syncContactsFromServer()
+{
+ struct mwStorageUnit *unit = mwStorageUnit_new(mwStore_AWARE_LIST);
+ mwServiceStorage_load(storageService, unit, &_handleStorageLoad, 0L, 0L);
+}
+
+#define MEANWHILE_SESSION_BUFSIZ 4096
+
+void MeanwhileSession::slotSocketDataAvailable()
+{
+ HERE;
+ guchar *buf;
+ Q_LONG bytesRead;
+
+ if (socket == 0L)
+ return;
+
+ if (!(buf = (guchar *)malloc(MEANWHILE_SESSION_BUFSIZ))) {
+ mwDebug() << "buffer malloc failed" << endl;
+ return;
+ }
+
+ while (socket && socket->bytesAvailable() > 0) {
+ bytesRead = socket->readBlock((char *)buf, MEANWHILE_SESSION_BUFSIZ);
+ if (bytesRead < 0)
+ break;
+ mwSession_recv(session, buf, (unsigned int)bytesRead);
+ }
+ free(buf);
+}
+
+void MeanwhileSession::slotSocketClosed(int reason)
+{
+ HERE;
+
+ if (reason & KExtendedSocket::involuntary)
+ emit serverNotification(
+ QString("Lost connection with Meanwhile server"));
+
+ if (socket) {
+ delete socket;
+ socket = 0L;
+ }
+
+ mwSession_stop(session, 0x00);
+}
+
+
+Kopete::OnlineStatus MeanwhileSession::convertStatus(int mstatus)
+{
+ MeanwhileProtocol *protocol =
+ static_cast<MeanwhileProtocol *>(account->protocol());
+
+ switch (mstatus) {
+ case mwStatus_ACTIVE:
+ return protocol->statusOnline;
+ break;
+ case mwStatus_IDLE:
+ return protocol->statusIdle;
+ break;
+ case mwStatus_AWAY:
+ return protocol->statusAway;
+ break;
+ case mwStatus_BUSY:
+ return protocol->statusBusy;
+ break;
+ case 0:
+ return protocol->statusOffline;
+ break;
+ default:
+ mwDebug() << "unknown status lookup: " << mstatus << endl;
+ }
+ return protocol->statusOffline;
+}
+
+void MeanwhileSession::resolveContactNickname(MeanwhileContact *contact)
+{
+ /* @todo: FIXME: leak! */
+ char *id = strdup(contact->meanwhileId().ascii());
+ GList *query = g_list_prepend(NULL, id);
+ mwServiceResolve_resolve(resolveService, query, mwResolveFlag_USERS,
+ _handleResolveLookupResults, contact, NULL);
+}
+
+QString MeanwhileSession::getNickName(struct mwLoginInfo *logininfo)
+{
+ if (logininfo == 0L || logininfo->user_name == 0L)
+ return QString::null;
+ return getNickName(logininfo->user_name);
+}
+
+QString MeanwhileSession::getNickName(QString name)
+{
+
+ int index = name.find(" - ");
+ if (index != -1)
+ name = name.remove(0, index + 3);
+ index = name.find('/');
+ if (index != -1)
+ name = name.left(index);
+
+ return name;
+}
+
+MeanwhileContact *MeanwhileSession::conversationContact(
+ struct mwConversation *conv)
+{
+ struct mwIdBlock *target = mwConversation_getTarget(conv);
+ if (target == 0L || target->user == 0L) {
+ return 0L;
+ }
+ QString user(target->user);
+
+ MeanwhileContact *contact =
+ static_cast<MeanwhileContact *>(account->contacts()[user]);
+
+ struct mwLoginInfo *logininfo = mwConversation_getTargetInfo(conv);
+ QString name = getNickName(logininfo);
+
+ if (!contact) {
+ account->addContact(user, name, 0L, Kopete::Account::Temporary);
+ contact = static_cast<MeanwhileContact *>(account->contacts()[user]);
+ } else
+ contact->setNickName(name);
+
+ return contact;
+}
+
+/* priave session handling functions, called by libmeanwhile callbacks */
+void MeanwhileSession::handleSessionStateChange(
+ enum mwSessionState state, gpointer data)
+{
+ HERE;
+ this->state = state;
+
+ switch (state) {
+ case mwSession_STARTING:
+ case mwSession_HANDSHAKE:
+ case mwSession_HANDSHAKE_ACK:
+ case mwSession_LOGIN:
+ case mwSession_LOGIN_REDIR:
+ case mwSession_LOGIN_CONT:
+ case mwSession_LOGIN_ACK:
+ break;
+
+ case mwSession_STARTED:
+ {
+ struct mwUserStatus stat = { mwStatus_ACTIVE, 0, 0L };
+ mwSession_setUserStatus(session, &stat);
+ struct mwLoginInfo *logininfo = mwSession_getLoginInfo(session);
+ if (logininfo) {
+ account->myself()->setNickName(getNickName(logininfo));
+ }
+ syncContactsFromServer();
+ }
+ break;
+
+ case mwSession_STOPPING:
+ {
+ unsigned int info = GPOINTER_TO_UINT(data);
+ if (info & ERR_FAILURE) {
+ if (info == INCORRECT_LOGIN)
+ account->password().setWrong();
+ char *reason = mwError(info);
+ emit serverNotification(QString(reason));
+ free(reason);
+ }
+ }
+
+ emit sessionStateChange(
+ static_cast<MeanwhileProtocol *>(account->protocol())
+ ->statusOffline);
+ break;
+
+ case mwSession_STOPPED:
+ break;
+
+ case mwSession_UNKNOWN:
+ default:
+ mwDebug() << "Unhandled state change " << state << endl;
+ }
+}
+
+int MeanwhileSession::handleSessionIOWrite(const guchar *buffer,
+ gsize count)
+{
+ HERE;
+
+ if (socket == 0L)
+ return 1;
+
+ int remaining, retval = 0;
+ for (remaining = count; remaining > 0; remaining -= retval) {
+ retval = socket->writeBlock((char *)buffer, count);
+ if (retval <= 0)
+ return 1;
+ }
+ socket->flush();
+ return 0;
+}
+
+void MeanwhileSession::handleSessionAdmin(const char *text)
+{
+ HERE;
+ emit serverNotification(QString(text));
+}
+
+void MeanwhileSession::handleSessionAnnounce(struct mwLoginInfo *from,
+ gboolean /* may_reply */, const char *text)
+{
+ HERE;
+ QString message;
+ message.sprintf("Announcement from %s:\n%s", from->user_id, text);
+ emit serverNotification(message);
+}
+
+void MeanwhileSession::handleSessionSetUserStatus()
+{
+ struct mwUserStatus *userstatus = mwSession_getUserStatus(session);
+ emit sessionStateChange(convertStatus((unsigned int)userstatus->status));
+}
+
+void MeanwhileSession::handleSessionSetPrivacyInfo()
+{
+}
+
+void MeanwhileSession::handleSessionIOClose()
+{
+ HERE;
+
+ if (socket == 0L)
+ return;
+
+ QObject::disconnect(socket, SIGNAL(closed(int)),
+ this, SLOT(slotSocketClosed(int)));
+ socket->flush();
+ socket->closeNow();
+
+ delete socket;
+ socket = 0L;
+}
+
+void MeanwhileSession::handleSessionClear()
+{
+}
+
+void MeanwhileSession::handleAwareAttrib(struct mwAwareAttribute * /* attrib */)
+{
+ HERE;
+}
+
+void MeanwhileSession::handleAwareListAware(struct mwAwareSnapshot *snapshot)
+{
+ HERE;
+ MeanwhileContact *contact = static_cast<MeanwhileContact *>
+ (account->contacts()[snapshot->id.user]);
+
+ if (contact == 0L)
+ return;
+
+ /* use the setUserStatus callback for status updates for myself. */
+ if (contact == account->myself())
+ return;
+
+ contact->setProperty(get_protocol()->statusMessage, snapshot->status.desc);
+ contact->setProperty(get_protocol()->awayMessage, snapshot->status.desc);
+
+ Kopete::OnlineStatus onlinestatus;
+ if (snapshot->online) {
+ onlinestatus = convertStatus(snapshot->status.status);
+ resolveContactNickname(contact);
+ } else {
+ onlinestatus = convertStatus(0);
+ }
+
+ contact->setOnlineStatus(onlinestatus);
+
+#if 0
+ /* Commented out in previous kopete/meanwhile plugin for some reason,
+ * but has still been ported to the new API.
+ */
+ time_t idletime = 0;
+ if (snapshot->status.status == mwStatus_IDLE) {
+ idletime = (snapshot->status.time == 0xdeadbeef) ?
+ 0 : snapshot->status.time;
+ if (idletime != 0) {
+ contact->setStatusDescription(statusDesc + "[" +
+ QString::number(idletime/60)+" mins]");
+ }
+ } else
+ contact->setStatusDescription(snapshot->status.desc);
+#endif
+}
+
+void MeanwhileSession::handleAwareListAttrib(struct mwAwareIdBlock * /* id */,
+ struct mwAwareAttribute * /* attrib */)
+{
+ HERE;
+}
+
+struct MeanwhileSession::ConversationData
+ *MeanwhileSession::createConversationData(
+ struct mwConversation *conv, MeanwhileContact *contact,
+ bool createQueue)
+{
+ struct ConversationData *cd = new ConversationData();
+
+ if (cd == 0L)
+ return 0L;
+
+ cd->contact = contact;
+ cd->chat = contact->manager(Kopete::Contact::CanCreate);
+ cd->chat->ref();
+ if (createQueue)
+ cd->queue = new QValueList<Kopete::Message>();
+
+ mwConversation_setClientData(conv, cd, 0L);
+
+ return cd;
+}
+
+void MeanwhileSession::handleImConvOpened(struct mwConversation *conv)
+{
+ HERE;
+
+ struct ConversationData *convdata =
+ (struct ConversationData *)mwConversation_getClientData(conv);
+
+ if (convdata == 0L) {
+ /* a new conversation */
+ convdata = createConversationData(conv, conversationContact(conv));
+
+ if (convdata == 0L) {
+ mwDebug() << "No memory for conversation data!" << endl;
+ return;
+ }
+
+ } else if (convdata->queue && !convdata->queue->isEmpty()) {
+ /* send any messages that were waiting for the conversation to open */
+ QValueList<Kopete::Message>::iterator it;
+ for (it = convdata->queue->begin(); it != convdata->queue->end();
+ ++it) {
+ mwConversation_send(conv, mwImSend_PLAIN,
+ (*it).plainBody().ascii());
+ convdata->chat->appendMessage(*it);
+ convdata->chat->messageSucceeded();
+ }
+ convdata->queue->clear();
+ delete convdata->queue;
+ convdata->queue = 0L;
+ }
+ resolveContactNickname(convdata->contact);
+}
+
+void MeanwhileSession::handleImConvClosed(struct mwConversation *conv,
+ guint32)
+{
+ HERE;
+
+ ConversationData *convdata =
+ (ConversationData *)mwConversation_getClientData(conv);
+
+ if (!convdata)
+ return;
+
+ mwConversation_setClientData(conv, 0L, 0L);
+
+ convdata->chat->removeContact(convdata->contact);
+ convdata->chat->deref();
+ convdata->chat = 0L;
+ if (convdata->queue != 0L) {
+ convdata->queue->clear();
+ delete convdata->queue;
+ convdata->queue = 0L;
+ }
+ free(convdata);
+}
+
+void MeanwhileSession::handleImConvReceived(struct mwConversation *conv,
+ enum mwImSendType type, gconstpointer msg)
+{
+ HERE;
+ ConversationData *convdata =
+ (ConversationData *)mwConversation_getClientData(conv);
+
+ if (!convdata)
+ return;
+
+ switch (type) {
+ case mwImSend_PLAIN:
+ {
+ Kopete::Message message(convdata->contact, account->myself(),
+ QString((char *)msg), Kopete::Message::Inbound);
+ convdata->chat->appendMessage(message);
+ }
+ break;
+ case mwImSend_TYPING:
+ convdata->chat->receivedTypingMsg(convdata->contact);
+ break;
+ default:
+ mwDebug() << "Unable to handle message type: " << type << endl;
+ }
+}
+
+void MeanwhileSession::handleResolveLookupResults(
+ struct mwServiceResolve * /* srvc */, guint32 /* id */,
+ guint32 /* code */, GList *results, gpointer data)
+{
+ struct mwResolveResult *result;
+ struct mwResolveMatch *match;
+
+ if (results == 0L)
+ return;
+ if ((result = (struct mwResolveResult *)results->data) == 0L)
+ return;
+
+ if (result->matches == 0L)
+ return;
+ if ((match = (struct mwResolveMatch *)result->matches->data) == 0L)
+ return;
+
+ mwDebug() << "resolve lookup returned '" << match->name << "'" << endl;
+
+ MeanwhileContact *contact = (MeanwhileContact *)data;
+ if (contact == 0L)
+ return;
+
+ contact->setNickName(getNickName(match->name));
+}
+
+void MeanwhileSession::handleStorageLoad(struct mwServiceStorage * /* srvc */,
+ guint32 result, struct mwStorageUnit *item, gpointer /* data */)
+{
+ HERE;
+ if (result != ERR_SUCCESS) {
+ mwDebug() << "contact list load returned " << result << endl;
+ return;
+ }
+
+ struct mwGetBuffer *buf = mwGetBuffer_wrap(mwStorageUnit_asOpaque(item));
+ struct mwSametimeList *list = mwSametimeList_new();
+ mwSametimeList_get(buf, list);
+
+ GList *gl, *glf, *cl, *clf;
+
+ Kopete::ContactList *contactlist = Kopete::ContactList::self();
+
+ for (glf = gl = mwSametimeList_getGroups(list); gl; gl = gl->next) {
+ struct mwSametimeGroup *stgroup = (struct mwSametimeGroup *)gl->data;
+
+ Kopete::Group *group =
+ contactlist->findGroup(mwSametimeGroup_getName(stgroup));
+ group->setPluginData(account->protocol(), "alias",
+ mwSametimeGroup_getAlias(stgroup));
+
+ for (clf = cl = mwSametimeGroup_getUsers(stgroup); cl; cl = cl->next) {
+ struct mwSametimeUser *stuser = (struct mwSametimeUser *)cl->data;
+
+ MeanwhileContact *contact = static_cast<MeanwhileContact *>
+ (account->contacts()[mwSametimeUser_getUser(stuser)]);
+
+ if (contact != 0L)
+ continue;
+
+ account->addContact(mwSametimeUser_getUser(stuser),
+ mwSametimeUser_getAlias(stuser), group,
+ Kopete::Account::ChangeKABC);
+ }
+ g_list_free(clf);
+ }
+ g_list_free(glf);
+
+ mwSametimeList_free(list);
+}
+
+const struct MeanwhileClientID *MeanwhileSession::getClientIDs()
+{
+ return ids;
+}
+
+#if 0
+MEANWHILE_HOOK_CONFERENCE(conference_invite,
+ (struct mwConference *conf, struct mwLoginInfo *inviter,
+ const char *invite),
+ (conf, inviter, invite))
+{
+ HERE;
+ QString message;
+
+ message.sprintf("%s has invited you to a conference called \"%s\"\n"
+ "However, this version of the meanwhile plugin does "
+ "not support conferences, so the invitiation has been declined.",
+ inviter->user_id, invite);
+
+ mwConference_reject(conf, ERR_SUCCESS,
+ "Sorry, my client doesn't support conferences!");
+ KMessageBox::queuedMessageBox(0, KMessageBox::Sorry , message,
+ i18n("Meanwhile Plugin: Conference invitation"),
+ KMessageBox::Notify);
+}
+#endif
+#include "meanwhilesession.moc"
diff --git a/kopete/protocols/meanwhile/meanwhilesession.h b/kopete/protocols/meanwhile/meanwhilesession.h
new file mode 100644
index 00000000..0e2a3558
--- /dev/null
+++ b/kopete/protocols/meanwhile/meanwhilesession.h
@@ -0,0 +1,350 @@
+/*
+ meanwhilesession.h - interface to the 'C' meanwhile session
+
+ Copyright (c) 2005 by Jeremy Kerr <jk@ozlabs.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 MEANWHILESESSION_H
+#define MEANWHILESESSION_H
+
+#include "meanwhileaccount.h"
+#include "meanwhilecontact.h"
+#include <kextendedsocket.h>
+
+#include <mw_session.h>
+#include <mw_service.h>
+#include <mw_srvc_aware.h>
+#include <mw_srvc_im.h>
+#include <mw_srvc_resolve.h>
+
+struct MeanwhileClientID {
+ int id;
+ const char *name;
+};
+
+/**
+ * A class to handle libmeanwhile session management.
+ */
+class MeanwhileSession : public QObject
+{
+ Q_OBJECT
+
+public:
+ /**
+ * Create a session. By default, the session is not connected - you will
+ * need to call login() to initiate the connection process.
+ * @param account The account that the connection is for
+ */
+ MeanwhileSession(MeanwhileAccount *account);
+
+ /**
+ * Destroy the session
+ */
+ ~MeanwhileSession();
+
+ /**
+ * Connect to the server. This will open a socket and start login. Note that
+ * the connection process is ascychronous - a loginDone() signal will be
+ * emitted when sucessfully logged in.
+ */
+ void connect(QString password);
+
+ /**
+ * Disconnect from the server.
+ */
+ void disconnect();
+
+ /**
+ * Set our (the local contact's) online status. The internalStatus of the
+ * state argument will be used to define the state message we send - it
+ * should be one of the Status enum fields (and not Offline)
+ * @param state the new state of the local user
+ * @param msg a custom message to use, if required
+ */
+ void setStatus(Kopete::OnlineStatus status,
+ const QString msg = QString::null);
+
+ /**
+ * Add a single contact to be registered for status updates
+ * @param contact The contact to register
+ */
+ void addContact(const Kopete::Contact *contact);
+
+ /**
+ * Add a list of contacts to be registered for status updates
+ * @param contact The list of contacts to register
+ */
+ void addContacts(const QDict<Kopete::Contact>& contacts);
+
+ /**
+ * Send a message (with recipient specified).
+ * @param message The message to send
+ * @return non-zero if the message could be sent
+ */
+ int sendMessage(Kopete::Message &message);
+
+ /**
+ * Send a typing notification to a contact
+ * @param contact The contact to notify
+ * @param isTyping If true, the typing notification is set
+ */
+ void sendTyping(MeanwhileContact *contact, bool isTyping);
+
+ /**
+ * Determine if the session is connected to the server
+ * @return true if the session is connected
+ */
+ bool isConnected();
+
+ /**
+ * Determine if the session is in the process of connecting to the server
+ * @return true if the session is connecting
+ */
+ bool isConnecting();
+
+ static const struct MeanwhileClientID *getClientIDs();
+
+ static void getDefaultClientIDParams(int *clientID,
+ int *verMajor, int *verMinor);
+signals:
+ /**
+ * Emitted when the status of the connection changes
+ * @param status The new status of the session
+ */
+ void sessionStateChange(Kopete::OnlineStatus status);
+
+ /**
+ * Emitted when a notification is received from the server, or other
+ * out-of-band data (eg, the password is incorrect).
+ * @param mesgString A description of the notification
+ */
+ void serverNotification(const QString &mesgString);
+
+private:
+ /** Main libmeanwhile session object */
+ struct mwSession *session;
+
+ /** Session handler */
+ struct mwSessionHandler sessionHandler;
+
+ /** Aware service */
+ struct mwServiceAware *awareService;
+
+ /** Aware handler */
+ struct mwAwareHandler awareHandler;
+
+ /** Aware List Handler */
+ struct mwAwareListHandler awareListHandler;
+
+ /** The aware list */
+ struct mwAwareList *awareList;
+
+ /** Aware service */
+ struct mwServiceIm *imService;
+
+ /** Aware handler */
+ struct mwImHandler imHandler;
+
+ /** Resolve service */
+ struct mwServiceResolve *resolveService;
+
+ /** Storage service, for contact list */
+ struct mwServiceStorage *storageService;
+
+ /** Last recorded meanwhile state */
+ enum mwSessionState state;
+
+ /** The kopete account that this library is for */
+ MeanwhileAccount *account;
+
+ /** socket to the server */
+ KExtendedSocket *socket;
+
+ /* These structures are stored in the libmeanwhile 'ClientData' fields */
+
+ /** Stored in the mwConversation struct */
+ struct ConversationData {
+ MeanwhileContact *contact;
+ Kopete::ChatSession *chat;
+ QValueList<Kopete::Message> *queue;
+ };
+
+ /** (To be) stored in the mwConference struct */
+ struct ConferenceData {
+ Kopete::ChatSession *chatsession;
+ };
+
+ /**
+ * Initialise the conversation data struct for a conversation, and store it
+ * in the meanwhile conversation object
+ * @param conv the meanwhile conversation object
+ * @param contact the contact that the conversation is with
+ * @param createQueue whether a message queue is required for this
+ * conversation
+ * @return The created conversation data struct
+ */
+ struct ConversationData *createConversationData(
+ struct mwConversation *conv, MeanwhileContact *contact,
+ bool createQueue = false);
+
+ /**
+ * Get the contact for a conversation
+ * @param conv the meanwhile conversation
+ * @return the contact that this conversation is held with
+ */
+ MeanwhileContact *conversationContact(struct mwConversation *conv);
+
+ /**
+ * Convert a libmeanwhile-type status into one of the MeanwhileProtocol
+ * statuses
+ * @param mstatus The internal status to convert
+ * @return The Meanwhile status
+ */
+ Kopete::OnlineStatus convertStatus(int mstatus);
+
+ /**
+ * Parse the nickname of a libmeanwhile contact. From what I've seen,
+ * usernames are in the format:
+ * <userid> - <name>/<domain>/<domain>
+ * @param name the extened username to parse
+ * @return just the name part of the username info
+ */
+ QString getNickName(QString name);
+
+ /**
+ * Convenience method to call the above from a mwLoginInfo struct. All is
+ * checked for null.
+ * @param logininfo the login info for a contact
+ * @return just the name part of the login info data
+ */
+ QString getNickName(struct mwLoginInfo *logininfo);
+
+ /**
+ * Resolve a contact to find (and set) the display name. This requires the
+ * session to be connected to use the meanwhile resolve service.
+ * @param contact The contact to resolve
+ */
+ void resolveContactNickname(MeanwhileContact *contact);
+
+public:
+ void syncContactsToServer();
+ void syncContactsFromServer();
+
+private slots:
+
+ /** Notify the library that data is available on the socket */
+ void slotSocketDataAvailable();
+
+ /**
+ * Notify the library that the socket has been closed
+ * @param reason the reason for closing
+ */
+ void slotSocketClosed(int reason);
+
+private:
+ /* ugly callbacks for libmeanwhile interface. These declare a static method
+ * to proxy the callback from libmeanwhile to a call to the MeanwhileSession
+ */
+
+#define declare_session_handler_type(type, func, args, ...) \
+ static type _handleSession ## func ( \
+ struct mwSession *mwsession, __VA_ARGS__) { \
+ MeanwhileSession *session = \
+ (MeanwhileSession *)mwSession_getClientData(mwsession); \
+ return session->handleSession ## func args; \
+ }; \
+ type handleSession ## func(__VA_ARGS__)
+#define declare_session_handler(func, args, ...) \
+ static void _handleSession ## func ( \
+ struct mwSession *mwsession, ## __VA_ARGS__) { \
+ MeanwhileSession *session = \
+ (MeanwhileSession *)mwSession_getClientData(mwsession); \
+ session->handleSession ## func args; \
+ }; \
+ void handleSession ## func(__VA_ARGS__)
+
+ declare_session_handler_type(int, IOWrite, (buf, len),
+ const guchar *buf, gsize len);
+ declare_session_handler(IOClose,());
+ declare_session_handler(Clear,());
+ declare_session_handler(StateChange, (state, info),
+ enum mwSessionState state, gpointer info);
+ declare_session_handler(SetPrivacyInfo,());
+ declare_session_handler(SetUserStatus,());
+ declare_session_handler(Admin, (text), const char *text);
+ declare_session_handler(Announce, (from, may_reply, text),
+ struct mwLoginInfo *from, gboolean may_reply, const char *text);
+
+#define declare_aware_handler(func, args, ...) \
+ static void _handleAware ## func ( \
+ struct mwServiceAware *srvc, ## __VA_ARGS__) { \
+ MeanwhileSession *session = (MeanwhileSession *) \
+ mwService_getClientData((struct mwService *)srvc); \
+ return session->handleAware ## func args; \
+ }; \
+ void handleAware ## func(__VA_ARGS__)
+
+ declare_aware_handler(Attrib, (attrib), struct mwAwareAttribute *attrib);
+ declare_aware_handler(Clear,());
+
+#define declare_aware_list_handler(func, args, ...) \
+ static void _handleAwareList ## func ( \
+ struct mwAwareList *list, ## __VA_ARGS__){ \
+ MeanwhileSession *session = (MeanwhileSession *) \
+ mwAwareList_getClientData(list); \
+ return session->handleAwareList ## func args; \
+ }; \
+ void handleAwareList ## func(__VA_ARGS__)
+
+ declare_aware_list_handler(Aware, (snapshot),
+ struct mwAwareSnapshot *snapshot);
+ declare_aware_list_handler(Attrib, (id, attrib),
+ struct mwAwareIdBlock *id, struct mwAwareAttribute *attrib);
+ declare_aware_list_handler(Clear,());
+
+#define declare_im_handler(func, args, ...) \
+ static void _handleIm ## func ( \
+ struct mwConversation *conv, ## __VA_ARGS__) { \
+ MeanwhileSession *session = (MeanwhileSession *) \
+ mwService_getClientData( \
+ (struct mwService *)mwConversation_getService(conv)); \
+ return session->handleIm ## func args; \
+ }; \
+ void handleIm ## func (struct mwConversation *conv, ## __VA_ARGS__)
+
+ declare_im_handler(ConvOpened, (conv));
+ declare_im_handler(ConvClosed, (conv, err), guint32 err);
+ declare_im_handler(ConvReceived, (conv, type, msg),
+ enum mwImSendType type, gconstpointer msg);
+
+ /* resolve service */
+ static void _handleResolveLookupResults(struct mwServiceResolve *srvc,
+ guint32 id, guint32 code, GList *results, gpointer data) {
+ MeanwhileSession *session = (MeanwhileSession *)
+ mwService_getClientData(MW_SERVICE(srvc));
+ session->handleResolveLookupResults(srvc, id, code, results, data);
+ };
+ void handleResolveLookupResults(struct mwServiceResolve *srvc, guint32 id,
+ guint32 code, GList *results, gpointer data);
+
+ /* storage service */
+ static void _handleStorageLoad(struct mwServiceStorage *srvc,
+ guint32 result, struct mwStorageUnit *item, gpointer data) {
+ MeanwhileSession *session = (MeanwhileSession *)
+ mwService_getClientData(MW_SERVICE(srvc));
+ session->handleStorageLoad(srvc, result, item, data);
+ };
+ void handleStorageLoad(struct mwServiceStorage *srvc,
+ guint32 result, struct mwStorageUnit *item, gpointer data);
+};
+
+#endif
+
diff --git a/kopete/protocols/meanwhile/ui/Makefile.am b/kopete/protocols/meanwhile/ui/Makefile.am
new file mode 100644
index 00000000..466f68b2
--- /dev/null
+++ b/kopete/protocols/meanwhile/ui/Makefile.am
@@ -0,0 +1,8 @@
+METASOURCES = AUTO
+
+noinst_LTLIBRARIES = libkopetemeanwhileui.la
+AM_CPPFLAGS = $(KOPETE_INCLUDES) \
+ -I$(srcdir)/.. \
+ $(all_includes)
+
+libkopetemeanwhileui_la_SOURCES = empty.cpp meanwhileeditaccountbase.ui meanwhileaddcontactbase.ui
diff --git a/kopete/protocols/meanwhile/ui/empty.cpp b/kopete/protocols/meanwhile/ui/empty.cpp
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/kopete/protocols/meanwhile/ui/empty.cpp
diff --git a/kopete/protocols/meanwhile/ui/meanwhileaddcontactbase.ui b/kopete/protocols/meanwhile/ui/meanwhileaddcontactbase.ui
new file mode 100644
index 00000000..d146a8ed
--- /dev/null
+++ b/kopete/protocols/meanwhile/ui/meanwhileaddcontactbase.ui
@@ -0,0 +1,111 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>MeanwhileAddContactBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Form1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>396</width>
+ <height>347</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Add Sametime Contact</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout53</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Userid:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>contactID</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>The user id of the contact you would like to add.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The user id of the contact you would like to add.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>contactID</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>The user id of the contact you would like to add.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The user id of the contact you would like to add.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>btnFindUser</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Find</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Find Userid</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Find Userid</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3_2</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;i&gt;(for example: johndoe)&lt;/i&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>80</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kopete/protocols/meanwhile/ui/meanwhileeditaccountbase.ui b/kopete/protocols/meanwhile/ui/meanwhileeditaccountbase.ui
new file mode 100644
index 00000000..2f160039
--- /dev/null
+++ b/kopete/protocols/meanwhile/ui/meanwhileeditaccountbase.ui
@@ -0,0 +1,437 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>MeanwhileEditAccountBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>MeanwhileEditAccountBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>640</width>
+ <height>450</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit Meanwhile Account</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>tabWidget11</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>B&amp;asic Setup</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox53</cstring>
+ </property>
+ <property name="title">
+ <string>Account Information</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout81</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>label1</cstring>
+ </property>
+ <property name="text">
+ <string>Meanwhile &amp;username:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>mScreenName</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Your Sametime userid</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Your Sametime userid</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>mScreenName</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Your Sametime userid</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Your Sametime userid</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="Kopete::UI::PasswordWidget">
+ <property name="name">
+ <cstring>mPasswordWidget</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>mAutoConnect</cstring>
+ </property>
+ <property name="text">
+ <string>E&amp;xclude from connect all</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check to disable automatic connection. If checked, you may connect to this account manually using the icon in the bottom of the main Kopete window</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Connection</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox54</cstring>
+ </property>
+ <property name="title">
+ <string>Connection Preferences</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout21</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout56</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>lblServer</cstring>
+ </property>
+ <property name="text">
+ <string>Ser&amp;ver:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>mServerName</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>The IP address or hostname of the Sametime server you wish to connect to.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The IP address or hostname of the Sametime server you wish to connect to.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>mServerName</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>The IP address or hostname of the Sametime server you wish to connect to.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The IP address or hostname of the Sametime server you wish to connect to.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout57</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>lblPort</cstring>
+ </property>
+ <property name="text">
+ <string>Po&amp;rt:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>mServerPort</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>The port on the Sametime server that you would like to connect to.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The port on the Sametime server that you would like to connect to. Usually this is 1533.</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>mServerPort</cstring>
+ </property>
+ <property name="maxValue">
+ <number>65534</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>1533</number>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>The port on the Sametime server that you would like to connect to.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The port on the Sametime server that you would like to connect to. Usually this is 1533.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox5</cstring>
+ </property>
+ <property name="title">
+ <string>Client Identifier</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>chkCustomClientID</cstring>
+ </property>
+ <property name="text">
+ <string>Use custom client identifier</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout17</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox" row="0" column="1">
+ <property name="name">
+ <cstring>mClientID</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>lblClientIdentifier</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Client identifier</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>mClientID</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1">
+ <property name="name">
+ <cstring>layout13</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>mClientVersionMajor</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>lblVersionSeparator</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>.</string>
+ </property>
+ <property name="alignment">
+ <set>AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>mClientVersionMinor</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>lblClientVersion</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Client version (major.minor)</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>mClientVersionMajor</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>btnServerDefaults</cstring>
+ </property>
+ <property name="text">
+ <string>Restore &amp;Defaults</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Restore the server and port values to their defaults.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Restore the server and port values to their defaults.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </vbox>
+ </widget>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>Kopete::UI::PasswordWidget</class>
+ <header location="local">kopetepasswordwidget.h</header>
+ <sizehint>
+ <width>50</width>
+ <height>50</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>1</hordata>
+ <verdata>0</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ <signal>changed()</signal>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="PNG" length="866">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000032949444154388db59531681b6714c77f32373c8186ef0305eea005093258900eca26d30e3174a8a807d1c9ee940e5d4a276f09a414e22974ee609a4c75a0857a70a20c199ce93424e43414aee0c26910dc8105f7410df706413a7c915551db049a3e38b87bf7bedffddfc7ff7d578be398456c6c6cbce13d441cc7b5da02fcf4e8e99bde7a8f899b501515d959f64e10e71cd949c6e8d508e6cb7cb050fae49727444d87ed08a566dc0cea545a621b96725e62c522f312c4929ff9e7725e6203439282ec0bc72f74150c30c927d89690163f539619a044564973a1980ae54c01c136a1db518a0024808942780dead16a27e7e0ca55949a81668023b242fcd2901c394663072cd408ad75e18b6d43a7076143710aa1b9049ccd326e064a5979e8f0191cfc5878544368af1b24807caa4cfe507ef8aea0bf6dd8b92de7f00bc1562c95e64416e297f216aadcfa3ca43f10da1f8243112286871507fb05c3c7059d568bde96c5885b01af2d6e4a2db10dc8ff128e0fdd39f4cbaf8576dbe170702afcf6b86467bbce57df8680f0d3230767e0e62bdc55c5e53c476742fabbc318437f209886c3cd41d4b0f74049c78ef21476ef5846cf7ded2831848d55f0aa62816caade11adb7ed2fa0f71ce9d8619ac2e627824a45a72b00e413c5a95c0cf63e052bbe2014bfa738c3de3d251dfb0f8a80fda04e6480600113cc558a11a0e10b93a9225886cff04a8d10868662eab87f37271e59f2136f85a855bfda15f9594eb7a3b4ae0b933f95e161c5ceed88f254e97f2ad49b75eedf8562e2d8fb264355314da1dbada866abe47fedb106d01f78b71fec170c8f7276ef58da3de8f64a76bf6f634283730e9d2b9b8390ce0dae565c6a8e04b0710b746678f8a8e0e18382d173a1d7151c909fe4e84ccf57be3e76245b115143584ee73f27afc8e80b4c667e4c37b7054c8be1afde0de978a9c63485fea0457cec70aa089015ab9297e0938c240573cdb7651a4a7f20f43feb304a72aac2e73bd723da1fe5746ec0682bc26070f38c345905d7e238f6077c00dd8f85280211fcd91af84b02ef94a50c004502c1394813252f14575ca09839242f9484cb42df31e763edd237ff31d6c0ffa3fe17f0fb86c7715cfb1ba8bd86cc8d2decd30000000049454e44ae426082</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>chkCustomClientID</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>mClientID</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>chkCustomClientID</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>mClientVersionMajor</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>chkCustomClientID</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>mClientVersionMinor</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>chkCustomClientID</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>lblClientIdentifier</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>chkCustomClientID</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>lblClientVersion</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>mScreenName</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kopetepasswordwidget.h</includehint>
+</includehints>
+</UI>