Blame src/mw_message.h

Packit Service 37472d
Packit Service 37472d
/*
Packit Service 37472d
  Meanwhile - Unofficial Lotus Sametime Community Client Library
Packit Service 37472d
  Copyright (C) 2004  Christopher (siege) O'Brien
Packit Service 37472d
  
Packit Service 37472d
  This library is free software; you can redistribute it and/or
Packit Service 37472d
  modify it under the terms of the GNU Library General Public
Packit Service 37472d
  License as published by the Free Software Foundation; either
Packit Service 37472d
  version 2 of the License, or (at your option) any later version.
Packit Service 37472d
  
Packit Service 37472d
  This library is distributed in the hope that it will be useful,
Packit Service 37472d
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 37472d
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 37472d
  Library General Public License for more details.
Packit Service 37472d
  
Packit Service 37472d
  You should have received a copy of the GNU Library General Public
Packit Service 37472d
  License along with this library; if not, write to the Free
Packit Service 37472d
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Packit Service 37472d
*/
Packit Service 37472d
Packit Service 37472d
#ifndef _MW_MESSAGE_H
Packit Service 37472d
#define _MW_MESSAGE_H
Packit Service 37472d
Packit Service 37472d
Packit Service 1bfe49
#include <glib.h>
Packit Service 37472d
#include "mw_common.h"
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
#ifdef __cplusplus
Packit Service 37472d
extern "C" {
Packit Service 37472d
#endif
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** Cast a pointer to a message subtype (eg, mwMsgHandshake,
Packit Service 37472d
    mwMsgAdmin) into a pointer to a mwMessage */
Packit Service 37472d
#define MW_MESSAGE(msg) (&msg->head)
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** Indicates the type of a message. */
Packit Service 37472d
enum mwMessageType {
Packit Service 37472d
  mwMessage_HANDSHAKE         = 0x0000,  /**< mwMsgHandshake */
Packit Service 37472d
  mwMessage_HANDSHAKE_ACK     = 0x8000,  /**< mwMsgHandshakeAck */
Packit Service 37472d
  mwMessage_LOGIN             = 0x0001,  /**< mwMsgLogin */
Packit Service 37472d
  mwMessage_LOGIN_ACK         = 0x8001,  /**< mwMsgLoginAck */
Packit Service 37472d
  mwMessage_LOGIN_REDIRECT    = 0x0018,  /**< mwMsgLoginRedirect */
Packit Service 37472d
  mwMessage_LOGIN_CONTINUE    = 0x0016,  /**< mwMsgLoginContinue */
Packit Service 37472d
Packit Service 37472d
  mwMessage_CHANNEL_CREATE    = 0x0002,  /**< mwMsgChannelCreate */
Packit Service 37472d
  mwMessage_CHANNEL_DESTROY   = 0x0003,  /**< mwMsgChannelDestroy */
Packit Service 37472d
  mwMessage_CHANNEL_SEND      = 0x0004,  /**< mwMsgChannelSend */
Packit Service 37472d
  mwMessage_CHANNEL_ACCEPT    = 0x0006,  /**< mwMsgChannelAccept */
Packit Service 37472d
Packit Service 37472d
  mwMessage_SET_USER_STATUS   = 0x0009,  /**< mwMsgSetUserStatus */
Packit Service 37472d
  mwMessage_SET_PRIVACY_LIST  = 0x000b,  /**< mwMsgSetPrivacyList */
Packit Service 37472d
  mwMessage_SENSE_SERVICE     = 0x0011,  /**< mwMsgSenseService */
Packit Service 37472d
  mwMessage_ADMIN             = 0x0019,  /**< mwMsgAdmin */
Packit Service 37472d
  mwMessage_ANNOUNCE          = 0x0022,  /**< mwMsgAnnounce */
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
enum mwMessageOption {
Packit Service 37472d
  mwMessageOption_ENCRYPT      = 0x4000,  /**< message data is encrypted */
Packit Service 37472d
  mwMessageOption_HAS_ATTRIBS  = 0x8000,  /**< message has attributes */
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** @see mwMessageOption */
Packit Service 37472d
#define MW_MESSAGE_HAS_OPTION(msg, opt) \
Packit Service 37472d
  ((msg)->options & (opt))
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
struct mwMessage {
Packit Service 37472d
  guint16 type;     /**< @see mwMessageType */
Packit Service 37472d
  guint16 options;  /**< @see mwMessageOption */
Packit Service 37472d
  guint32 channel;  /**< ID of channel message is intended for */
Packit Service 37472d
  struct mwOpaque attribs;  /**< optional message attributes */
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** Allocate and initialize a new message of the specified type */
Packit Service 37472d
struct mwMessage *mwMessage_new(enum mwMessageType type);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** build a message from its representation */
Packit Service 37472d
struct mwMessage *mwMessage_get(struct mwGetBuffer *b);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwMessage_put(struct mwPutBuffer *b, struct mwMessage *msg);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwMessage_free(struct mwMessage *msg);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.4 Messages */
Packit Service 37472d
/* 8.4.1 Basic Community Messages */
Packit Service 37472d
/* 8.4.1.1 Handshake */
Packit Service 37472d
Packit Service 37472d
struct mwMsgHandshake {
Packit Service 37472d
  struct mwMessage head;
Packit Service 37472d
  guint16 major;          /**< client's major version number */
Packit Service 37472d
  guint16 minor;          /**< client's minor version number */
Packit Service 37472d
  guint32 srvrcalc_addr;  /**< 0.0.0.0 */
Packit Service 37472d
  guint16 login_type;     /**< @see mwLoginType */
Packit Service 37472d
  guint32 loclcalc_addr;  /**< local public IP */
Packit Service 37472d
  guint16 unknown_a;      /**< normally 0x0100 */
Packit Service 37472d
  guint32 unknown_b;      /**< normally 0x00000000 */
Packit Service 37472d
  char *local_host;       /**< name of client host */
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.4.1.2 HandshakeAck */
Packit Service 37472d
Packit Service 37472d
struct mwMsgHandshakeAck {
Packit Service 37472d
  struct mwMessage head;
Packit Service 37472d
  guint16 major;          /**< server's major version number */
Packit Service 37472d
  guint16 minor;          /**< server's minor version number */
Packit Service 37472d
  guint32 srvrcalc_addr;  /**< server-calculated address */
Packit Service 37472d
  guint32 magic;          /**< four bytes of something */
Packit Service 37472d
  struct mwOpaque data;   /**< server's DH public key for auth */
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.3.7 Authentication Types */
Packit Service 37472d
Packit Service 37472d
enum mwAuthType {
Packit Service 37472d
  mwAuthType_PLAIN    = 0x0000,
Packit Service 37472d
  mwAuthType_TOKEN    = 0x0001,
Packit Service 37472d
  mwAuthType_ENCRYPT  = 0x0002, /**< @todo remove for 1.0 */
Packit Service 37472d
  mwAuthType_RC2_40   = 0x0002,
Packit Service 37472d
  mwAuthType_RC2_128  = 0x0004,
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.4.1.3 Login */
Packit Service 37472d
Packit Service 37472d
struct mwMsgLogin {
Packit Service 37472d
  struct mwMessage head;
Packit Service 37472d
  guint16 login_type;         /**< @see mwLoginType */
Packit Service 37472d
  char *name;                 /**< user identification */
Packit Service 37472d
  guint16 auth_type;          /**< @see mwAuthType */
Packit Service 37472d
  struct mwOpaque auth_data;  /**< authentication data */
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.4.1.4 LoginAck */
Packit Service 37472d
Packit Service 37472d
struct mwMsgLoginAck {
Packit Service 37472d
  struct mwMessage head;
Packit Service 37472d
  struct mwLoginInfo login;
Packit Service 37472d
  struct mwPrivacyInfo privacy;
Packit Service 37472d
  struct mwUserStatus status;
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.4.1.5 LoginCont */
Packit Service 37472d
Packit Service 37472d
struct mwMsgLoginContinue {
Packit Service 37472d
  struct mwMessage head;
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.4.1.6 AuthPassed */
Packit Service 37472d
Packit Service 37472d
struct mwMsgLoginRedirect {
Packit Service 37472d
  struct mwMessage head;
Packit Service 37472d
  char *host;
Packit Service 37472d
  char *server_id;
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.4.1.7 CreateCnl */
Packit Service 37472d
Packit Service 37472d
/** an offer of encryption items */
Packit Service 37472d
struct mwEncryptOffer {
Packit Service 37472d
  guint16 mode;   /**< encryption mode */
Packit Service 37472d
  GList *items;   /**< list of mwEncryptItem offered */
Packit Service 37472d
  guint16 extra;  /**< encryption mode again? */
Packit Service 37472d
  gboolean flag;  /**< unknown flag */
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
struct mwMsgChannelCreate {
Packit Service 37472d
  struct mwMessage head;
Packit Service 37472d
  guint32 reserved;         /**< unknown reserved data */
Packit Service 37472d
  guint32 channel;          /**< intended ID for new channel */
Packit Service 37472d
  struct mwIdBlock target;  /**< User ID. for service use */
Packit Service 37472d
  guint32 service;          /**< ID for the target service */
Packit Service 37472d
  guint32 proto_type;       /**< protocol type for the service */
Packit Service 37472d
  guint32 proto_ver;        /**< protocol version for the service */
Packit Service 37472d
  guint32 options;          /**< options */
Packit Service 37472d
  struct mwOpaque addtl;    /**< service-specific additional data */
Packit Service 37472d
  gboolean creator_flag;    /**< indicate presence of creator information */
Packit Service 37472d
  struct mwLoginInfo creator;
Packit Service 37472d
  struct mwEncryptOffer encrypt;
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.4.1.8 AcceptCnl */
Packit Service 37472d
Packit Service 37472d
/** a selected encryption item from those offered */
Packit Service 37472d
struct mwEncryptAccept {
Packit Service 37472d
  guint16 mode;                /**< encryption mode */
Packit Service 37472d
  struct mwEncryptItem *item;  /**< chosen mwEncryptItem (optional) */
Packit Service 37472d
  guint16 extra;               /**< encryption mode again? */
Packit Service 37472d
  gboolean flag;               /**< unknown flag */
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
struct mwMsgChannelAccept {
Packit Service 37472d
  struct mwMessage head;
Packit Service 37472d
  guint32 service;         /**< ID for the channel's service */
Packit Service 37472d
  guint32 proto_type;      /**< protocol type for the service */
Packit Service 37472d
  guint32 proto_ver;       /**< protocol version for the service */
Packit Service 37472d
  struct mwOpaque addtl;   /**< service-specific additional data */
Packit Service 37472d
  gboolean acceptor_flag;  /**< indicate presence of acceptor information */
Packit Service 37472d
  struct mwLoginInfo acceptor;
Packit Service 37472d
  struct mwEncryptAccept encrypt;
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.4.1.9 SendOnCnl */
Packit Service 37472d
Packit Service 37472d
struct mwMsgChannelSend {
Packit Service 37472d
  struct mwMessage head;
Packit Service 37472d
Packit Service 37472d
  /** message type. each service defines its own send types. Type IDs
Packit Service 37472d
      are only necessarily unique within a given service. */
Packit Service 37472d
  guint16 type;
Packit Service 37472d
Packit Service 37472d
  /** protocol data to be interpreted by the handling service */
Packit Service 37472d
  struct mwOpaque data;
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.4.1.10 DestroyCnl */
Packit Service 37472d
Packit Service 37472d
struct mwMsgChannelDestroy {
Packit Service 37472d
  struct mwMessage head;
Packit Service 37472d
  guint32 reason;        /**< reason for closing the channel. */
Packit Service 37472d
  struct mwOpaque data;  /**< additional information */
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.4.1.11 SetUserStatus */
Packit Service 37472d
Packit Service 37472d
struct mwMsgSetUserStatus {
Packit Service 37472d
  struct mwMessage head;
Packit Service 37472d
  struct mwUserStatus status;
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.4.1.12 SetPrivacyList */
Packit Service 37472d
Packit Service 37472d
struct mwMsgSetPrivacyList {
Packit Service 37472d
  struct mwMessage head;
Packit Service 37472d
  struct mwPrivacyInfo privacy;
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* Sense Service */
Packit Service 37472d
Packit Service 37472d
/** Sent to the server to request the presense of a service by its
Packit Service 37472d
    ID. Sent to the client to indicate the presense of such a
Packit Service 37472d
    service */
Packit Service 37472d
struct mwMsgSenseService {
Packit Service 37472d
  struct mwMessage head;
Packit Service 37472d
  guint32 service;
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* Admin */
Packit Service 37472d
Packit Service 37472d
/** An administrative broadcast message */
Packit Service 37472d
struct mwMsgAdmin {
Packit Service 37472d
  struct mwMessage head;
Packit Service 37472d
  char *text;
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* Announce */
Packit Service 37472d
Packit Service 37472d
/** An announcement between users */
Packit Service 37472d
struct mwMsgAnnounce {
Packit Service 37472d
  struct mwMessage head;
Packit Service 37472d
  gboolean sender_present;    /**< indicates presence of sender data */
Packit Service 37472d
  struct mwLoginInfo sender;  /**< who sent the announcement */
Packit Service 37472d
  guint16 unknown_a;          /**< unknown A. Usually 0x00 */
Packit Service 37472d
  gboolean may_reply;         /**< replies allowed */
Packit Service 37472d
  char *text;                 /**< text of message */
Packit Service 37472d
Packit Service 37472d
  /** list of (char *) indicating recipients. Recipient users are in
Packit Service 37472d
      the format "@U username" and recipient NAB groups are in the
Packit Service 37472d
      format "@G groupname" */
Packit Service 37472d
  GList *recipients;
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
#ifdef __cplusplus
Packit Service 37472d
}
Packit Service 37472d
#endif
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
#endif /* _MW_MESSAGE_H */
Packit Service 37472d