00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _MW_MESSAGE_H
00022 #define _MW_MESSAGE_H
00023
00024
00025 #include <glib/glist.h>
00026 #include "mw_common.h"
00027
00028
00029 #ifdef __cplusplus
00030 extern "C" {
00031 #endif
00032
00033
00036 #define MW_MESSAGE(msg) (&msg->head)
00037
00038
00040 enum mwMessageType {
00041 mwMessage_HANDSHAKE = 0x0000,
00042 mwMessage_HANDSHAKE_ACK = 0x8000,
00043 mwMessage_LOGIN = 0x0001,
00044 mwMessage_LOGIN_ACK = 0x8001,
00045 mwMessage_LOGIN_REDIRECT = 0x0018,
00046 mwMessage_LOGIN_CONTINUE = 0x0016,
00048 mwMessage_CHANNEL_CREATE = 0x0002,
00049 mwMessage_CHANNEL_DESTROY = 0x0003,
00050 mwMessage_CHANNEL_SEND = 0x0004,
00051 mwMessage_CHANNEL_ACCEPT = 0x0006,
00053 mwMessage_SET_USER_STATUS = 0x0009,
00054 mwMessage_SET_PRIVACY_LIST = 0x000b,
00055 mwMessage_SENSE_SERVICE = 0x0011,
00056 mwMessage_ADMIN = 0x0019,
00057 mwMessage_ANNOUNCE = 0x0022,
00058 };
00059
00060
00061 enum mwMessageOption {
00062 mwMessageOption_ENCRYPT = 0x4000,
00063 mwMessageOption_HAS_ATTRIBS = 0x8000,
00064 };
00065
00066
00068 #define MW_MESSAGE_HAS_OPTION(msg, opt) \
00069 ((msg)->options & (opt))
00070
00071
00072 struct mwMessage {
00073 guint16 type;
00074 guint16 options;
00075 guint32 channel;
00076 struct mwOpaque attribs;
00077 };
00078
00079
00080
00082 struct mwMessage *mwMessage_new(enum mwMessageType type);
00083
00084
00086 struct mwMessage *mwMessage_get(struct mwGetBuffer *b);
00087
00088
00089 void mwMessage_put(struct mwPutBuffer *b, struct mwMessage *msg);
00090
00091
00092 void mwMessage_free(struct mwMessage *msg);
00093
00094
00095
00096
00097
00098
00099 struct mwMsgHandshake {
00100 struct mwMessage head;
00101 guint16 major;
00102 guint16 minor;
00103 guint32 srvrcalc_addr;
00104 guint16 login_type;
00105 guint32 loclcalc_addr;
00106 guint16 unknown_a;
00107 guint32 unknown_b;
00108 char *local_host;
00109 };
00110
00111
00112
00113
00114 struct mwMsgHandshakeAck {
00115 struct mwMessage head;
00116 guint16 major;
00117 guint16 minor;
00118 guint32 srvrcalc_addr;
00119 guint32 magic;
00120 struct mwOpaque data;
00121 };
00122
00123
00124
00125
00126 enum mwAuthType {
00127 mwAuthType_PLAIN = 0x0000,
00128 mwAuthType_TOKEN = 0x0001,
00129 mwAuthType_ENCRYPT = 0x0002,
00130 mwAuthType_RC2_40 = 0x0002,
00131 mwAuthType_RC2_128 = 0x0004,
00132 };
00133
00134
00135
00136
00137 struct mwMsgLogin {
00138 struct mwMessage head;
00139 guint16 login_type;
00140 char *name;
00141 guint16 auth_type;
00142 struct mwOpaque auth_data;
00143 };
00144
00145
00146
00147
00148 struct mwMsgLoginAck {
00149 struct mwMessage head;
00150 struct mwLoginInfo login;
00151 struct mwPrivacyInfo privacy;
00152 struct mwUserStatus status;
00153 };
00154
00155
00156
00157
00158 struct mwMsgLoginContinue {
00159 struct mwMessage head;
00160 };
00161
00162
00163
00164
00165 struct mwMsgLoginRedirect {
00166 struct mwMessage head;
00167 char *host;
00168 char *server_id;
00169 };
00170
00171
00172
00173
00175 struct mwEncryptOffer {
00176 guint16 mode;
00177 GList *items;
00178 guint16 extra;
00179 gboolean flag;
00180 };
00181
00182
00183 struct mwMsgChannelCreate {
00184 struct mwMessage head;
00185 guint32 reserved;
00186 guint32 channel;
00187 struct mwIdBlock target;
00188 guint32 service;
00189 guint32 proto_type;
00190 guint32 proto_ver;
00191 guint32 options;
00192 struct mwOpaque addtl;
00193 gboolean creator_flag;
00194 struct mwLoginInfo creator;
00195 struct mwEncryptOffer encrypt;
00196 };
00197
00198
00199
00200
00202 struct mwEncryptAccept {
00203 guint16 mode;
00204 struct mwEncryptItem *item;
00205 guint16 extra;
00206 gboolean flag;
00207 };
00208
00209
00210 struct mwMsgChannelAccept {
00211 struct mwMessage head;
00212 guint32 service;
00213 guint32 proto_type;
00214 guint32 proto_ver;
00215 struct mwOpaque addtl;
00216 gboolean acceptor_flag;
00217 struct mwLoginInfo acceptor;
00218 struct mwEncryptAccept encrypt;
00219 };
00220
00221
00222
00223
00224 struct mwMsgChannelSend {
00225 struct mwMessage head;
00226
00229 guint16 type;
00230
00232 struct mwOpaque data;
00233 };
00234
00235
00236
00237
00238 struct mwMsgChannelDestroy {
00239 struct mwMessage head;
00240 guint32 reason;
00241 struct mwOpaque data;
00242 };
00243
00244
00245
00246
00247 struct mwMsgSetUserStatus {
00248 struct mwMessage head;
00249 struct mwUserStatus status;
00250 };
00251
00252
00253
00254
00255 struct mwMsgSetPrivacyList {
00256 struct mwMessage head;
00257 struct mwPrivacyInfo privacy;
00258 };
00259
00260
00261
00262
00266 struct mwMsgSenseService {
00267 struct mwMessage head;
00268 guint32 service;
00269 };
00270
00271
00272
00273
00275 struct mwMsgAdmin {
00276 struct mwMessage head;
00277 char *text;
00278 };
00279
00280
00281
00282
00284 struct mwMsgAnnounce {
00285 struct mwMessage head;
00286 gboolean sender_present;
00287 struct mwLoginInfo sender;
00288 guint16 unknown_a;
00289 gboolean may_reply;
00290 char *text;
00295 GList *recipients;
00296 };
00297
00298
00299 #ifdef __cplusplus
00300 }
00301 #endif
00302
00303
00304 #endif
00305