85beb965f026dde46c4ebef46d35c9ceb528451d
[OpenSRF.git] / include / opensrf / osrf_app_session.h
1 #ifndef _OSRF_APP_SESSION
2 #define _OSRF_APP_SESSION
3
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>
11
12 #include <opensrf/osrf_json.h>
13
14
15
16 #define DEF_RECV_TIMEOUT 6 /* receive timeout */
17 #define DEF_QUEUE_SIZE  
18
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 };
21
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 );
24
25 struct osrf_app_request_struct {
26         /** Our controlling session */
27         struct osrf_app_session_struct* session;
28
29         /** our "id" */
30         int request_id;
31         /** True if we have received a 'request complete' message from our request */
32         int complete;
33         /** Our original request payload */
34         osrf_message* payload; 
35         /** List of responses to our request */
36         osrf_message* result;
37
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 */
40         int reset_timeout;
41 };
42 typedef struct osrf_app_request_struct osrfAppRequest;
43
44 struct osrf_app_session_struct {
45
46         /** Our messag passing object */
47         transport_client* transport_handle;
48         /** Cache of active app_request objects */
49
50         //osrfAppRequest* request_queue;
51
52         osrfList* request_queue;
53
54         /** The original remote id of the remote service we're talking to */
55         char* orig_remote_id;
56         /** The current remote id of the remote service we're talking to */
57         char* remote_id;
58
59         /** Who we're talking to if we're a client.  
60                 what app we're serving if we're a server */
61         char* remote_service;
62
63         /** The current request thread_trace */
64         int thread_trace;
65         /** Our ID */
66         char* session_id;
67
68         /* true if this session does not require connect messages */
69         int stateless;
70
71         /** The connect state */
72         enum OSRF_SESSION_STATE state;
73
74         /** SERVER or CLIENT */
75         enum OSRF_SESSION_TYPE type;
76
77         /** the current locale for this session **/
78         char* session_locale;
79
80         /* let the user use the session to store their own session data */
81         void* userData;
82
83         void (*userDataFree) (void*);
84
85     int transport_error;
86 };
87 typedef struct osrf_app_session_struct osrf_app_session;
88 typedef struct osrf_app_session_struct osrfAppSession;
89
90
91
92 // -------------------------------------------------------------------------- 
93 // PUBLIC API ***
94 // -------------------------------------------------------------------------- 
95
96 /** Allocates a initializes a new app_session */
97 osrfAppSession* osrfAppSessionClientInit( const char* remote_service );
98 osrfAppSession* osrf_app_client_session_init( const char* remote_service );
99
100 /** Allocates and initializes a new server session.  The global session cache
101   * is checked to see if this session already exists, if so, it's returned 
102   */
103 osrfAppSession* osrf_app_server_session_init(
104                 const char* session_id, const char* our_app, const char* remote_id );
105
106 /** sets the default locale for a session **/
107 char* osrf_app_session_set_locale( osrfAppSession*, const char* );
108
109 /** returns a session from the global session hash */
110 osrfAppSession* osrf_app_session_find_session( const char* session_id );
111
112 /** Builds a new app_request object with the given payload andn returns
113   * the id of the request.  This id is then used to perform work on the
114   * requeset.
115   */
116 int osrfAppSessionMakeRequest(
117                 osrfAppSession* session, const jsonObject* params,
118                 const char* method_name, int protocol, string_array* param_strings);
119
120 /** Sets the given request to complete state */
121 void osrf_app_session_set_complete( osrfAppSession* session, int request_id );
122
123 /** Returns true if the given request is complete */
124 int osrf_app_session_request_complete( const osrfAppSession* session, int request_id );
125
126 /** Does a recv call on the given request */
127 osrf_message* osrfAppSessionRequestRecv(
128                 osrfAppSession* session, int request_id, int timeout );
129
130 /** Removes the request from the request set and frees the reqest */
131 void osrf_app_session_request_finish( osrfAppSession* session, int request_id );
132
133 /** Resends the orginal request with the given request id */
134 int osrf_app_session_request_resend( osrfAppSession*, int request_id );
135
136 /** Resets the remote connection target to that of the original*/
137 void osrf_app_session_reset_remote( osrfAppSession* );
138
139 /** Sets the remote target to 'remote_id' */
140 void osrf_app_session_set_remote( osrfAppSession* session, const char* remote_id );
141
142 /** pushes the given message into the result list of the app_request
143   * whose request_id matches the messages thread_trace 
144   */
145 int osrf_app_session_push_queue( osrfAppSession*, osrf_message* msg );
146
147 /** Attempts to connect to the remote service. Returns 1 on successful 
148   * connection, 0 otherwise.
149   */
150 int osrf_app_session_connect( osrfAppSession* );
151 int osrfAppSessionConnect( osrfAppSession* );
152
153 /** Sends a disconnect message to the remote service.  No response is expected */
154 int osrf_app_session_disconnect( osrfAppSession* );
155
156 /**  Waits up to 'timeout' seconds for some data to arrive.
157   * Any data that arrives will be processed according to its
158   * payload and message type.  This method will return after
159   * any data has arrived.
160   */
161 int osrf_app_session_queue_wait( osrfAppSession*, int timeout, int* recvd );
162
163 /** Disconnects (if client), frees any attached app_reuqests, removes the session from the 
164   * global session cache and frees the session.  Needless to say, only call this when the
165   * session is completely done.
166   */
167 void osrfAppSessionFree( osrfAppSession* );
168
169 /* tells the request to reset it's wait timeout */
170 void osrf_app_session_request_reset_timeout( osrfAppSession* session, int req_id );
171
172 int osrfAppRequestRespond( osrfAppSession* ses, int requestId, const jsonObject* data );
173 int osrfAppRequestRespondComplete(
174                 osrfAppSession* ses, int requestId, const jsonObject* data ); 
175
176 int osrfAppSessionStatus( osrfAppSession* ses, int type,
177                 const char* name, int reqId, const char* message );
178
179 void osrfAppSessionCleanup();
180
181
182
183 #endif