Blame src/mw_message.h.fix-glib-headers

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