summaryrefslogtreecommitdiffstats
path: root/kopete/protocols/oscar/icq/icqpresence.h
diff options
context:
space:
mode:
Diffstat (limited to 'kopete/protocols/oscar/icq/icqpresence.h')
-rw-r--r--kopete/protocols/oscar/icq/icqpresence.h177
1 files changed, 177 insertions, 0 deletions
diff --git a/kopete/protocols/oscar/icq/icqpresence.h b/kopete/protocols/oscar/icq/icqpresence.h
new file mode 100644
index 00000000..d7ef9ed2
--- /dev/null
+++ b/kopete/protocols/oscar/icq/icqpresence.h
@@ -0,0 +1,177 @@
+/*
+ icqpresence.h - ICQ online status and presence management
+
+ Copyright (c) 2004 by Richard Smith <[email protected]>
+ Kopete (c) 2002-2004 by the Kopete developers <[email protected]>
+
+ *************************************************************************
+ * *
+ * 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 ICQCOMMON_H
+#define ICQCOMMON_H
+
+#include <kdebug.h>
+
+namespace Kopete { class OnlineStatus; }
+
+namespace ICQ
+{
+
+class Presence;
+
+/**
+ * @brief This namespace contains status flags used in OSCAR's on-the-wire format.
+ *
+ * The IS_XXX values are bits representing actual status flags. However, the flags
+ * are just that -- flags. ICQ statuses are represented by a combination of these
+ * flags rather than just one value. This seems to be for backwards compatibility
+ * reasons -- this way you can add a new status and existing clients should still
+ * work correctly.
+ *
+ * So, when changing status you need to specify not only what status it is, but
+ * also all other status flags that are appropriate. The SET_XXX flags do just that;
+ * SET_DND for instance sets the DND, Occupied and Away bits.
+ */
+namespace StatusCode
+{
+ enum
+ {
+ OFFLINE = 0xFFFFFFFF,
+ ONLINE = 0x00000000,
+ INVISIBLE = 0x00000100,
+
+ IS_DND = 0x00000002, ///< Do Not Disturb
+ IS_OCC = 0x00000010, ///< Occupied
+ IS_NA = 0x00000004, ///< Not Available
+ IS_AWAY = 0x00000001, ///< Away
+ IS_FFC = 0x00000020, ///< Free For Chat
+
+ SET_DND = 0x00000013, //== DND + Occupied + Away
+ SET_OCC = 0x00000011, //== Occupied + Away
+ SET_NA = 0x00000005, //== NA + Away
+ SET_AWAY = 0x00000001,
+ SET_FFC = 0x00000020,
+
+ WEBAWARE = 0x00010000,
+ SHOWIP = 0x00020000
+ };
+} // end namespace StatusCode
+
+/**
+ * @brief A manager for ICQ's online statuses
+ *
+ * Looks after ICQ's numerous online statuses, and maps between them and Presence objects.
+ * A single instance of this class is held by the ICQProtocol object.
+ */
+class OnlineStatusManager
+{
+public:
+ OnlineStatusManager();
+ ~OnlineStatusManager();
+ ICQ::Presence presenceOf( uint internalStatus );
+ Kopete::OnlineStatus onlineStatusOf( const ICQ::Presence &presence );
+ Kopete::OnlineStatus connectingStatus();
+ Kopete::OnlineStatus unknownStatus();
+ Kopete::OnlineStatus waitingForAuth();
+
+private:
+ class Private;
+ Private *d;
+};
+
+/**
+ * @brief An ICQ online presence object
+ */
+class Presence
+{
+public:
+ /**
+ * Friendly types this status can be
+ */
+ enum Type { Offline, DoNotDisturb, Occupied, NotAvailable, Away, Online, FreeForChat };
+ enum { TypeCount = FreeForChat + 1 };
+
+ enum Visibility { Invisible, Visible };
+
+ Presence( Type type, Visibility vis ) : _type(type), _visibility(vis) {}
+
+ Type type() const { return _type; }
+ Visibility visibility() const { return _visibility; }
+
+ /**
+ * Generate a Presence object from an online status
+ */
+ static Presence fromOnlineStatus( const Kopete::OnlineStatus &status );
+
+ /**
+ * Convert this Presence object to an online status
+ */
+ Kopete::OnlineStatus toOnlineStatus() const;
+
+ /**
+ * Get the status code to pass to liboscar to set us to this Status.
+ * @note This is not the opposite of fromOnlineStatus(). The set and get codes don't match.
+ */
+ unsigned long toOscarStatus() const;
+
+ /**
+ * Get the status a contact is at based on liboscar's view of its status.
+ * @note This is not the opposite of toOnlineStatus().
+ */
+ static Presence fromOscarStatus( unsigned long code );
+
+ bool operator==( const Presence &other ) const { return other._type == _type && other._visibility == _visibility; }
+ bool operator!=( const Presence &other ) const { return !(*this == other); }
+
+private:
+ unsigned long basicOscarStatus() const;
+ static Type typeFromOscarStatus( unsigned long status );
+private:
+ Type _type;
+ Visibility _visibility;
+};
+
+}
+
+#if 0
+const unsigned int ICQ_PORT = 5190;
+
+
+const unsigned short ICQ_SEARCHSTATE_OFFLINE = 0;
+const unsigned short ICQ_SEARCHSTATE_ONLINE = 1;
+const unsigned short ICQ_SEARCHSTATE_DISABLED = 2;
+
+
+// Taken from libicq, not sure if we ever support these requests
+const unsigned char PHONEBOOK_SIGN[16] =
+{
+ 0x90, 0x7C, 0x21, 0x2C, 0x91, 0x4D, 0xD3, 0x11,
+ 0xAD, 0xEB, 0x00, 0x04, 0xAC, 0x96, 0xAA, 0xB2
+};
+
+const unsigned char PLUGINS_SIGN[16] =
+{
+ 0xF0, 0x02, 0xBF, 0x71, 0x43, 0x71, 0xD3, 0x11,
+ 0x8D, 0xD2, 0x00, 0x10, 0x4B, 0x06, 0x46, 0x2E
+};
+
+/*
+const unsigned char SHARED_FILES_SIGN[16] =
+{
+ 0xF0, 0x2D, 0x12, 0xD9, 0x30, 0x91, 0xD3, 0x11,
+ 0x8D, 0xD7, 0x00, 0x10, 0x4B, 0x06, 0x46, 0x2E
+};
+*/
+#endif
+
+#endif
+// vim: set noet ts=4 sts=4 sw=4:
+// kate: indent-mode: csands