1 /* 2 * gibber-r-multicast-sender.h - Header for GibberRMulticastSender 3 * Copyright (C) 2006 Collabora Ltd. 4 * @author Sjoerd Simons <sjoerd@luon.net> 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21 #ifndef __GIBBER_R_MULTICAST_SENDER_H__ 22 #define __GIBBER_R_MULTICAST_SENDER_H__ 23 24 #include <glib-object.h> 25 26 #include "gibber-r-multicast-packet.h" 27 28 G_BEGIN_DECLS 29 30 typedef struct _GibberRMulticastSenderGroup GibberRMulticastSenderGroup; 31 32 struct _GibberRMulticastSenderGroup { 33 /* <public> 34 * GUINT_TO_POINTER (sender_id) => owned GibberRMulticastSender */ 35 GHashTable *senders; 36 /* <private> */ 37 gboolean popping; 38 gboolean stopped; 39 /* queue of GibberRMulticast GibberRMulticastSender */ 40 GQueue *pop_queue; 41 /* GArray of pending removal GibberRMulticastSenders */ 42 GPtrArray *pending_removal; 43 }; 44 45 typedef struct _GibberRMulticastSender GibberRMulticastSender; 46 typedef struct _GibberRMulticastSenderClass GibberRMulticastSenderClass; 47 48 struct _GibberRMulticastSenderClass { 49 GObjectClass parent_class; 50 }; 51 52 typedef enum { 53 /* We have no info about this sender whatsoever */ 54 GIBBER_R_MULTICAST_SENDER_STATE_NEW = 0, 55 /* We know the sequence number we have to start from, but haven't send out 56 * any data yet */ 57 GIBBER_R_MULTICAST_SENDER_STATE_PREPARING, 58 /* Non-data Packets are flowing */ 59 GIBBER_R_MULTICAST_SENDER_STATE_RUNNING, 60 /* Data is flowing */ 61 GIBBER_R_MULTICAST_SENDER_STATE_DATA_RUNNING, 62 /* Node has failed, still pop packets but stop depending on it */ 63 GIBBER_R_MULTICAST_SENDER_STATE_FAILED, 64 GIBBER_R_MULTICAST_SENDER_STATE_UNKNOWN_FAILED, 65 GIBBER_R_MULTICAST_SENDER_STATE_STOPPED, 66 /* Will be removed as soon as all dependencies are resolved */ 67 GIBBER_R_MULTICAST_SENDER_STATE_PENDING_REMOVAL, 68 } GibberRMulticastSenderState; 69 70 struct _GibberRMulticastSender { 71 GObject parent; 72 gchar *name; 73 guint32 id; 74 75 GibberRMulticastSenderState state; 76 77 /* Next packet we want to send out */ 78 guint32 next_output_packet; 79 /* Next data packet we want to send out. Can be different from 80 * next_output_packet iff holding back data or a fragmented data message is 81 * interleaved with control messages.. Guaranteed to be <= 82 * next_output_packet */ 83 guint32 next_output_data_packet; 84 85 /* Next packet we expect from the sender */ 86 guint32 next_input_packet; 87 }; 88 89 GType gibber_r_multicast_sender_get_type (void); 90 91 /* TYPE MACROS */ 92 #define GIBBER_TYPE_R_MULTICAST_SENDER \ 93 (gibber_r_multicast_sender_get_type ()) 94 #define GIBBER_R_MULTICAST_SENDER(obj) \ 95 (G_TYPE_CHECK_INSTANCE_CAST((obj), GIBBER_TYPE_R_MULTICAST_SENDER, \ 96 GibberRMulticastSender)) 97 #define GIBBER_R_MULTICAST_SENDER_CLASS(klass) \ 98 (G_TYPE_CHECK_CLASS_CAST((klass), GIBBER_TYPE_R_MULTICAST_SENDER, \ 99 GibberRMulticastSenderClass)) 100 #define GIBBER_IS_R_MULTICAST_SENDER(obj) \ 101 (G_TYPE_CHECK_INSTANCE_TYPE((obj), GIBBER_TYPE_R_MULTICAST_SENDER)) 102 #define GIBBER_IS_R_MULTICAST_SENDER_CLASS(klass) \ 103 (G_TYPE_CHECK_CLASS_TYPE((klass), GIBBER_TYPE_R_MULTICAST_SENDER)) 104 #define GIBBER_R_MULTICAST_SENDER_GET_CLASS(obj) \ 105 (G_TYPE_INSTANCE_GET_CLASS ((obj), GIBBER_TYPE_R_MULTICAST_SENDER, \ 106 GibberRMulticastSenderClass)) 107 108 GibberRMulticastSenderGroup *gibber_r_multicast_sender_group_new (void); 109 110 void gibber_r_multicast_sender_group_free (GibberRMulticastSenderGroup *group); 111 void gibber_r_multicast_sender_group_stop (GibberRMulticastSenderGroup *group); 112 void gibber_r_multicast_sender_group_add (GibberRMulticastSenderGroup *group, 113 GibberRMulticastSender *sender); 114 115 GibberRMulticastSender * gibber_r_multicast_sender_group_lookup ( 116 GibberRMulticastSenderGroup *group, guint32 sender_id); 117 118 GibberRMulticastSender * gibber_r_multicast_sender_group_lookup_by_name ( 119 GibberRMulticastSenderGroup *group, const gchar *name); 120 121 void gibber_r_multicast_sender_group_remove ( 122 GibberRMulticastSenderGroup *group, guint32 sender_id); 123 124 gboolean gibber_r_multicast_sender_group_push_packet ( 125 GibberRMulticastSenderGroup *group, GibberRMulticastPacket *packet); 126 127 GibberRMulticastSender *gibber_r_multicast_sender_new (guint32 id, 128 const gchar *name, GibberRMulticastSenderGroup *group); 129 130 /* Sequence for this sender starts at packet_id */ 131 void gibber_r_multicast_sender_update_start (GibberRMulticastSender *sender, 132 guint32 packet_id); 133 134 void gibber_r_multicast_sender_update_end (GibberRMulticastSender *sender, 135 guint32 packet_id); 136 137 void gibber_r_multicast_sender_set_failed (GibberRMulticastSender *sender); 138 139 void gibber_r_multicast_sender_set_data_start (GibberRMulticastSender *sender, 140 guint32 packet_id); 141 142 /* Tell the sender to not signal data starting from this packet */ 143 void gibber_r_multicast_sender_hold_data (GibberRMulticastSender *sender, 144 guint32 packet_id); 145 146 147 /* Stop holding back data of the sender */ 148 void gibber_r_multicast_sender_release_data (GibberRMulticastSender *sender); 149 150 void gibber_r_multicast_sender_push (GibberRMulticastSender *sender, 151 GibberRMulticastPacket *packet); 152 153 void 154 gibber_r_multicast_senders_updated (GibberRMulticastSender *sender); 155 156 /* Returns TRUE if we were up to dated */ 157 gboolean gibber_r_multicast_sender_seen (GibberRMulticastSender *sender, 158 guint32 id); 159 160 gboolean gibber_r_multicast_sender_repair_request ( 161 GibberRMulticastSender *sender, guint32 id); 162 163 void gibber_r_multicast_sender_whois_push (GibberRMulticastSender *sender, 164 const GibberRMulticastPacket *packet); 165 166 void gibber_r_multicast_sender_set_packet_repeat ( 167 GibberRMulticastSender *sender, guint32 packet_id, gboolean repeat); 168 169 /* Returns the amount of unpopped or unacked packets */ 170 guint gibber_r_multicast_sender_packet_cache_size ( 171 GibberRMulticastSender *sender); 172 173 /* Ack management */ 174 void gibber_r_multicast_sender_ack (GibberRMulticastSender *sender, 175 guint32 ack); 176 177 /* Stop all pending requests, only reply to repair requests */ 178 void gibber_r_multicast_sender_stop (GibberRMulticastSender *sender); 179 180 /* Trigger failure detection, for testing only */ 181 void _gibber_r_multicast_TEST_sender_fail (GibberRMulticastSender *sender); 182 183 G_END_DECLS 184 185 #endif /* #ifndef __GIBBER_R_MULTICAST_SENDER_H__*/ 186