Better reporting of statistics. Handling of ODR decode improved
[yazpp-moved-to-github.git] / src / yaz-pdu-assoc.cpp
index bcdeded..aa149d6 100644 (file)
@@ -1,8 +1,8 @@
 /*
- * Copyright (c) 1998-2001, Index Data.
+ * Copyright (c) 1998-2003, Index Data.
  * See the file LICENSE for details.
  * 
- * $Id: yaz-pdu-assoc.cpp,v 1.29 2003-07-25 19:27:36 adam Exp $
+ * $Id: yaz-pdu-assoc.cpp,v 1.35 2003-10-20 18:31:44 adam Exp $
  */
 
 #include <assert.h>
@@ -210,9 +210,9 @@ void Yaz_PDU_Assoc::socketNotify(int event)
                    return;
 
                m_PDU_Observer->recv_PDU(m_input_buf, res);
-                m_destroyed = 0;
                if (destroyed)   // it really was destroyed, return now.
                    return;
+                m_destroyed = 0;
            } while (m_cs && cs_more (m_cs));
            if (m_cs && m_state == Ready)
             {
@@ -387,7 +387,7 @@ int Yaz_PDU_Assoc::send_PDU(const char *buf, int len)
 
 COMSTACK Yaz_PDU_Assoc::comstack(const char *type_and_host, void **vp)
 {
-    return cs_create_host(type_and_host, 0, vp);
+    return cs_create_host(type_and_host, 2, vp);
 }
 
 void Yaz_PDU_Assoc::listen(IYaz_PDU_Observer *observer,
@@ -420,7 +420,7 @@ void Yaz_PDU_Assoc::idleTime(int idleTime)
     m_socketObservable->timeoutObserver(this, m_idleTime);
 }
 
-void Yaz_PDU_Assoc::connect(IYaz_PDU_Observer *observer,
+int Yaz_PDU_Assoc::connect(IYaz_PDU_Observer *observer,
                            const char *addr)
 {
     yaz_log (m_log, "Yaz_PDU_Assoc::connect %s", addr);
@@ -428,13 +428,24 @@ void Yaz_PDU_Assoc::connect(IYaz_PDU_Observer *observer,
     m_PDU_Observer = observer;
     void *ap;
     m_cs = comstack(addr, &ap);
+    if (!m_cs)
+       return -1;
     int res = cs_connect (m_cs, ap);
     yaz_log (m_log, "Yaz_PDU_Assoc::connect fd=%d res=%d", cs_fileno(m_cs),
             res);
     m_socketObservable->addObserver(cs_fileno(m_cs), this);
 
-    if (res >= 0)
-    {   // Connect pending or complete
+    if (res == 0)
+    {   // Connect complete
+       m_state = Connecting;
+       unsigned mask = YAZ_SOCKET_OBSERVE_EXCEPT;
+       mask |= YAZ_SOCKET_OBSERVE_WRITE;
+       mask |= YAZ_SOCKET_OBSERVE_READ;
+       yaz_log(m_log, "maskObserver 11");
+       m_socketObservable->maskObserver(this, mask);
+    }
+    else if (res > 0)
+    {   // Connect pending
        m_state = Connecting;
        unsigned mask = YAZ_SOCKET_OBSERVE_EXCEPT;
        if (m_cs->io_pending & CS_WANT_WRITE)
@@ -452,6 +463,7 @@ void Yaz_PDU_Assoc::connect(IYaz_PDU_Observer *observer,
        m_socketObservable->maskObserver(this, YAZ_SOCKET_OBSERVE_WRITE|
                                         YAZ_SOCKET_OBSERVE_EXCEPT);
     }
+    return 0;
 }
 
 // Single-threaded... Only useful for non-blocking handlers
@@ -468,3 +480,8 @@ void Yaz_PDU_Assoc::childNotify(COMSTACK cs)
     new_observable->m_PDU_Observer = m_PDU_Observer->sessionNotify
        (new_observable, cs_fileno(cs));
 }
+
+const char*Yaz_PDU_Assoc::getpeername()
+{
+    return cs_addrstr(m_cs);
+}