]> git.evergreen-ils.org Git - OpenSRF.git/blob - src/libtransport/transport_client.c
fixed linked list bug which as pushing app responses onto the front of the queue...
[OpenSRF.git] / src / libtransport / transport_client.c
1 #include "transport_client.h"
2
3
4 //int main( int argc, char** argv );
5
6 /*
7 int main( int argc, char** argv ) {
8
9         transport_message* recv;
10         transport_message* send;
11
12         transport_client* client = client_init( "spacely.georgialibraries.org", 5222 );
13
14         // try to connect, allow 15 second connect timeout 
15         if( client_connect( client, "admin", "asdfjkjk", "system", 15 ) ) {
16                 printf("Connected...\n");
17         } else { 
18                 printf( "NOT Connected...\n" ); exit(99); 
19         }
20
21         while( (recv = client_recv( client, -1 )) ) {
22
23                 if( recv->body ) {
24                         int len = strlen(recv->body);
25                         char buf[len + 20];
26                         memset( buf, 0, len + 20); 
27                         sprintf( buf, "Echoing...%s", recv->body );
28                         send = message_init( buf, "Echoing Stuff", "12345", recv->sender, "" );
29                 } else {
30                         send = message_init( " * ECHOING * ", "Echoing Stuff", "12345", recv->sender, "" );
31                 }
32
33                 if( send == NULL ) { printf("something's wrong"); }
34                 client_send_message( client, send );
35                                 
36                 message_free( send );
37                 message_free( recv );
38         }
39
40         printf( "ended recv loop\n" );
41
42         return 0;
43
44 }
45 */
46
47
48 transport_client* client_init( char* server, int port, char* unix_path, int component ) {
49
50         if(server == NULL) return NULL;
51
52         /* build and clear the client object */
53         size_t c_size = sizeof( transport_client);
54         transport_client* client = (transport_client*) safe_malloc( c_size );
55
56         /* build and clear the message list */
57         size_t l_size = sizeof( transport_message_list );
58         client->m_list = (transport_message_list*) safe_malloc( l_size );
59
60         client->m_list->type = MESSAGE_LIST_HEAD;
61         client->session = init_transport( server, port, unix_path, client, component );
62
63         client->session->message_callback = client_message_handler;
64
65         return client;
66 }
67
68
69 int client_connect( transport_client* client, 
70                 char* username, char* password, char* resource, 
71                 int connect_timeout, enum TRANSPORT_AUTH_TYPE  auth_type ) {
72         if(client == NULL) return 0; 
73         return session_connect( client->session, username, 
74                         password, resource, connect_timeout, auth_type );
75 }
76
77
78 int client_disconnect( transport_client* client ) {
79         if( client == NULL ) { return 0; }
80         return session_disconnect( client->session );
81 }
82
83 int client_connected( transport_client* client ) {
84         if(client == NULL) return 0;
85         return client->session->state_machine->connected;
86 }
87
88 int client_send_message( transport_client* client, transport_message* msg ) {
89         if(client == NULL) return 0;
90         return session_send_msg( client->session, msg );
91 }
92
93
94 transport_message* client_recv( transport_client* client, int timeout ) {
95         if( client == NULL ) { return NULL; }
96
97         transport_message_node* node;
98         transport_message* msg;
99
100
101         /* see if there are any message in the messages queue */
102         if( client->m_list->next != NULL ) {
103                 /* pop off the first one... */
104                 node = client->m_list->next;
105                 client->m_list->next = node->next;
106                 msg = node->message;
107                 free( node );
108                 return msg;
109         }
110
111         if( timeout == -1 ) {  /* wait potentially forever for data to arrive */
112
113                 while( client->m_list->next == NULL ) {
114                 //      if( ! session_wait( client->session, -1 ) ) {
115                         int x;
116                         if( (x = session_wait( client->session, -1 )) ) {
117                                 osrfLogWarning(OSRF_LOG_MARK, "session_wait returned failure code %d\n", x);
118                                 return NULL;
119                         }
120                 }
121
122         } else { /* wait at most timeout seconds */
123
124         
125                 /* if not, loop up to 'timeout' seconds waiting for data to arrive */
126                 time_t start = time(NULL);      
127                 time_t remaining = (time_t) timeout;
128
129                 int counter = 0;
130
131                 int wait_ret;
132                 while( client->m_list->next == NULL && remaining >= 0 ) {
133
134                         if( (wait_ret= session_wait( client->session, remaining)) ) 
135                                 return NULL;
136
137                         ++counter;
138
139 #ifdef _ROUTER
140                         // session_wait returns -1 if there is no more data and we're a router
141                         if( remaining == 0 ) { // && wait_ret == -1 ) {
142                                 break;
143                         }
144 #else
145                         if( remaining == 0 ) // or infinite loop
146                                 break;
147 #endif
148
149                         remaining -= (int) (time(NULL) - start);
150                 }
151
152         }
153
154         /* again, see if there are any messages in the message queue */
155         if( client->m_list->next != NULL ) {
156                 /* pop off the first one... */
157                 node = client->m_list->next;
158                 client->m_list->next = node->next;
159                 msg = node->message;
160                 free( node );
161                 return msg;
162
163         } else {
164                 return NULL;
165         }
166 }
167
168 /* throw the message into the message queue */
169 void client_message_handler( void* client, transport_message* msg ){
170
171         if(client == NULL) return;
172         if(msg == NULL) return; 
173
174         transport_client* cli = (transport_client*) client;
175
176         size_t len = sizeof(transport_message_node);
177         transport_message_node* node = 
178                 (transport_message_node*) safe_malloc(len);
179         node->type = MESSAGE_LIST_ITEM;
180         node->message = msg;
181
182
183         /* find the last node and put this onto the end */
184         transport_message_node* tail = cli->m_list;
185         transport_message_node* current = tail->next;
186
187         while( current != NULL ) {
188                 tail = current;
189                 current = current->next;
190         }
191         tail->next = node;
192 }
193
194
195 int client_free( transport_client* client ){
196         if(client == NULL) return 0; 
197
198         session_free( client->session );
199         transport_message_node* current = client->m_list->next;
200         transport_message_node* next;
201
202         /* deallocate the list of messages */
203         while( current != NULL ) {
204                 next = current->next;
205                 message_free( current->message );
206                 free(current);
207                 current = next;
208         }
209
210         free( client->m_list );
211         free( client );
212         return 1;
213 }
214