Blame src/mw_common.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_COMMON_H
Packit Service 37472d
#define _MW_COMMON_H
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** @file mw_common.h
Packit Service 37472d
Packit Service 37472d
    Common data types and functions for handling those types.
Packit Service 37472d
Packit Service 37472d
    Functions in this file all fit into similar naming conventions of
Packit Service 37472d
    TYPE_ACTION as per the activity they perform. The
Packit Service 37472d
    following actions are available:
Packit Service 37472d
Packit Service 37472d
    void TYPE_put(struct mwPutBuffer *b, TYPE *val)
Packit Service 37472d
    - marshalls val onto the buffer b. The buffer will grow as necessary
Packit Service 37472d
    to fit all the data put into it. For guint16, guint32, and
Packit Service 37472d
    gboolean, TYPE val is used instead of TYPE
Packit Service 37472d
    \*val.
Packit Service 37472d
Packit Service 37472d
    void TYPE_get(struct mwGetBuffer *b, TYPE *val)
Packit Service 37472d
    - unmarshals val from the buffer b. Failure (due to lack of
Packit Service 37472d
    insufficient remaining buffer) is indicated in the buffer's error
Packit Service 37472d
    field. A call to a _get function with a buffer in an error state
Packit Service 37472d
    has to effect.
Packit Service 37472d
Packit Service 37472d
    void TYPE_clear(TYPE *val)
Packit Service 37472d
    - zeros and frees internal members of val, but does not free val
Packit Service 37472d
    itself. Needs to be called before free-ing any complex types which
Packit Service 37472d
    have been unmarshalled from a TYPE_get or populated from a
Packit Service 37472d
    TYPE_clone call to prevent memory leaks.
Packit Service 37472d
Packit Service 37472d
    void TYPE_clone(TYPE *to, TYPE *from)
Packit Service 37472d
    - copies/clones members of from into to. May result in memory
Packit Service 37472d
    allocation for some types. Note that to is not cleared
Packit Service 37472d
    before-hand, it must already be in a pristine condition.
Packit Service 37472d
Packit Service 37472d
    gboolean TYPE_equal(TYPE *y, TYPE *z)
Packit Service 37472d
    - simple equality test.
Packit Service 37472d
*/
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
#include <glib.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
/** @struct mwPutBuffer
Packit Service 37472d
    buffer to be written to */
Packit Service 37472d
struct mwPutBuffer;
Packit Service 37472d
Packit Service 37472d
/** @struct mwGetBuffer
Packit Service 37472d
    buffer to be read from */
Packit Service 37472d
struct mwGetBuffer;
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** A length of binary data, not null-terminated. */
Packit Service 37472d
struct mwOpaque {
Packit Service 37472d
  gsize len;     /**< length of data. */
Packit Service 37472d
  guchar *data;  /**< data, normally with no NULL termination */
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.3.6 Login Types */
Packit Service 37472d
Packit Service 37472d
/** The type of login. Normally meaning the type of client code being
Packit Service 37472d
    used to login with.
Packit Service 37472d
Packit Service 37472d
    If you know of any additional client identifiers, please add them
Packit Service 37472d
    below or submit an RFE to the meanwhile tracker.
Packit Service 37472d
*/
Packit Service 37472d
enum mwLoginType {
Packit Service 37472d
  mwLogin_LIB           = 0x1000,  /**< official Lotus binary library */
Packit Service 37472d
  mwLogin_JAVA_WEB      = 0x1001,  /**< official Lotus Java applet */
Packit Service 37472d
  mwLogin_BINARY        = 0x1002,  /**< official Lotus binary application */
Packit Service 37472d
  mwLogin_JAVA_APP      = 0x1003,  /**< official Lotus Java application */
Packit Service 37472d
  mwLogin_LINKS         = 0x100a,  /**< official Sametime Links toolkit */
Packit Service 37472d
Packit Service 37472d
  /* now we're getting crazy */
Packit Service 37472d
  mwLogin_NOTES_6_5        = 0x1200,
Packit Service 37472d
  mwLogin_NOTES_6_5_3      = 0x1203,
Packit Service 37472d
  mwLogin_NOTES_7_0_beta   = 0x1210,
Packit Service 37472d
  mwLogin_NOTES_7_0        = 0x1214,
Packit Service 37472d
  mwLogin_ICT              = 0x1300,
Packit Service 37472d
  mwLogin_ICT_1_7_8_2      = 0x1302,
Packit Service 37472d
  mwLogin_ICT_SIP          = 0x1303,
Packit Service 37472d
  mwLogin_NOTESBUDDY_4_14  = 0x1400,  /**< 0xff00 mask? */
Packit Service 37472d
  mwLogin_NOTESBUDDY_4_15  = 0x1405,
Packit Service 37472d
  mwLogin_NOTESBUDDY_4_16  = 0x1406,
Packit Service 37472d
  mwLogin_SANITY           = 0x1600,
Packit Service 37472d
  mwLogin_ST_PERL          = 0x1625,
Packit Service 37472d
  mwLogin_PMR_ALERT        = 0x1650,
Packit Service 37472d
  mwLogin_TRILLIAN         = 0x16aa,  /**< http://sf.net/st-plugin/ */
Packit Service 37472d
  mwLogin_TRILLIAN_IBM     = 0x16bb,
Packit Service 37472d
  mwLogin_MEANWHILE        = 0x1700,  /**< Meanwhile library */
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.2 Common Structures */
Packit Service 37472d
/* 8.2.1 Login Info block */
Packit Service 37472d
Packit Service 37472d
struct mwLoginInfo {
Packit Service 37472d
  char *login_id;   /**< community-unique ID of the login */
Packit Service 37472d
  guint16 type;     /**< @see mwLoginType */
Packit Service 37472d
  char *user_id;    /**< community-unique ID of the user */
Packit Service 37472d
  char *user_name;  /**< name of user (nick name, full name, etc) */
Packit Service 37472d
  char *community;  /**< community name (usually domain name) */
Packit Service 37472d
  gboolean full;    /**< if FALSE, following fields non-existant */
Packit Service 37472d
  char *desc;       /**< implementation defined description */
Packit Service 37472d
  guint32 ip_addr;  /**< ip addr of the login */
Packit Service 37472d
  char *server_id;  /**< unique ID of login's server */
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.2.2 Private Info Block */
Packit Service 37472d
Packit Service 37472d
struct mwUserItem {
Packit Service 37472d
  gboolean full;    /**< if FALSE, don't include name */
Packit Service 37472d
  char *id;         /**< user id */
Packit Service 37472d
  char *community;  /**< community */
Packit Service 37472d
  char *name;       /**< user name */
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
struct mwPrivacyInfo {
Packit Service 37472d
  gboolean deny;             /**< deny (true) or allow (false) users */
Packit Service 37472d
  guint32 count;             /**< count of users */
Packit Service 37472d
  struct mwUserItem *users;  /**< the users list */
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.3.5 User Status Types */
Packit Service 37472d
Packit Service 37472d
enum mwStatusType {
Packit Service 37472d
  mwStatus_OFFLINE = 0x0000,
Packit Service 37472d
Packit Service 37472d
  mwStatus_ACTIVE  = 0x0020,
Packit Service 37472d
  mwStatus_IDLE    = 0x0040,
Packit Service 37472d
  mwStatus_AWAY    = 0x0060,
Packit Service 37472d
  mwStatus_BUSY    = 0x0080,
Packit Service 37472d
Packit Service 37472d
  mwStatus_MASK_MOBILE = 0x0200,
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.2.3 User Status Block */
Packit Service 37472d
Packit Service 37472d
struct mwUserStatus {
Packit Service 37472d
  guint16 status;  /**< @see mwStatusType */
Packit Service 37472d
  guint32 time;    /**< last status change time in seconds */
Packit Service 37472d
  char *desc;      /**< status description */
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.2.4 ID Block */
Packit Service 37472d
Packit Service 37472d
struct mwIdBlock {
Packit Service 37472d
  char *user;       /**< user id (login id or empty for some services) */
Packit Service 37472d
  char *community;  /**< community id (NULL for same community) */
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.3.8.2 Awareness Presence Types */
Packit Service 37472d
Packit Service 37472d
/* @todo move mwAwareType, mwAwareIdBlock and mwAwareSnapshot into the
Packit Service 37472d
   aware service and out of common */
Packit Service 37472d
Packit Service 37472d
/** type codes for mwAwareIdBlock */
Packit Service 37472d
enum mwAwareType {
Packit Service 37472d
  mwAware_USER    = 0x0002,  /**< a single user */
Packit Service 37472d
  mwAware_GROUP   = 0x0003,  /**< a group */
Packit Service 37472d
  mwAware_SERVER  = 0x0008,  /**< a server */
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.4.2 Awareness Messages */
Packit Service 37472d
/* 8.4.2.1 Awareness ID Block */
Packit Service 37472d
Packit Service 37472d
struct mwAwareIdBlock {
Packit Service 37472d
  guint16 type;     /**< @see mwAwareType */
Packit Service 37472d
  char *user;       /**< user id */
Packit Service 37472d
  char *community;  /**< community id (NULL for same community) */
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* 8.4.2.4 Snapshot */
Packit Service 37472d
Packit Service 37472d
struct mwAwareSnapshot {
Packit Service 37472d
  struct mwAwareIdBlock id;
Packit Service 37472d
  char *group;                 /**< group this id belongs to */
Packit Service 37472d
  gboolean online;             /**< is this user online? */
Packit Service 37472d
  char *alt_id;                /**< alternate ID, often same as id.user */
Packit Service 37472d
  struct mwUserStatus status;  /**< status of this user */
Packit Service 37472d
  char *name;                  /**< Formatted version of ID */
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** encryption blocks */
Packit Service 37472d
struct mwEncryptItem {
Packit Service 37472d
  guint16 id;            /**< cipher identifier */
Packit Service 37472d
  struct mwOpaque info;  /**< cipher information */
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** @name buffer utility functions */
Packit Service 37472d
/*@{*/
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** allocate a new empty buffer */
Packit Service 37472d
struct mwPutBuffer *mwPutBuffer_new(void);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** write raw data to the put buffer */
Packit Service 37472d
void mwPutBuffer_write(struct mwPutBuffer *b, gpointer data, gsize len);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** destroy the buffer */
Packit Service 37472d
void mwPutBuffer_free(struct mwPutBuffer *b);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** move the buffer's data into an opaque, destroy the buffer */
Packit Service 37472d
void mwPutBuffer_finalize(struct mwOpaque *to, struct mwPutBuffer *from);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** allocate a new buffer with a copy of the given data */
Packit Service 37472d
struct mwGetBuffer *mwGetBuffer_new(struct mwOpaque *data);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** read len bytes of raw data from the get buffer into mem. If len is
Packit Service 37472d
    greater than the count of bytes remaining in the buffer, the
Packit Service 37472d
    buffer's error flag will NOT be set.
Packit Service 37472d
Packit Service 37472d
    @returns count of bytes successfully copied to mem */
Packit Service 37472d
gsize mwGetBuffer_read(struct mwGetBuffer *b, gpointer mem, gsize len);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** skip len bytes in the get buffer. If len is greater than the count
Packit Service 37472d
    of bytes remaining in the buffer, the buffer's error flag will NOT
Packit Service 37472d
    be set.
Packit Service 37472d
Packit Service 37472d
    @returns count of bytes successfully skipped */
Packit Service 37472d
gsize mwGetBuffer_advance(struct mwGetBuffer *b, gsize len);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** allocate a new buffer backed by the given data. Calling
Packit Service 37472d
    mwGetBuffer_free will not result in the underlying data being
Packit Service 37472d
    freed */
Packit Service 37472d
struct mwGetBuffer *mwGetBuffer_wrap(const struct mwOpaque *data);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** destroy the buffer */
Packit Service 37472d
void mwGetBuffer_free(struct mwGetBuffer *b);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** reset the buffer to the very beginning. Also clears the buffer's
Packit Service 37472d
    error flag. */
Packit Service 37472d
void mwGetBuffer_reset(struct mwGetBuffer *b);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** count of remaining available bytes */
Packit Service 37472d
gsize mwGetBuffer_remaining(struct mwGetBuffer *b);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** TRUE if an error occurred while reading a basic type from this
Packit Service 37472d
    buffer */
Packit Service 37472d
gboolean mwGetBuffer_error(struct mwGetBuffer *b);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/*@}*/
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** @name Basic Data Types
Packit Service 37472d
    The basic types are combined to construct the compound types.
Packit Service 37472d
 */
Packit Service 37472d
/*@{*/
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void guint16_put(struct mwPutBuffer *b, guint16 val);
Packit Service 37472d
Packit Service 37472d
void guint16_get(struct mwGetBuffer *b, guint16 *val);
Packit Service 37472d
Packit Service 37472d
guint16 guint16_peek(struct mwGetBuffer *b);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void guint32_put(struct mwPutBuffer *b, guint32 val);
Packit Service 37472d
Packit Service 37472d
void guint32_get(struct mwGetBuffer *b, guint32 *val);
Packit Service 37472d
Packit Service 37472d
guint32 guint32_peek(struct mwGetBuffer *b);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void gboolean_put(struct mwPutBuffer *b, gboolean val);
Packit Service 37472d
Packit Service 37472d
void gboolean_get(struct mwGetBuffer *b, gboolean *val);
Packit Service 37472d
Packit Service 37472d
gboolean gboolean_peek(struct mwGetBuffer *b);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwString_put(struct mwPutBuffer *b, const char *str);
Packit Service 37472d
Packit Service 37472d
void mwString_get(struct mwGetBuffer *b, char **str);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwOpaque_put(struct mwPutBuffer *b, const struct mwOpaque *o);
Packit Service 37472d
Packit Service 37472d
void mwOpaque_get(struct mwGetBuffer *b, struct mwOpaque *o);
Packit Service 37472d
Packit Service 37472d
void mwOpaque_clear(struct mwOpaque *o);
Packit Service 37472d
Packit Service 37472d
void mwOpaque_free(struct mwOpaque *o);
Packit Service 37472d
Packit Service 37472d
void mwOpaque_clone(struct mwOpaque *to, const struct mwOpaque *from);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/*@}*/
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** @name Compound Data Types */
Packit Service 37472d
/*@{*/
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwLoginInfo_put(struct mwPutBuffer *b, const struct mwLoginInfo *info);
Packit Service 37472d
Packit Service 37472d
void mwLoginInfo_get(struct mwGetBuffer *b, struct mwLoginInfo *info);
Packit Service 37472d
Packit Service 37472d
void mwLoginInfo_clear(struct mwLoginInfo *info);
Packit Service 37472d
Packit Service 37472d
void mwLoginInfo_clone(struct mwLoginInfo *to, const struct mwLoginInfo *from);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwUserItem_put(struct mwPutBuffer *b, const struct mwUserItem *user);
Packit Service 37472d
Packit Service 37472d
void mwUserItem_get(struct mwGetBuffer *b, struct mwUserItem *user);
Packit Service 37472d
Packit Service 37472d
void mwUserItem_clear(struct mwUserItem *user);
Packit Service 37472d
Packit Service 37472d
void mwUserItem_clone(struct mwUserItem *to, const struct mwUserItem *from);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwPrivacyInfo_put(struct mwPutBuffer *b,
Packit Service 37472d
		       const struct mwPrivacyInfo *info);
Packit Service 37472d
Packit Service 37472d
void mwPrivacyInfo_get(struct mwGetBuffer *b, struct mwPrivacyInfo *info);
Packit Service 37472d
Packit Service 37472d
void mwPrivacyInfo_clear(struct mwPrivacyInfo *info);
Packit Service 37472d
Packit Service 37472d
void mwPrivacyInfo_clone(struct mwPrivacyInfo *to,
Packit Service 37472d
			 const struct mwPrivacyInfo *from);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwUserStatus_put(struct mwPutBuffer *b,
Packit Service 37472d
		      const struct mwUserStatus *stat);
Packit Service 37472d
Packit Service 37472d
void mwUserStatus_get(struct mwGetBuffer *b, struct mwUserStatus *stat);
Packit Service 37472d
Packit Service 37472d
void mwUserStatus_clear(struct mwUserStatus *stat);
Packit Service 37472d
Packit Service 37472d
void mwUserStatus_clone(struct mwUserStatus *to,
Packit Service 37472d
			const struct mwUserStatus *from);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwIdBlock_put(struct mwPutBuffer *b, const struct mwIdBlock *id);
Packit Service 37472d
Packit Service 37472d
void mwIdBlock_get(struct mwGetBuffer *b, struct mwIdBlock *id);
Packit Service 37472d
Packit Service 37472d
void mwIdBlock_clear(struct mwIdBlock *id);
Packit Service 37472d
Packit Service 37472d
void mwIdBlock_clone(struct mwIdBlock *to,
Packit Service 37472d
		     const struct mwIdBlock *from);
Packit Service 37472d
Packit Service 37472d
guint mwIdBlock_hash(const struct mwIdBlock *idb);
Packit Service 37472d
Packit Service 37472d
gboolean mwIdBlock_equal(const struct mwIdBlock *a,
Packit Service 37472d
			 const struct mwIdBlock *b);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwAwareIdBlock_put(struct mwPutBuffer *b,
Packit Service 37472d
			const struct mwAwareIdBlock *idb);
Packit Service 37472d
Packit Service 37472d
void mwAwareIdBlock_get(struct mwGetBuffer *b, struct mwAwareIdBlock *idb);
Packit Service 37472d
Packit Service 37472d
void mwAwareIdBlock_clear(struct mwAwareIdBlock *idb);
Packit Service 37472d
Packit Service 37472d
void mwAwareIdBlock_clone(struct mwAwareIdBlock *to,
Packit Service 37472d
			  const struct mwAwareIdBlock *from);
Packit Service 37472d
Packit Service 37472d
guint mwAwareIdBlock_hash(const struct mwAwareIdBlock *a);
Packit Service 37472d
Packit Service 37472d
gboolean mwAwareIdBlock_equal(const struct mwAwareIdBlock *a,
Packit Service 37472d
			      const struct mwAwareIdBlock *b);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwAwareSnapshot_get(struct mwGetBuffer *b,
Packit Service 37472d
			 struct mwAwareSnapshot *idb);
Packit Service 37472d
Packit Service 37472d
void mwAwareSnapshot_clear(struct mwAwareSnapshot *idb);
Packit Service 37472d
Packit Service 37472d
void mwAwareSnapshot_clone(struct mwAwareSnapshot *to,
Packit Service 37472d
			   const struct mwAwareSnapshot *from);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwEncryptItem_put(struct mwPutBuffer *b,
Packit Service 37472d
		       const struct mwEncryptItem *item);
Packit Service 37472d
Packit Service 37472d
void mwEncryptItem_get(struct mwGetBuffer *b, struct mwEncryptItem *item);
Packit Service 37472d
Packit Service 37472d
void mwEncryptItem_clear(struct mwEncryptItem *item);
Packit Service 37472d
Packit Service 37472d
void mwEncryptItem_free(struct mwEncryptItem *item);
Packit Service 37472d
Packit Service 37472d
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_COMMON_H */