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 osrfAppRequest;
44 struct osrf_app_session_struct {
46 /** Our messag passing object */
47 transport_client* transport_handle;
48 /** Cache of active app_request objects */
50 //osrfAppRequest* request_queue;
52 osrfList* request_queue;
54 /** The original remote id of the remote service we're talking to */
56 /** The current remote id of the remote service we're talking to */
59 /** Who we're talking to if we're a client.
60 what app we're serving if we're a server */
63 /** The current request thread_trace */
68 /* true if this session does not require connect messages */
71 /** The connect state */
72 enum OSRF_SESSION_STATE state;
74 /** SERVER or CLIENT */
75 enum OSRF_SESSION_TYPE type;
77 /** the current locale for this session **/
80 /* let the user use the session to store their own session data */
83 void (*userDataFree) (void*);
85 typedef struct osrf_app_session_struct osrf_app_session;
86 typedef struct osrf_app_session_struct osrfAppSession;
90 // --------------------------------------------------------------------------
92 // --------------------------------------------------------------------------
94 /** Allocates a initializes a new app_session */
95 osrfAppSession* osrfAppSessionClientInit( const char* remote_service );
96 osrfAppSession* osrf_app_client_session_init( const char* remote_service );
98 /** Allocates and initializes a new server session. The global session cache
99 * is checked to see if this session already exists, if so, it's returned
101 osrfAppSession* osrf_app_server_session_init(
102 const char* session_id, const char* our_app, const char* remote_id );
104 /** sets the default locale for a session **/
105 char* osrf_app_session_set_locale( osrfAppSession*, const char* );
107 /** returns a session from the global session hash */
108 osrfAppSession* osrf_app_session_find_session( const char* session_id );
110 /** Builds a new app_request object with the given payload andn returns
111 * the id of the request. This id is then used to perform work on the
114 int osrfAppSessionMakeRequest(
115 osrfAppSession* session, const jsonObject* params,
116 const char* method_name, int protocol, string_array* param_strings);
118 /** Sets the given request to complete state */
119 void osrf_app_session_set_complete( osrfAppSession* session, int request_id );
121 /** Returns true if the given request is complete */
122 int osrf_app_session_request_complete( const osrfAppSession* session, int request_id );
124 /** Does a recv call on the given request */
125 osrf_message* osrfAppSessionRequestRecv(
126 osrfAppSession* session, int request_id, int timeout );
128 /** Removes the request from the request set and frees the reqest */
129 void osrf_app_session_request_finish( osrfAppSession* session, int request_id );
131 /** Resends the orginal request with the given request id */
132 int osrf_app_session_request_resend( osrfAppSession*, int request_id );
134 /** Resets the remote connection target to that of the original*/
135 void osrf_app_session_reset_remote( osrfAppSession* );
137 /** Sets the remote target to 'remote_id' */
138 void osrf_app_session_set_remote( osrfAppSession* session, const char* remote_id );
140 /** pushes the given message into the result list of the app_request
141 * whose request_id matches the messages thread_trace
143 int osrf_app_session_push_queue( osrfAppSession*, osrf_message* msg );
145 /** Attempts to connect to the remote service. Returns 1 on successful
146 * connection, 0 otherwise.
148 int osrf_app_session_connect( osrfAppSession* );
149 int osrfAppSessionConnect( osrfAppSession* );
151 /** Sends a disconnect message to the remote service. No response is expected */
152 int osrf_app_session_disconnect( osrfAppSession* );
154 /** Waits up to 'timeout' seconds for some data to arrive.
155 * Any data that arrives will be processed according to its
156 * payload and message type. This method will return after
157 * any data has arrived.
159 int osrf_app_session_queue_wait( osrfAppSession*, int timeout, int* recvd );
161 /** Disconnects (if client), frees any attached app_reuqests, removes the session from the
162 * global session cache and frees the session. Needless to say, only call this when the
163 * session is completely done.
165 void osrfAppSessionFree( osrfAppSession* );
167 /* tells the request to reset it's wait timeout */
168 void osrf_app_session_request_reset_timeout( osrfAppSession* session, int req_id );
170 int osrfAppRequestRespond( osrfAppSession* ses, int requestId, const jsonObject* data );
171 int osrfAppRequestRespondComplete(
172 osrfAppSession* ses, int requestId, const jsonObject* data );
174 int osrfAppSessionStatus( osrfAppSession* ses, int type,
175 const char* name, int reqId, const char* message );
177 void osrfAppSessionCleanup();