--- a/src/protocols/sametime/meanwhile/mw_channel.h Fri Jan 20 00:19:53 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,366 +0,0 @@ - -/* - Meanwhile - Unofficial Lotus Sametime Community Client Library - Copyright (C) 2004 Christopher (siege) O'Brien - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef _MW_CHANNEL_H -#define _MW_CHANNEL_H - - -#include <time.h> -#include "mw_common.h" - - -/** @file mw_channel.h - -Life-cycle of an outgoing channel: - -1: mwChannel_new is called. If there is a channel in the outgoing -collection in state NEW, then it is returned. Otherwise, a channel -is allocated, assigned a unique outgoing id, marked as NEW, and -returned. - -2: channel is set to INIT status (effectively earmarking it as in- -use). fields on the channel can then be set as necessary to -prepare it for creation. - -3: mwChannel_create is called. The channel is marked to WAIT status -and a message is sent to the server. The channel is also marked as -inactive as of that moment. - -4: the channel is accepted (step 5) or rejected (step 7) - -5: an accept message is received from the server, and the channel -is marked as OPEN, and the inactive mark is removed. And messages -in the in or out queues for that channel are processed. The channel -is now ready to be used. - -6: data is sent and received over the channel - -7: the channel is closed either by receipt of a close message or by -local action. If by local action, then a close message is sent to -the server. The channel is cleaned up, its queues dumped, and it -is set to NEW status to await re-use. - -Life-cycle of an incoming channel: - -1: a channel create message is received. A channel is allocated and -given an id matching the message. It is placed in status WAIT, and -marked as inactive as of that moment. The service matching that -channel is alerted of the incoming creation request. - -2: the service can either accept (step 3) or reject (step 5) the -channel - -3: mwChannel_accept is called. The channel is marked as OPEN, and -an accept message is sent to the server. And messages in the in or -out queues for that channel are processed. The channel is now ready -to be used. - -4: data is sent and received over the channel - -5: The channel is closed either by receipt of a close message or by -local action. If by local action, then a close message is sent to -the server. The channel is cleaned up, its queues dumped, and it -is deallocated. */ - - -/* place-holders */ -struct mwCipherInstance; -struct mwMsgChannelAccept; -struct mwMsgChannelCreate; -struct mwMsgChannelDestroy; -struct mwMsgChannelSend; -struct mwService; -struct mwSession; - - - -/** @struct mwChannel - Represents a channel to a service */ -struct mwChannel; - - -/** @struct mwChannelSet - Collection of channels */ -struct mwChannelSet; - - -/** special ID indicating the master channel */ -#define MW_MASTER_CHANNEL_ID 0x00000000 - - -/** non-zero if a channel id appears to be that of an outgoing channel */ -#define mwChannel_idIsOutgoing(id) \ - (! (0x80000000 & (id))) - -/** non-zero if a channel id appears to be that of an incoming channel */ -#define mwChannel_idIsIncoming(id) \ - (! mwChannel_idIsOutgoing(id)) - -/** non-zero if a channel appears to be an outgoing channel */ -#define mwChannel_isOutgoing(chan) \ - mwChannel_idIsOutgoing(mwChannel_getId(chan)) - -/** non-zero if a channel appears to be an incoming channel */ -#define mwChannel_isIncoming(chan) \ - mwChannel_idIsIncoming(mwChannel_getId(chan)) - - -/** channel status */ -enum mwChannelState { - mwChannel_NEW, /**< channel is newly allocated, in the pool */ - mwChannel_INIT, /**< channel is being prepared, out of the pool */ - mwChannel_WAIT, /**< channel is waiting for accept */ - mwChannel_OPEN, /**< channel is accepted and open */ - mwChannel_DESTROY, /**< channel is being destroyed */ - mwChannel_ERROR, /**< channel is being destroyed due to error */ - mwChannel_UNKNOWN, /**< unknown state, or error determining state */ -}; - - -#define mwChannel_isState(chan, state) \ - (mwChannel_getState(chan) == (state)) - - -/** channel statistic fields. - @see mwChannel_getStatistic */ -enum mwChannelStatField { - mwChannelStat_MSG_SENT, /**< total send-on-chan messages sent */ - mwChannelStat_MSG_RECV, /**< total send-on-chan messages received */ - mwChannelStat_U_BYTES_SENT, /**< total bytes sent, pre-encryption */ - mwChannelStat_U_BYTES_RECV, /**< total bytes received, post-decryption */ - mwChannelStat_OPENED_AT, /**< time when channel was opened */ - mwChannelStat_CLOSED_AT, /**< time when channel was closed */ -}; - - -/** @enum mwEncryptPolicy - - Policy for a channel, dictating what sort of encryption should be - used, if any, and when. -*/ -enum mwEncryptPolicy { - mwEncrypt_NONE = 0x0000, /**< encrypt none */ - mwEncrypt_WHATEVER = 0x0001, /**< encrypt whatever you want */ - mwEncrypt_ALL = 0x0002, /**< encrypt all, any cipher */ - mwEncrypt_RC2_40 = 0x1000, /**< encrypt all, RC2/40 cipher */ - mwEncrypt_RC2_128 = 0x2000, /**< encrypt all, RC2/128 cipher */ -}; - - -/** Allocate and initialize a channel set for a session */ -struct mwChannelSet *mwChannelSet_new(struct mwSession *); - - -/** Clear and deallocate a channel set. Closes, clears, and frees all - contained channels. */ -void mwChannelSet_free(struct mwChannelSet *); - - -/** Create an incoming channel with the given channel id. Channel's state - will be set to WAIT. Primarily for use in mw_session */ -struct mwChannel *mwChannel_newIncoming(struct mwChannelSet *, guint32 id); - - -/** Create an outgoing channel. Its channel ID will be generated by - the owning channel set. Channel's state will be set to INIT */ -struct mwChannel *mwChannel_newOutgoing(struct mwChannelSet *); - - -/** Obtain a reference to a channel by its id. - @returns the channel matching chan, or NULL */ -struct mwChannel *mwChannel_find(struct mwChannelSet *cs, guint32 chan); - - -/** get the ID for a channel. 0x00 indicates an error, as that is not - a permissible value */ -guint32 mwChannel_getId(struct mwChannel *); - - -/** get the session for a channel. */ -struct mwSession *mwChannel_getSession(struct mwChannel *); - - -/** get the ID of the service for a channel. This may be 0x00 for NEW - channels */ -guint32 mwChannel_getServiceId(struct mwChannel *); - - -/** get the service for a channel. This may be NULL for NEW - channels */ -struct mwService *mwChannel_getService(struct mwChannel *); - - -/** associate a channel with an owning service */ -void mwChannel_setService(struct mwChannel *chan, struct mwService *srvc); - - -/** get service-specific data. This is for use by service - implementations to easily associate information with the - channel */ -gpointer mwChannel_getServiceData(struct mwChannel *chan); - - -/** set service-specific data. This is for use by service - implementations to easily associate information with the - channel */ -void mwChannel_setServiceData(struct mwChannel *chan, - gpointer data, GDestroyNotify clean); - - -void mwChannel_removeServiceData(struct mwChannel *chan); - - -guint32 mwChannel_getProtoType(struct mwChannel *chan); - - -void mwChannel_setProtoType(struct mwChannel *chan, guint32 proto_type); - - -guint32 mwChannel_getProtoVer(struct mwChannel *chan); - - -void mwChannel_setProtoVer(struct mwChannel *chan, guint32 proto_ver); - - -/** Channel encryption policy. - - Cannot currently be set, used internally to automatically - negotiate ciphers. Future revisions may allow this to be specified - in a new channel to dictate channel encryption. - - @see enum mwEncryptPolicy -*/ -guint16 mwChannel_getEncryptPolicy(struct mwChannel *chan); - - -guint32 mwChannel_getOptions(struct mwChannel *chan); - - -void mwChannel_setOptions(struct mwChannel *chan, guint32 options); - - -/** User at the other end of the channel. The target user for outgoing - channels, the creator for incoming channels */ -struct mwLoginInfo *mwChannel_getUser(struct mwChannel *chan); - - -/** direct reference to the create addtl information for a channel */ -struct mwOpaque *mwChannel_getAddtlCreate(struct mwChannel *); - - -/** direct reference to the accept addtl information for a channel */ -struct mwOpaque *mwChannel_getAddtlAccept(struct mwChannel *); - - -/** automatically adds instances of all ciphers in the session to the - list of supported ciphers for a channel */ -void mwChannel_populateSupportedCipherInstances(struct mwChannel *chan); - - -/** add a cipher instance to a channel's list of supported - ciphers. Channel must be NEW. */ -void mwChannel_addSupportedCipherInstance(struct mwChannel *chan, - struct mwCipherInstance *ci); - - -/** the list of supported ciphers for a channel. This list will be - empty once a cipher has been selected for the channel */ -GList *mwChannel_getSupportedCipherInstances(struct mwChannel *chan); - - -/** select a cipher instance for a channel. A NULL instance indicates - that no encryption should be used. */ -void mwChannel_selectCipherInstance(struct mwChannel *chan, - struct mwCipherInstance *ci); - - -/** get the state of a channel */ -enum mwChannelState mwChannel_getState(struct mwChannel *); - - -/** obtain the value for a statistic field as a gpointer */ -gpointer mwChannel_getStatistic(struct mwChannel *chan, - enum mwChannelStatField stat); - - -/** Formally open a channel. - - For outgoing channels: instruct the session to send a channel - create message to the server, and to mark the channel (which must - be in INIT status) as being in WAIT status. - - For incoming channels: configures the channel according to options - in the channel create message. Marks the channel as being in WAIT - status -*/ -int mwChannel_create(struct mwChannel *chan); - - -/** Formally accept an incoming channel. Instructs the session to send - a channel accept message to the server, and to mark the channel as - being OPEN. */ -int mwChannel_accept(struct mwChannel *chan); - - -/** Destroy a channel. Sends a channel-destroy message to the server, - and perform cleanup to remove the channel. - - @param chan the channel to destroy - @param reason the reason code for closing the channel - @param data optional additional information -*/ -int mwChannel_destroy(struct mwChannel *chan, guint32 reason, - struct mwOpaque *data); - - -/** Compose a send-on-channel message, encrypt it as per the channel's - specification, and send it */ -int mwChannel_send(struct mwChannel *chan, guint32 msg_type, - struct mwOpaque *msg); - - -/** Compose a send-on-channel message, and if encrypt is TRUE, encrypt - it as per the channel's specification, and send it */ -int mwChannel_sendEncrypted(struct mwChannel *chan, - guint32 msg_type, struct mwOpaque *msg, - gboolean encrypt); - - -/** pass a create message to a channel for handling */ -void mwChannel_recvCreate(struct mwChannel *chan, - struct mwMsgChannelCreate *msg); - - -/** pass an accept message to a channel for handling */ -void mwChannel_recvAccept(struct mwChannel *chan, - struct mwMsgChannelAccept *msg); - - -/** pass a destroy message to a channel for handling */ -void mwChannel_recvDestroy(struct mwChannel *chan, - struct mwMsgChannelDestroy *msg); - - -/** Feed data into a channel. */ -void mwChannel_recv(struct mwChannel *chan, struct mwMsgChannelSend *msg); - - -#endif -