Revision: 40742
          http://brlcad.svn.sourceforge.net/brlcad/?rev=40742&view=rev
Author:   davidloman
Date:     2010-09-28 17:39:47 +0000 (Tue, 28 Sep 2010)

Log Message:
-----------
Fixed the issue with pkg_switch not retaining values.  Variable scope ftw.

Modified Paths:
--------------
    rt^3/trunk/include/Portal.h
    rt^3/trunk/include/PortalManager.h
    rt^3/trunk/src/libNet/NetMsgFactory.cxx
    rt^3/trunk/src/libNet/Portal.cxx
    rt^3/trunk/src/libNet/PortalManager.cxx
    rt^3/trunk/src/libPkgCpp/PkgServer.cxx
    rt^3/trunk/src/libPkgCpp/PkgTcpClient.cxx
    rt^3/trunk/tests/libNet/libNetTest.cxx

Modified: rt^3/trunk/include/Portal.h
===================================================================
--- rt^3/trunk/include/Portal.h 2010-09-28 16:54:13 UTC (rev 40741)
+++ rt^3/trunk/include/Portal.h 2010-09-28 17:39:47 UTC (rev 40742)
@@ -48,7 +48,7 @@
   bool handleNetMsg(NetMsg* msg);
 
 protected:
-  Portal(PkgTcpClient* client);
+  Portal(PkgTcpClient* client, struct pkg_switch* table);
 
    /*
       * Returns:
@@ -60,6 +60,7 @@
 
 
 private:
+  struct pkg_switch* callbackTable;
   PkgTcpClient* pkgClient;
   QString remoteNodeName;
   Logger* log;

Modified: rt^3/trunk/include/PortalManager.h
===================================================================
--- rt^3/trunk/include/PortalManager.h  2010-09-28 16:54:13 UTC (rev 40741)
+++ rt^3/trunk/include/PortalManager.h  2010-09-28 17:39:47 UTC (rev 40742)
@@ -59,7 +59,8 @@
        QMutex* portalsLock;
        QMap<int, Portal*>* fdPortalMap;
 
-       Portal* makeNewPortal(PkgTcpClient* client);
+       Portal* makeNewPortal(PkgTcpClient* client, struct pkg_switch* table);
+       struct pkg_switch* makeNewSwitchTable();
        void closeFD(int fd, QString logComment);
 
 };

Modified: rt^3/trunk/src/libNet/NetMsgFactory.cxx
===================================================================
--- rt^3/trunk/src/libNet/NetMsgFactory.cxx     2010-09-28 16:54:13 UTC (rev 
40741)
+++ rt^3/trunk/src/libNet/NetMsgFactory.cxx     2010-09-28 17:39:47 UTC (rev 
40742)
@@ -65,6 +65,23 @@
   quint16 msgType = 0;
   temp >> msgType;
 
+  QString s("Got msg. type: ");
+  s.append(QString::number(msgType));
+  s.append(" len: ");
+  s.append(QString::number(data.size()));
+  Logger::getInstance()->logDEBUG("NetMsgFactory", s);
+
+  QString dstr("Bytes: ");
+
+  data.data();
+
+  for (int i = 0; i < data.size(); ++i) {
+         quint8 b = data.data()[i];
+         dstr.append(QString::number(b));
+         dstr.append(", ");
+  }
+  Logger::getInstance()->logDEBUG("NetMsgFactory", dstr);
+
   QDataStream* qds = new QDataStream(data);
 
   //TODO Replace this with a map for registration scheme

Modified: rt^3/trunk/src/libNet/Portal.cxx
===================================================================
--- rt^3/trunk/src/libNet/Portal.cxx    2010-09-28 16:54:13 UTC (rev 40741)
+++ rt^3/trunk/src/libNet/Portal.cxx    2010-09-28 17:39:47 UTC (rev 40742)
@@ -30,22 +30,21 @@
 #include "NetMsgTypes.h"
 #include "RemoteNodenameSetMsg.h"
 
-Portal::Portal(PkgTcpClient* client)
+Portal::Portal(PkgTcpClient* client, struct pkg_switch* table)
 {
-  this->remoteNodeName = "NotSetYet-" + QUuid::createUuid().toString();
-  this->pkgClient = client;
+       this->remoteNodeName = "NotSetYet-" + QUuid::createUuid().toString();
+       this->pkgClient = client;
+       this->callbackTable = table;
+       //set the struct's userdata
+       this->callbackTable[0].pks_user_data = this;
 
-  //set the struct's userdata
-  const struct pkg_switch* table = this->pkgClient->getCallBackTable();
-  pkg_switch sw = table[0];
-  sw.pks_user_data = this;
-
-  this->log = Logger::getInstance();
-  this->handshakeComplete = false;
+       this->log = Logger::getInstance();
+       this->handshakeComplete = false;
 }
 
 Portal::~Portal()
 {
+       delete callbackTable;
 }
 
 
@@ -92,8 +91,16 @@
 int
 Portal::read(){
   int retval = 0;
+       this->log->logINFO("Portal", "Read");
+/*
+  const pkg_switch* table = this->pkgClient->getCallBackTable();
+  pkg_switch sw = table[0];
+  bu_log("P(1.1): Route[0] type: %d\n", sw.pks_type);
+  bu_log("P(1.1): Route[0] callback: %d\n", sw.pks_handler);
+  bu_log("P(1.1): Route[0] user_data: %d\n", sw.pks_user_data);
+*/
 
-  //recv first
+//recv first
   retval = this->pkgClient->processData();
   if (retval < 0){
          this->log->logERROR("Portal", "Unable to process packets? Weird. (1) 
\n");
@@ -101,7 +108,7 @@
   }//TODO do we need to check for ==0 ?
 
 
-  retval = this->pkgClient->pullDataFromSocket();
+retval = this->pkgClient->pullDataFromSocket();
   if (retval < 0) {
          this->log->logERROR("Portal", "Seemed to have trouble pulling the 
data from the socket.\n");
     return retval;
@@ -110,6 +117,7 @@
          this->log->logERROR("Portal", "Client closed the connection.\n");
     return retval;
   }
+  bu_log("Sucked in %d bytes.", retval);
 
   retval = this->pkgClient->processData();
   if (retval < 0){
@@ -162,11 +170,21 @@
 
   QByteArray ba(buf);
 
-  if (conn->pkc_user_data == 0) {
+  QString s("Got ");
+  s.append(QString::number(ba.size()));
+  s.append(" bytes.");
+  Logger::getInstance()->logINFO("Portal(s)", s);
+
+   if (conn->pkc_user_data == 0) {
      bu_bomb("pkg callback returned a NULL user_data pointer!\n");
    }
+
   Portal* p = (Portal*)conn->pkc_user_data;
 
+  if (p == 0) {
+          bu_log("WARNING!  NetMsg failed to deserialize properly.\n");
+  }
+
   //TODO Split the code here?  Fire off a Job?
 
 

Modified: rt^3/trunk/src/libNet/PortalManager.cxx
===================================================================
--- rt^3/trunk/src/libNet/PortalManager.cxx     2010-09-28 16:54:13 UTC (rev 
40741)
+++ rt^3/trunk/src/libNet/PortalManager.cxx     2010-09-28 17:39:47 UTC (rev 
40742)
@@ -44,17 +44,16 @@
 Portal*
 PortalManager::connectToHost(QString host, quint16 port)
 {
-         struct pkg_switch table[] = {
-             {PKG_MAGIC2, &(Portal::callbackSpringboard), "SpringBoard", NULL},
-             {0,0, (char*)0,0}
-         };
+       struct pkg_switch* table = this->makeNewSwitchTable();
 
-       PkgTcpClient* pkgc = (PkgTcpClient* 
)this->tcpServer->connectToHost(host.toStdString(), port, table);
+       PkgTcpClient* pkgc = (PkgTcpClient*) this->tcpServer->connectToHost(
+                       host.toStdString(), port, table);
 
        if (pkgc == NULL) {
                return NULL;
        } else {
-               return this->makeNewPortal(pkgc);
+               Portal* p = this->makeNewPortal(pkgc, table);
+               return p;
        }
 }
 
@@ -96,7 +95,7 @@
        while (this->runCmd) {
                //Set values EVERY loop since select() on *nix modifies this.
                timeout.tv_sec = 0;
-               timeout.tv_usec = 500*1000;
+               timeout.tv_usec = 500*1000 * 2;
 
                this->masterFDSLock.lock();
                readfds = masterfds;
@@ -105,11 +104,10 @@
                this->masterFDSLock.unlock();
 
                //Shelect!!
-               this->log->logINFO("PortalManager", "At Select.");
                int retval =
                                select(fdmax + 1, &readfds, NULL, 
&exceptionfds, &timeout);
 
-               QString out("Loop start.  Select returned: ");
+               QString out("Select returned: ");
                out.append(QString::number(retval));
                out.append(". FD count: ");
                out.append(QString::number(this->fdPortalMap->keys().size()));
@@ -176,31 +174,37 @@
 
                        log->logDEBUG("PortalManager", s);
 
+                       //If nothing to do, then continue;
+                       if (!readyRead && !readyWrite && !readyAccept && ! 
readyException){
+                               continue;
+                       }
+
+
                        //Handle exceptions
                        if (readyException) {
                                //TODO handle exceptions
                                perror("Exception on FileDescriptor");
                        }
 
-                       Portal* p;
+
+
+                       Portal* p = NULL;
                        //Accept new connections:
                        if (readyAccept) {
                                log->logINFO("PortalManager", "Accept");
 
-                               struct pkg_switch table[] = { { PKG_MAGIC2,
-                                               &(Portal::callbackSpringboard), 
"SpringBoard", NULL },
-                                               { 0, 0, (char*) 0, 0 } };
+                               struct pkg_switch* table = 
this->makeNewSwitchTable();
 
                                PkgTcpClient* client =
-                                               (PkgTcpClient*) 
this->tcpServer->waitForClient(table,
-                                                               42);
+                                               (PkgTcpClient*) 
this->tcpServer->waitForClient(table, 42);
 
                                if (client == 0) {
                                        log->logERROR("PortalManager",
                                                        "Error on accepting new 
client.");
                                } else {
                                        //Handle new client here.
-                                       p = this->makeNewPortal(client);
+                                       p = this->makeNewPortal(client, table);
+                                       GSThread::sleep(2);
                                        p->sendGSNodeName();
                                }
                        }
@@ -226,13 +230,24 @@
                                this->closeFD(i, s);
                                continue;
                        }
-
+/*
+                         const pkg_switch* table = 
p->pkgClient->getCallBackTable();
+                         pkg_switch sw = table[0];
+                         bu_log("PM(3.1): Route[0] type: %d\n", sw.pks_type);
+                         bu_log("PM(3.1): Route[0] callback: %d\n", 
sw.pks_handler);
+                         bu_log("PM(3.1): Route[0] user_data: %d\n", 
sw.pks_user_data);
+*/
                        //read
                        if (readyRead) {
                                this->log->logINFO("PortalManager", "Read");
 
                                int readResult = p->read();
 
+                                 QString s("Got ");
+                                 s.append(QString::number(readResult));
+                                 s.append(" bytes.");
+                                 
Logger::getInstance()->logINFO("PortalManager", s);
+
                                if (readResult == 0) {
                                        this->closeFD(i, "Lost connection.");
                                        continue;
@@ -260,8 +275,8 @@
 
 
 Portal*
-PortalManager::makeNewPortal(PkgTcpClient* client) {
-       Portal* newPortal = new Portal(client);
+PortalManager::makeNewPortal(PkgTcpClient* client, struct pkg_switch* table) {
+       Portal* newPortal = new Portal(client, table);
 
        if (newPortal == 0) {
                return 0;
@@ -287,6 +302,24 @@
        return newPortal;
 }
 
+struct pkg_switch*
+PortalManager::makeNewSwitchTable()
+{
+       struct pkg_switch* table = new pkg_switch[2];
+
+       table[0].pks_type = PKG_MAGIC2;
+       table[0].pks_handler = &(Portal::callbackSpringboard);
+       table[0].pks_title = "SpringBoard";
+       table[0].pks_user_data = 0;
+
+       table[1].pks_type = 0;
+       table[1].pks_handler = 0;
+       table[1].pks_title = (char*)0;
+       table[1].pks_user_data = 0;
+
+       return table;
+}
+
 void
 PortalManager::closeFD(int fd, QString logComment)
 {

Modified: rt^3/trunk/src/libPkgCpp/PkgServer.cxx
===================================================================
--- rt^3/trunk/src/libPkgCpp/PkgServer.cxx      2010-09-28 16:54:13 UTC (rev 
40741)
+++ rt^3/trunk/src/libPkgCpp/PkgServer.cxx      2010-09-28 17:39:47 UTC (rev 
40742)
@@ -39,26 +39,6 @@
 PkgServer::~PkgServer()
 {}
 
-/**
- * Attempts to open a new connection to ipOrHostname:port.  Returns NULL if 
connection fails for any reason.
- */
-PkgClient*
-PkgServer::connectToHost(std::string ipOrHostname, short port, struct 
pkg_switch* callbackTable)
-{
-       std::stringstream ss;
-       ss << port;
-       std::string s_port = ss.str();
-
-       pkg_conn* conn = pkg_open(ipOrHostname.c_str(), s_port.c_str(),
-                       this->proto.c_str(), NULL, NULL, callbackTable, NULL);
-
-       if (conn == PKC_ERROR) {
-               bu_log("Connection to %s, port %d, failed.\n", 
ipOrHostname.c_str(), port);
-               return NULL;
-       }
-       return this->getNewClient(conn);
-}
-
 int
 PkgServer::listen(unsigned short port)
 {
@@ -84,10 +64,33 @@
   return this->listenFD;
 }
 
+
+/**
+ * Attempts to open a new connection to ipOrHostname:port.  Returns NULL if 
connection fails for any reason.
+ */
 PkgClient*
+PkgServer::connectToHost(std::string ipOrHostname, short port, struct 
pkg_switch* callbackTable)
+{
+       std::stringstream ss;
+       ss << port;
+       std::string s_port = ss.str();
+
+       pkg_conn* conn = pkg_open(ipOrHostname.c_str(), s_port.c_str(),
+                       this->proto.c_str(), NULL, NULL, callbackTable, NULL);
+
+       if (conn == PKC_ERROR) {
+               bu_log("Connection to %s, port %d, failed.\n", 
ipOrHostname.c_str(), port);
+               return NULL;
+       }
+       return this->getNewClient(conn);
+}
+
+
+PkgClient*
 PkgServer::waitForClient(struct pkg_switch* callbackTable, int waitTime) {
-       pkg_conn* clientStruct = pkg_getclient(this->listenFD, callbackTable, 
NULL, waitTime);
-  if (clientStruct == PKC_NULL)
+       pkg_conn* conn = pkg_getclient(this->listenFD, callbackTable, NULL, 
waitTime);
+
+  if (conn == PKC_NULL)
     {
       if (waitTime == 0)
         {
@@ -96,15 +99,15 @@
         }
       return NULL;
     }
-  else if (clientStruct == PKC_ERROR)
+  else if (conn == PKC_ERROR)
     {
       //Fatal error accepting client connection
       bu_log("Fatal error accepting client connection.\n");
-      pkg_close(clientStruct);
+      pkg_close(conn);
       return NULL;
     }
 
-  PkgClient* pkgClientObj = this->getNewClient(clientStruct);
+  PkgClient* pkgClientObj = this->getNewClient(conn);
   return pkgClientObj;
 }
 

Modified: rt^3/trunk/src/libPkgCpp/PkgTcpClient.cxx
===================================================================
--- rt^3/trunk/src/libPkgCpp/PkgTcpClient.cxx   2010-09-28 16:54:13 UTC (rev 
40741)
+++ rt^3/trunk/src/libPkgCpp/PkgTcpClient.cxx   2010-09-28 17:39:47 UTC (rev 
40742)
@@ -25,6 +25,7 @@
  */
 
 #include "PkgTcpClient.h"
+#include "brlcad/bu.h"
 
 PkgTcpClient::PkgTcpClient(std::string ipOrHostname, int port, struct 
pkg_switch* callBackTableIn) :
   PkgClient(PKGCPP_PROTO_TCP, ipOrHostname, port, callBackTableIn)

Modified: rt^3/trunk/tests/libNet/libNetTest.cxx
===================================================================
--- rt^3/trunk/tests/libNet/libNetTest.cxx      2010-09-28 16:54:13 UTC (rev 
40741)
+++ rt^3/trunk/tests/libNet/libNetTest.cxx      2010-09-28 17:39:47 UTC (rev 
40742)
@@ -131,6 +131,8 @@
                PortalManager pm;
                pm.startup();
 
+               GSThread::sleep(3);
+
                s = "Trying to connect to ";
                s.append(ip.c_str());
                s.append(":");


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances
and start using them to simplify application deployment and
accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to