1 #include "opensrf/transport_client.h"
2 #include "opensrf/transport_message.h"
5 #include "osrfConfig.h"
6 #include "opensrf/utils.h"
10 Maintains a set of transport clients
13 struct __osrfTransportGroupStruct {
14 osrfHash* nodes; /* our hash of nodes keyed by domain */
15 osrfHashIterator* itr; /* points to the next node in the list */
17 typedef struct __osrfTransportGroupStruct osrfTransportGroup;
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 */
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 */
31 typedef struct __osrfTransportGroupNode osrfTransportGroupNode;
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
43 osrfTransportGroupNode* osrfNewTransportGroupNode(
44 char* domain, int port, char* username, char* password, char* resource );
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.
53 osrfTransportGroup* osrfNewTransportGroup( char* router, osrfTransportGroupNode* nodes[], int count );
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
60 int osrfTransportGroupConnect( osrfTransportGroup* grp );
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.
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.
77 int osrfTransportGroupSend( osrfTransportGroup* grp, transport_message* msg );
80 Sends the message to the exact recipient. No failover is attempted.
81 @return 0 on success, -1 on error.
83 int osrfTransportGroupSendMatch( osrfTransportGroup* grp, transport_message* msg );
86 int _osrfTGServerSend( osrfTransportGroup* grp, char* domain, transport_message* msg );
87 int _osrfTGClientSend( osrfTransportGroup* grp, char* domain, transport_message* msg );
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
97 transport_message* osrfTransportGroupRecvAll( osrfTransportGroup* grp, int timeout );
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
105 transport_message* osrfTransportGroupRecv( osrfTransportGroup* grp, char* domain, int timeout );
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
113 void osrfTransportGroupSetInactive( osrfTransportGroup* grp, char* domain );
117 Finds a node in our list of nodes
119 osrfTransportGroupNode* __osrfTransportGroupFindNode( osrfTransportGroup* grp, char* domain );