/* BTP library - Banana Tree Protocol
 * Copyright (C) 1999-2001  The Regents of the University of Michigan
 *
 * 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 Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA  02111-1307, USA.
 */

#ifndef _BTP_H
#define _BTP_H


#include <glib.h>
#include <gnet/gnet.h>
/* No other dependencies */


/*

  Upper-level API for BTP.

  The Banana Tree Protocol is an end-to-end multicast tree creation
  protocol.  It tries to create a low-cost tree, not a low-delay tree.
  BTP is built ontop of TCP, but it could use UDP (with some
  additional tuning).

  It does:
    joining, switching, and leaving parents
    information (degree limit, neighbors)
    pinging and ponging

  It does not:
    transfer packets reliably
    request/retransmit lost packets
    eliminate duplicate packets

*/



/* **************************************** */

#define BTP_PORT   	5656


typedef struct _Btp Btp;

typedef void (*BtpPacketFunc)(Btp* btp, const void* buffer, guint length, gpointer user_data);
typedef void (*BtpErrorFunc) (Btp* btp, gpointer user_data);


struct _Btp
{
  /* Packet read callback and data (programmer sets) */
  BtpPacketFunc   packet_func;
  gpointer 	  packet_user_data;

  /* Error callback and data (programmer sets) */
  BtpErrorFunc    error_func;
  gpointer 	  error_user_data;

  /* ******************** */
  /* Private */

  struct _BtpTree* 	tree;

};

#define BTP_MAX_DEGREE	5

#include "b_peer.h"

Btp*  	    btp_create (BPeer* peer, const gchar* name);
Btp*  	    btp_join (BPeer* peer, const GURL* url);
void  	    btp_leave (Btp* btp);
gboolean    btp_has (BPeer* peer, const gchar* name); 

guint	    btp_get_max_degree (Btp* btp);
void        btp_set_max_degree (Btp* btp, guint max_degree);
gboolean    btp_get_follow_nodes (Btp* btp);
void        btp_set_follow_nodes (Btp* btp, gboolean follow_nodes);
gboolean    btp_get_use_shortcuts (Btp* btp);
void	    btp_set_use_shortcuts (Btp* btp, gboolean use_shortcuts);

GURL*       btp_get_url (Btp* btp);	/* callee owns */
gboolean    btp_is_up (const Btp* btp);

void        btp_send (Btp* btp, const guint8* buffer, guint16 length);

void	    btp_print (FILE* file, BPeer* peer);

/* Connect to the root.  Used for climbing. */
Btp*        btp_join_passive (BPeer* peer, const GURL* url);


#endif /* _BTP_H */


syntax highlighted by Code2HTML, v. 0.9.1