blob: b5d98e70bdf1779b423dd69f816040153e3fd3b4 [file] [log] [blame]
/* $Id$
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License, Version
* 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* etch_transport.h -- common transport code
*/
#ifndef ETCHTRANSPORT_H
#define ETCHTRANSPORT_H
#include "etch_message.h"
#include "etch_tcp_connection.h"
#include "etch_resources.h"
#include "etch_arraylist.h"
#include "etch_mailbox_manager.h"
#include "etch_session_listener.h"
#include "etch_wait.h"
#include "etch_url.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef int (*etch_delivsvc_begincall)(void* thisx, etch_message*, void** out); /* i_mailbox** out */
typedef int (*etch_delvisvc_endcall) (void* thisx, i_mailbox*, etch_type* response_type, void** out); /* etch_object** out */
typedef void* (*new_client_impl_funcptr)(void* argstruct); /* not used */
typedef void* (*main_client_create_func)(void* factory_thisx, void* server);
typedef void* (*helper_listener_create_func)(void* serverargs, void* sessionargs);
typedef int (*helper_resources_init_func)(void* argstruct);
typedef void* (*main_server_create_func)(void* factory_thisx, void* client);
/*
* i_delivery_service
* the implementor of delivery service will implement i_sessionmessage and
* i_session, and copy pointers to the implementations to this interface.
*/
typedef struct i_delivery_service
{
etch_object object;
etch_delivsvc_begincall begin_call;
etch_delvisvc_endcall end_call;
i_sessionmessage* session; /* not owned */
i_transportmessage* transport; /* not owned */
i_sessionmessage* ism; /* not owned */
i_transportmessage* itm; /* not owned */
void* thisx;
etch_mutex* rwlock; /* not owned */
unsigned char is_session_owned;
unsigned char is_transport_owned;
} i_delivery_service;
/*
* etch_tcp_delivery_service
* java binding does not have one of these, it constructs and returns a
* DeliveryService in TcpTransportFactory.newTransport(). we will instead
* invoke new_etch_transport(uri, resources), returning an i_delivery_service.
*/
typedef struct etch_tcp_delivery_service
{
etch_object object;
// ***** TODO lose i_deliveryservice instantiation and instead mask
// ***** all delivery service with i_deliveryservice. *************
i_delivery_service* ids;
etch_delivsvc_begincall begin_call;
etch_delvisvc_endcall end_call;
/* i_transportmessage - owns the tcp delivery service */
i_transportmessage* transport; /* owned by transportx */
i_mailbox_manager* transportx; /* owned */
/* external implementation of i_session_message */
i_sessionmessage* session; /* not owned */
/* delivery service implementation of i_session_message */
i_sessionmessage* sessionmsg; /* owned */
etch_session_message session_message;
etch_session_control session_control;
etch_session_notify session_notify;
etch_session_query session_query;
/* delivery service implementation of i_transport_message */
/* owns the tcp delivery service */
i_transportmessage* transportmsg; /* owned */
etch_transport_message transport_message;
etch_transport_control transport_control;
etch_transport_notify transport_notify;
etch_transport_query transport_query;
etch_transport_get_session get_session;
etch_transport_set_session set_session;
/* private component implementations */
etch_resources* resources; /* not owned */
etch_tcp_connection* tcpconx; /* not owned on server - destroyed on listener exit */
etch_mutex* rwlock; /* not owned */
etch_wait_t* wait_up; /* owned by tcpconx */
etch_wait_t* wait_down; /* owned by tcpconx */
void* packetizer; /* owned */
void* messagizer; /* owned */
void* mailboxmgr; /* owned */
unsigned char is_tcpconx_owned;
unsigned char unused[3];
} etch_tcp_delivery_service;
/* - - - - - - - - - - - - - - - - - - - -
* factory parameter bundle
* - - - - - - - - - - - - - - - - - - - -
*/
/**
* etch_session
* server's per-client parameters.
* this object wraps all of a server's per-session instance data.
*/
typedef struct etch_session
{
etch_object object;
void* thisx; /* host etch_factory_params* */
unsigned session_id; /* session key: same as cx.conxid */
/* fyi a session's receive thread is available at cx.thread */
etch_connection* cx; /* session client accepted connection */
i_delivery_service* ds; /* session delivery service */
void* client; /* xxxx_remote_client* */
void* server; /* i_xxxx_server */
void* server_stub; /* xxxx_server_stub* */
etch_object* conximpl; /* accepted conx impl obj e.g. tcp_connection* */
/* note that mainlistener.thisx is the server object e.g. etch_tcp_server
* and that serverobject.session is this i_sessionlistener */
i_sessionlistener* mainlistener; /* accept listener */
} etch_session;
/**
* etch_factory_params
* mask over server or client factory parameter bundle
*/
typedef struct etch_factory_params
{
etch_object object;
void* thisx; /* params owner TODO populate this */
wchar_t* in_uri;
etch_resources* in_resx;
etch_value_factory* in_valufact;
etch_threadpool* mainpool;
etch_threadpool* subpool;
etch_threadpool* qpool;
etch_threadpool* fpool;
etch_mutex* mblock;
etch_object* session;
i_session* isession;
etch_arraylist* per_connection_params;
/* factory constructors */
void* helper_new_xxxx;
void* main_new_xxxx;
} etch_factory_params;
/**
* etch_server_factory
* virtual server constructors and associated parameters.
* masked by etch_factory_params
*/
typedef struct etch_server_factory
{
etch_object object;
void* thisx; /* params owner TODO populate this */
wchar_t* in_uri;
etch_resources* in_resx;
etch_value_factory* in_valufact;
etch_threadpool* mainpool; /* main listener thread manager*/
etch_threadpool* subpool;
etch_threadpool* qpool; /* session thread manager */
etch_threadpool* fpool; /* session thread manager */
etch_mutex* mblock; /* utility lock */
etch_object* session; /* i_session_listener* */
i_session* isession; /* listener's i_session */
etch_arraylist* clientlist; /* create session in new_helper_accepted_server() */
/* pointer to xxxx_helper_listener_create() in xxxx_helper */
helper_listener_create_func helper_new_listener;
/* pointer to new_xxxx_server() in [main] */
main_server_create_func main_new_server;
} etch_server_factory;
/**
* etch_client_factory
* masked by etch_factory_params
*/
typedef struct etch_client_factory
{
etch_object object;
void* thisx; /* params owner todo populate this */
wchar_t* in_uri;
etch_resources* in_resx;
etch_value_factory* in_valufact;
etch_threadpool* mainpool;
etch_threadpool* subpool;
etch_threadpool* qpool;
etch_threadpool* fpool;
etch_mutex* rwlock; /* mailbox read/write lock */
etch_object* session; /* unused? */
i_session* isession;/* unused? */
etch_arraylist* per_server; /* unused? */
main_client_create_func new_client;
new_client_impl_funcptr new_client_impl; /* unused */
int server_id;
void* server; /* xxxx_remote_server* use: is_etch_remote_server(x) */
void* iclient; /* i_xxxx_client use: is_etch_client_base(x) */
void* stub; /* xxxx_client_stub* */
i_delivery_service* dsvc; /* use: is_etch_ideliverysvc(x) */
} etch_client_factory;
etch_tcp_delivery_service* new_tcp_delivery_service (etch_url*, etch_factory_params*, etch_tcp_connection*);
etch_tcp_delivery_service* get_etch_ds_impl (i_delivery_service*);
etch_resources* etch_transport_resources_init(etch_resources*);
etch_resources* get_etch_transport_resources(etch_resources*);
etch_client_factory* new_client_factory (etch_object* session, i_session* isession, main_client_create_func client_create_func);
etch_server_factory* new_server_factory (etch_object* session, i_session* isession, helper_listener_create_func helper_listener_create, main_server_create_func main_server_create);
i_delivery_service* new_delivery_service_interface(i_sessionmessage*, i_transportmessage*);
i_delivery_service* new_etch_transport (wchar_t* uri, etch_factory_params*, void* conximpl);
i_delivery_service* new_etch_transport_a(etch_url* url, etch_factory_params*, void* conximpl);
etch_session* remove_etch_session (etch_server_factory*, const int session_id);
int get_etch_session (etch_server_factory*, const int session_id, etch_session** out);
int transport_teardown_client_sessions (i_sessionlistener*);
int transport_session_count (i_sessionlistener*);
int transport_thread_id (i_sessionlistener*);
i_sessionlistener* new_etch_listener (wchar_t* uri, etch_resources* resources, void* factory_thisx, helper_listener_create_func, main_server_create_func, helper_resources_init_func);
#ifdef __cplusplus
}
#endif
#endif /* #ifndef ETCHTRANSPORT_H */