m_state = Ready;
flush_PDU();
}
- else
+ else
{ // accept still incomplete.
yaz_log(m_log, "maskObserver 2");
m_socketObservable->maskObserver(this,
}
break;
case Connecting:
- if (event & SOCKET_OBSERVE_READ &&
+ if (event & SOCKET_OBSERVE_READ &&
event & SOCKET_OBSERVE_WRITE)
{
// For Unix: if both read and write is set, then connect failed.
{
int res;
COMSTACK new_line;
-
+
if ((res = cs_listen(m_cs, 0, 0)) == 1)
return;
if (res < 0)
}
if (!(new_line = cs_accept(m_cs)))
return;
- /* 1. create socket-manager
+ /* 1. create socket-manager
2. create pdu-assoc
3. create top-level object
setup observer for child fileid in pdu-assoc
PDU_Queue **pq = &m_queue_in;
while (*pq)
pq = &(*pq)->m_next;
-
+
*pq = new PDU_Queue(m_input_buf, res);
#else
m_PDU_Observer->recv_PDU(m_input_buf, res);
int PDU_Assoc::flush_PDU()
{
int r;
-
+
if (m_state != Ready && m_state != Writing)
{
yaz_log (m_log, "YAZ_PDU_Assoc::flush_PDU, not ready");
yaz_log (m_log, "PDU_Assoc::flush_PDU cs_put %d bytes fd=%d (inc)",
q->m_len, cs_fileno(m_cs));
return r;
- }
+ }
yaz_log (m_log, "PDU_Assoc::flush_PDU cs_put %d bytes", q->m_len);
// whole packet sent... delete this and proceed to next ...
m_queue_out = q->m_next;
yaz_log(m_log, "maskObserver 8");
m_socketObservable->maskObserver(this, SOCKET_OBSERVE_READ|
SOCKET_OBSERVE_EXCEPT);
+ if (m_session_is_dead)
+ shutdown();
}
return r;
}
yaz_log (m_log, "PDU_Assoc::send_PDU");
PDU_Queue **pq = &m_queue_out;
int is_idle = (*pq ? 0 : 1);
-
+
if (!m_cs)
{
yaz_log (m_log, "PDU_Assoc::send_PDU failed, m_cs == 0");
int PDU_Assoc::listen(IPDU_Observer *observer, const char *addr)
{
+ if (*addr == '\0')
+ {
+ m_socketObservable->deleteObserver(this);
+ m_state = Closed;
+ if (m_cs)
+ {
+ yaz_log (m_log, "PDU_Assoc::close fd=%d", cs_fileno(m_cs));
+ cs_close (m_cs);
+ }
+ m_cs = 0;
+ while (m_queue_out)
+ {
+ PDU_Queue *q_this = m_queue_out;
+ m_queue_out = m_queue_out->m_next;
+ delete q_this;
+ }
+ xfree (m_input_buf);
+ m_input_buf = 0;
+ m_input_len = 0;
+
+ return 0;
+ }
+
shutdown();
m_PDU_Observer = observer;
{
PDU_Assoc *new_observable =
new PDU_Assoc (m_socketObservable, cs);
-
+
// Clone PDU Observer
new_observable->m_PDU_Observer = m_PDU_Observer->sessionNotify
(new_observable, cs_fileno(cs));