Blame src/mw_message.h

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