===================================================== c accepted ===================================================== tcpxfact_session_accepted (i_sessionlistener* thisx, etch_socket* socket) ETCH_RESXKEY_SOCKET delivery_service = new_etch_transport_a (url, resources); params->server_stub = HELPER.new_helper_accepted_server (etch_server_factory* p) perf_remote_client* client = new_remote_client (0, ds, vf); i_perf_server* iserver = p->main_new_server (p); perf_remote_client* client = (perf_remote_client*) p->client; perf_server_impl* newserver = new_perf_server_impl (client); return newserver->perf_server_base; perf_server_stub* stub = new_perf_server_stub (p); stub->destroy = destroy_stub_object; /* private */ stub->destroyex = destroy_my_server_stub; /* public */ stub->stub_base = new_stub (implobj, stubtype, ids, qp, fp); stubbase->ds->mbm->set_session (ds, stubbase->isessionmsg); stubbase->impl_callbacks = etchstub_get_session_callbacks_from (implobj); stub->stub_base->stubobj = (objmask*) newstub; stub->stub_base->params = params; set stub helper run procedures for each message type. // delivery.itm is mailbox manager. its transport_control was overriden to // tcpdelsvc_transport_control in tcpdelsvc_init(). // this in turn calls tcpds->transport->transport_control() // delivery.transport is the mailbox manager. delivery_service->itm->transport_control (CONTROL_START); ===================================================== java accepted ===================================================== TcpListener.onSessionAccepted(socket) resources.add(socket); DeliveryService = newTransport(); new TcpConnection(); TcpConnection implements TransportData send(buffer); C-NOTE: OK, etch_tcp_connection.its is i_transportdata, etch_tcpconx_transport_data does the send() C-QUESTION: etch_tcp_connection.transport_control etc. where are they assigned? should they be same as itd? implements Transport TransportQuery(START, STOP, etc), TransportControl (START, STOP, etc) TcpConnection HOSTS SessionData as session. NOTE: SessionData (including sessionData()), is null until set by inheritor (Packetizer). this.session.sessionData(buffer) is invoked by this.fireData(buffer); new Packetizer(TcpConnection(transport)); (NOTE: Packetizer.transport IS-A TransportData, but Packetizer IMPLEMENTS TransportPacket); this.transport = TcpConnection.TransportData; C-NOTE: HERE'S HOW: C-NOTE: TcpConnection's TransportData interface is passed to Packetizer's ctor C-NOTE THIS AND ALL SUBSEQUENT: it is only necessary to replace each method if we do not destroy and replace the transport object. otherwise we would destroy existing transport object, and simply replace that with the transport object passed in the ctor. Packetizer.transport.transportData = TcpConnection.TransportData; Packetizer.transport.transportControl = TcpConnection.transportControl; ETC. ETC. query and notify Packetizer.transportPacket has new logic, and then calls Packetizer.transport.transportData(). Packetizer.transportControl, Notify, and Query, call Packetizer.transport.transportControl, Query, Notify. Tcpconnection.setSession(this); C-NOTE: HERE'S HOW: TcpConnection HOSTS SessionData TcpConnection.sessionData = Packetizer.sessionData; C-NOTE: does tcpconx even have a session_data()? TcpConnection.sessionControl = Packetizer.sessionControl; ETC. ETC. query and notify new Messagizer(Packetizer(TransportPacket)); (NOTE: Messagizer.transport IS-A TransportPacket, but Messagizer IMPLEMENTS TransportMessage); this.transport = Packetizer.TransportPacket C-NOTE: HERE'S HOW: C-NOTE: Packetizer's TransportPacket interface is passed to Messagizer's ctor Messagizer.transport.transportPacket = Packetizer.transportPacket; Messagizer.transport.transportControl = Packetizer.transportControl; ETC. ETC. Packetizer.setSession(this); C-NOTE: HERE'S HOW: Packetizer IMPLEMENTS SessionData but HOSTS SessionPacket. Messagizer IMPLEMENTS SessionPacket Packetizer.session.sessionPacket = Messagizer.sessionPacket; Packetizer.session.sessionControl = Messagizer.sessionControl; ETC. ETC. new PlainMailboxManager(Messagizer(transport)); (NOTE: MailboxManager.transport IS-A TransportMessage, AND MailboxManager EXTENDS TransportMessage); this.transport = Messagizer.TransportMessage; C-NOTE: HERE'S HOW: C-NOTE: Messagizer's i_transportmessage is passed in MailboxManager ctor MailboxManager.transport.TransportMessage = Messagizer.TransportMessage MailboxManager.transport.TransportControl = Messagizer.TransportControl; ETC. ETC. Messagizer.setSession(this); C-NOTE: HERE'S HOW: Messagizer IMPLEMENTS SessionPacket but HOSTS SessionMessage. MailboxManager EXTENDS SessionMessage Messagizer.session.sessionMessage = MailboxManager.sessionMessage; Messagizer.session.sessionControl = MailboxManager.sessionControl; ETC. ETC. new DefaultDeliveryService(MailboxManager(transport)); NOTE: DeliveryService transport IS-A MBM IS-A TransportMessage, AND DeliveryService EXTENDS TransportMessage this.transport = MailboxManager ; C-NOTE: HERE'S HOW: delsvc->transport = mboxmgr->imanager; OR: THE FOLLOWING delsvc->transport->transportMessage = mboxmgr->transportMessage; ETC ETC ETC MailboxManager.setSession(this); C-NOTE: HERE'S HOW: MailboxManager EXTENDS SessionMessage AND HOSTS SessionMessage. DeliveryService EXTENDS SessionMessage MailboxManager.session.sessionMessage = delsvc->sessionMessage; ETC ETC ETC