]> git.evergreen-ils.org Git - OpenSRF.git/blob - src/libstack/osrf_transgroup.h
made the JID functions safer
[OpenSRF.git] / src / libstack / osrf_transgroup.h
1 #include "opensrf/transport_client.h"
2 #include "opensrf/transport_message.h"
3 #include "osrf_list.h"
4 #include "osrf_hash.h"
5 #include "osrfConfig.h"
6 #include "opensrf/utils.h"
7 #include <time.h>
8
9 /**
10   Maintains a set of transport clients 
11   */
12
13 struct __osrfTransportGroupStruct {
14         osrfHash* nodes;                                                /* our hash of nodes keyed by domain */
15         osrfHashIterator* itr;                          /* points to the next node in the list */
16 };
17 typedef struct __osrfTransportGroupStruct osrfTransportGroup;
18
19
20 struct __osrfTransportGroupNode {
21         transport_client* connection;           /* our connection to the network */
22         char* domain;                                                   /* the domain we're connected to */
23         char* username;                                         /* username used to connect to the group of servers */
24         char* password;                                         /* password used to connect to the group of servers */
25         char* resource;                                         /* the login resource */
26         int port;                                                               /* port used to connect to the group of servers */
27
28         int active;                                                             /* true if we're able to send data on this connection */
29         time_t lastsent;                                                /* the last time we sent a message */
30 };
31 typedef struct __osrfTransportGroupNode osrfTransportGroupNode;
32
33
34 /**
35   Creates a new group node
36   @param domain The domain we're connecting to
37   @param port The port to connect on
38   @param username The login name
39   @param password The login password
40   @param resource The login resource
41   @return A new transport group node
42   */
43 osrfTransportGroupNode* osrfNewTransportGroupNode( 
44                 char* domain, int port, char* username, char* password, char* resource );
45
46
47 /**
48   Allocates and initializes a new transport group.
49   The first node in the array is the default node for client connections.
50   @param router The router name shared accross the networks
51   @param nodes The nodes in the group.
52   */
53 osrfTransportGroup* osrfNewTransportGroup( char* router, osrfTransportGroupNode* nodes[], int count );
54
55 /**
56   Attempts to connect all of the nodes in this group.
57   @param grp The transport group
58   @return The number of nodes successfully connected
59   */
60 int osrfTransportGroupConnect( osrfTransportGroup* grp );
61
62
63 /**
64   Sends a transport message by going to the next domain in the set.
65   if we have a connection for the recipient domain, then we consider it to be
66   a 'local' message.  Local messages have their recipient domains re-written to
67   match the domain of the next server in the set and they are sent directly to 
68   that server.  If we do not have a connection for the recipient domain, it is 
69   considered a 'remote' message and the message is sent directly (unchanged)
70   to the next connection in the set.
71
72   @param grp The transport group
73   @param msg The message to send 
74   @return 0 on normal successful send.  
75   Returns -1 if the message cannot be sent.  
76   */
77 int osrfTransportGroupSend( osrfTransportGroup* grp, transport_message* msg );
78
79 /**
80   Sends the message to the exact recipient.  No failover is attempted.
81   @return 0 on success, -1 on error.
82   */
83 int osrfTransportGroupSendMatch( osrfTransportGroup* grp, transport_message* msg );
84
85
86 int _osrfTGServerSend( osrfTransportGroup* grp, char* domain, transport_message* msg );
87 int _osrfTGClientSend( osrfTransportGroup* grp, char* domain, transport_message* msg );
88
89 /**
90   Waits on all connections for inbound data.
91   @param grp The transport group
92   @param timeout How long to wait for data.  0 means check for data
93   but don't wait, a negative number means to wait indefinitely
94   @return The received message or NULL if the timeout occurred before a 
95   message was received 
96  */
97 transport_message* osrfTransportGroupRecvAll( osrfTransportGroup* grp, int timeout );
98
99 /**
100   Waits for data from a single domain
101   @param grp The transport group
102   @param domain The domain to wait for data on
103   @param timeout see osrfTransportGroupRecvAll
104   */
105 transport_message* osrfTransportGroupRecv( osrfTransportGroup* grp, char* domain, int timeout );
106
107 /**
108   Tells the group that a message to the given domain failed
109   domain did not make it through;
110   @param grp The transport group
111   @param comain The failed domain
112   */
113 void osrfTransportGroupSetInactive( osrfTransportGroup* grp, char* domain );
114
115
116 /**
117   Finds a node in our list of nodes 
118   */
119 osrfTransportGroupNode* __osrfTransportGroupFindNode( osrfTransportGroup* grp, char* domain );
120
121