00001 #ifndef utu_member_h
00002 #define utu_member_h
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "protocol/peer.h"
00018 #include "hub/queue.h"
00019 #include "hub/heap.h"
00020
00021 struct Circuit;
00022
00029 typedef struct Member {
00030 bstring key;
00031 Peer *peer;
00032 MsgQueue *queue;
00033 struct Circuit *circuits;
00034 void *data;
00035
00036 struct Member *left;
00037 struct Member *right;
00038 int color;
00039
00040 Heap *routes;
00041 } Member;
00042
00043
00050 typedef struct Circuit {
00051 unsigned short hate_level;
00052 long id;
00053 Member *to;
00054
00055 struct Circuit *left;
00056 struct Circuit *right;
00057 int color;
00058 } Circuit;
00059
00063 #define MEMBER_MSG_QUEUE_LENGTH 30
00064
00066 #define CIRCUIT_COMPARATOR(x, y) ((x)->id - (y)->id)
00067
00068 SGLIB_DEFINE_RBTREE_PROTOTYPES(Circuit, left, right, color, CIRCUIT_COMPARATOR);
00069
00078 long Circuit_create(Circuit **map, Member *to);
00079
00086 void Circuit_destroy(Circuit **map, long circuit);
00087
00093 void Circuit_destroy_all(Circuit *map);
00094
00095
00097 #define MEMBER_COMPARATOR(x, y) (memcmp((x)->key->data, (y)->key->data, MIN(blength((x)->key), blength((y)->key))) + (blength((x)->key) - blength((y)->key)))
00098
00099 SGLIB_DEFINE_RBTREE_PROTOTYPES(Member, left, right, color, MEMBER_COMPARATOR);
00100
00108 Member *Member_find(Member *map, bstring pubkey);
00109
00118 Member *Member_for_circuit(Member *member, long circuit);
00119
00127 int Member_send_msg(Member *member, Message *msg);
00128
00139 Message *Member_first_msg(Member *member);
00140
00148 int Member_delete_msg(Member *member);
00149
00155 Member *Member_create(Peer *peer);
00156
00165 Member *Member_login(Member **map, Peer *peer);
00166
00167
00175 void Member_logout(Member **map, Member *member);
00176
00184 void Member_destroy(Member *mb);
00185
00186
00195 void Member_destroy_map(Member **map);
00196
00197
00198 #define Member_name(M) ((M)->peer->state->them.name)
00199 #endif