1 #ifndef _OSRF_APP_SESSION
2 #define _OSRF_APP_SESSION
4 #include <opensrf/transport_client.h>
5 #include <opensrf/osrf_message.h>
6 #include <opensrf/osrf_system.h>
7 #include <opensrf/string_array.h>
8 #include <opensrf/osrfConfig.h>
9 #include <opensrf/osrf_hash.h>
10 #include <opensrf/osrf_list.h>
12 #include <opensrf/osrf_json.h>
16 #define DEF_RECV_TIMEOUT 6 /* receive timeout */
17 #define DEF_QUEUE_SIZE
19 enum OSRF_SESSION_STATE { OSRF_SESSION_CONNECTING, OSRF_SESSION_CONNECTED, OSRF_SESSION_DISCONNECTED };
20 enum OSRF_SESSION_TYPE { OSRF_SESSION_SERVER, OSRF_SESSION_CLIENT };
22 /* entry point for data into the stack. gets set in osrf_stack.c */
23 int (*osrf_stack_entry_point) (transport_client* client, int timeout, int* recvd );
25 struct osrf_app_request_struct {
26 /** Our controlling session */
27 struct osrf_app_session_struct* session;
31 /** True if we have received a 'request complete' message from our request */
33 /** Our original request payload */
34 osrf_message* payload;
35 /** List of responses to our request */
38 /* if set to true, then a call that is waiting on a response, will reset the
39 timeout and set this variable back to false */
42 typedef struct osrf_app_request_struct osrf_app_request;
43 typedef struct osrf_app_request_struct osrfAppRequest;
45 struct osrf_app_session_struct {
47 /** Our messag passing object */
48 transport_client* transport_handle;
49 /** Cache of active app_request objects */
51 //osrf_app_request* request_queue;
53 osrfList* request_queue;
55 /** The original remote id of the remote service we're talking to */
57 /** The current remote id of the remote service we're talking to */
60 /** Who we're talking to if we're a client.
61 what app we're serving if we're a server */
64 /** The current request thread_trace */
69 /* true if this session does not require connect messages */
72 /** The connect state */
73 enum OSRF_SESSION_STATE state;
75 /** SERVER or CLIENT */
76 enum OSRF_SESSION_TYPE type;
78 /* let the user use the session to store their own session data */
81 void (*userDataFree) (void*);
83 typedef struct osrf_app_session_struct osrf_app_session;
84 typedef struct osrf_app_session_struct osrfAppSession;
88 // --------------------------------------------------------------------------
90 // --------------------------------------------------------------------------
92 /** Allocates a initializes a new app_session */
93 osrf_app_session* osrfAppSessionClientInit( char* remote_service );
94 osrf_app_session* osrf_app_client_session_init( char* remote_service );
96 /** Allocates and initializes a new server session. The global session cache
97 * is checked to see if this session already exists, if so, it's returned
99 osrf_app_session* osrf_app_server_session_init(
100 char* session_id, char* our_app, char* remote_id );
102 /** returns a session from the global session hash */
103 osrf_app_session* osrf_app_session_find_session( char* session_id );
105 /** Builds a new app_request object with the given payload andn returns
106 * the id of the request. This id is then used to perform work on the
109 int osrfAppSessionMakeRequest(
110 osrf_app_session* session, jsonObject* params,
111 char* method_name, int protocol, string_array* param_strings);
113 int osrf_app_session_make_req(
114 osrf_app_session* session, jsonObject* params,
115 char* method_name, int protocol, string_array* param_strings);
117 /** Sets the given request to complete state */
118 void osrf_app_session_set_complete( osrf_app_session* session, int request_id );
120 /** Returns true if the given request is complete */
121 int osrf_app_session_request_complete( osrf_app_session* session, int request_id );
123 /** Does a recv call on the given request */
124 osrf_message* osrfAppSessionRequestRecv(
125 osrf_app_session* session, int request_id, int timeout );
126 osrf_message* osrf_app_session_request_recv(
127 osrf_app_session* session, int request_id, int timeout );
129 /** Removes the request from the request set and frees the reqest */
130 void osrf_app_session_request_finish( osrf_app_session* session, int request_id );
132 /** Resends the orginal request with the given request id */
133 int osrf_app_session_request_resend( osrf_app_session*, int request_id );
135 /** Resets the remote connection target to that of the original*/
136 void osrf_app_session_reset_remote( osrf_app_session* );
138 /** Sets the remote target to 'remote_id' */
139 void osrf_app_session_set_remote( osrf_app_session* session, char* remote_id );
141 /** pushes the given message into the result list of the app_request
142 * whose request_id matches the messages thread_trace
144 int osrf_app_session_push_queue( osrf_app_session*, osrf_message* msg );
146 /** Attempts to connect to the remote service. Returns 1 on successful
147 * connection, 0 otherwise.
149 int osrf_app_session_connect( osrf_app_session* );
150 int osrfAppSessionConnect( osrf_app_session* );
152 /** Sends a disconnect message to the remote service. No response is expected */
153 int osrf_app_session_disconnect( osrf_app_session* );
155 /** Waits up to 'timeout' seconds for some data to arrive.
156 * Any data that arrives will be processed according to its
157 * payload and message type. This method will return after
158 * any data has arrived.
160 int osrf_app_session_queue_wait( osrf_app_session*, int timeout, int* recvd );
162 /** Disconnects (if client), frees any attached app_reuqests, removes the session from the
163 * global session cache and frees the session. Needless to say, only call this when the
164 * session is completey done.
166 void osrf_app_session_destroy ( osrf_app_session* );
167 void osrfAppSessionFree( osrfAppSession* );
171 // --------------------------------------------------------------------------
172 // --------------------------------------------------------------------------
174 // --------------------------------------------------------------------------
176 /** Allocations and initializes a new app_request object */
177 osrf_app_request* _osrf_app_request_init( osrf_app_session* session, osrf_message* msg );
179 /** Frees memory used by an app_request object */
180 void _osrf_app_request_free( void * req );
182 /** Pushes the given message onto the list of 'responses' to this request */
183 void _osrf_app_request_push_queue( osrf_app_request*, osrf_message* payload );
185 /** Checks the receive queue for messages. If any are found, the first
186 * is popped off and returned. Otherwise, this method will wait at most timeout
187 * seconds for a message to appear in the receive queue. Once it arrives it is returned.
188 * If no messages arrive in the timeout provided, null is returned.
190 osrf_message* _osrf_app_request_recv( osrf_app_request* req, int timeout );
192 /** Resend this requests original request message */
193 int _osrf_app_request_resend( osrf_app_request* req );
196 /* tells the request to reset it's wait timeout */
197 void osrf_app_session_request_reset_timeout( osrf_app_session* session, int req_id );
199 // --------------------------------------------------------------------------
200 // --------------------------------------------------------------------------
202 // --------------------------------------------------------------------------
204 /** Returns the app_request with the given thread_trace (request_id) */
205 osrf_app_request* _osrf_app_session_get_request( osrf_app_session*, int thread_trace );
207 /** frees memory held by a session. Note: We delete all requests in the request list */
208 void _osrf_app_session_free( osrf_app_session* );
210 /** adds a session to the global session cache */
211 void _osrf_app_session_push_session( osrf_app_session* );
213 /** Adds an app_request to the request set */
214 void _osrf_app_session_push_request( osrf_app_session*, osrf_app_request* req );
216 /** Removes an app_request from this session request set, freeing the request object */
217 void _osrf_app_session_remove_request( osrf_app_session*, osrf_app_request* req );
219 /** Send the given message */
220 int _osrf_app_session_send( osrf_app_session*, osrf_message* msg );
222 int osrfAppSessionSendBatch( osrf_app_session*, osrf_message* msgs[], int size );
224 int osrfAppRequestRespond( osrfAppSession* ses, int requestId, jsonObject* data );
225 int osrfAppRequestRespondComplete( osrfAppSession* ses, int requestId, jsonObject* data );
227 int osrfAppSessionStatus( osrfAppSession* ses, int type, char* name, int reqId, char* message );
229 void osrfAppSessionCleanup();