[dss-commits] digitalSTROM Server branch, master, updated. 5943b88c9a1a7960e506563345bcce64d8821020

git version control dss-commits at forum.digitalstrom.org
Tue Jan 12 08:31:37 CET 2010


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "digitalSTROM Server".

The branch, master has been updated
       via  5943b88c9a1a7960e506563345bcce64d8821020 (commit)
      from  e150a5e3f8a2a3032e85849649c3a3a83db55b31 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 5943b88c9a1a7960e506563345bcce64d8821020
Author: Patrick Stählin <pstaehlin at futurelab.ch>
Date:   Tue Jan 12 08:30:14 2010 +0100

    TcpSocket.sendTo() working
    
    Sample:
    
    TcpSocket.sendTo('127.0.0.1', 1234, 'hello');
    
    Sends the string "hello" to localhost:1234.

-----------------------------------------------------------------------

Changes:
diff --git a/core/scripting/jssocket.cpp b/core/scripting/jssocket.cpp
index 214de53..1a7ceb7 100644
--- a/core/scripting/jssocket.cpp
+++ b/core/scripting/jssocket.cpp
@@ -27,6 +27,7 @@
 #include <boost/noncopyable.hpp>
 #include <boost/asio.hpp>
 #include <boost/bind.hpp>
+#include <boost/enable_shared_from_this.hpp>
 
 using boost::asio::ip::tcp;
 
@@ -39,7 +40,9 @@ namespace dss {
                         public Thread {
   public:
     virtual void execute() {
-      m_IOService.run();
+      while(!m_Terminated) {
+        m_IOService.run();
+      }
     }
 
     boost::asio::io_service& getIOService() {
@@ -63,17 +66,28 @@ namespace dss {
   //================================================== SocketHelper
 
   class SocketHelper {
+  public:
+    SocketHelper(SocketScriptContextExtension& _extension)
+    : m_Extension(_extension)
+    { }
+  protected:
+    SocketScriptContextExtension& m_Extension;
   }; // SocketHelper
 
-  class SocketHelperSendOneShot {
+  class SocketHelperSendOneShot : public SocketHelper,
+                                  public boost::enable_shared_from_this<SocketHelperSendOneShot> {
   public:
-    SocketHelperSendOneShot(const std::string& _host, int _port, const std::string& _data)
-    : m_Socket(BoostIORunner::getInstance().getIOService()),
-      m_IOService(BoostIORunner::getInstance().getIOService()),
-      m_Data(_data)
+    SocketHelperSendOneShot(SocketScriptContextExtension& _extension)
+    : SocketHelper(_extension),
+      m_Socket(BoostIORunner::getInstance().getIOService()),
+      m_IOService(BoostIORunner::getInstance().getIOService())
     {
+    }
+    
+    void sendTo(const std::string& _host, int _port, const std::string& _data) {
+      m_Data = _data;
       tcp::resolver resolver(m_IOService);
-      tcp::resolver::query query(_host, _port);
+      tcp::resolver::query query(_host, intToString(_port));
       tcp::resolver::iterator iterator = resolver.resolve(query);
 
       tcp::endpoint endpoint = *iterator;
@@ -112,8 +126,8 @@ namespace dss {
       } else {
         // call js callback(false)
       }
-      // terminate, remove from helper-list of extension
       do_close();
+      m_Extension.removeSocketHelper(shared_from_this());
     }
 
     void do_close() {
@@ -122,7 +136,7 @@ namespace dss {
   private:
     tcp::socket m_Socket;
     boost::asio::io_service& m_IOService;
-    const std::string& m_Data;
+    std::string m_Data;
   }; // SocketHelperOneShot
 
   //================================================== SocketScriptContextExtension
@@ -161,27 +175,27 @@ namespace dss {
 
   JSBool tcpSocket_sendTo(JSContext* cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
     ScriptContext* ctx = static_cast<ScriptContext*>(JS_GetContextPrivate(cx));
- //   SocketScriptContextExtension* ext =
-//        dynamic_cast<SocketScriptContextExtension*>(ctx->getEnvironment().getExtension(SocketScriptExtensionName));
+    SocketScriptContextExtension* ext =
+       dynamic_cast<SocketScriptContextExtension*>(ctx->getEnvironment().getExtension(SocketScriptExtensionName));
 
     if(argc >= 3) {
       try {
         std::string host = ctx->convertTo<std::string>(argv[0]);
-        int port = ctx->convertTo<int>(argv[2]);
+        int port = ctx->convertTo<int>(argv[1]);
         std::string data = ctx->convertTo<std::string>(argv[2]);
 
-        tcp::resolver resolver(BoostIORunner::getInstance().getIOService());
-        tcp::resolver::query query(host, port);
-        tcp::resolver::iterator iterator = resolver.resolve(query);
-
         if(!BoostIORunner::getInstance().isRunning()) {
           BoostIORunner::getInstance().run();
         }
+	
+	boost::shared_ptr<SocketHelperSendOneShot> helper(new SocketHelperSendOneShot(*ext));
+	ext->addSocketHelper(helper);
 
+	helper->sendTo(host, port, data);
 
         *rval = JSVAL_TRUE;
         return JS_TRUE;
-      } catch(const ScriptException&) {
+      } catch(const ScriptException& e) {
       }
     }
     return JS_FALSE;
@@ -213,18 +227,18 @@ namespace dss {
                  tcpSocket_construct, 0, tcpSocket_properties, tcpSocket_methods, NULL, tcpSocket_static_methods);
   } // extendContext
 
-  void SocketScriptContextExtension::removeSocketHelper(SocketHelper& _helper) {
+  void SocketScriptContextExtension::removeSocketHelper(boost::shared_ptr<SocketHelper> _helper) {
     m_SocketHelperMutex.lock();
-//    SocketHelperVector::iterator it = std::find(m_SocketHelper.begin(), m_SocketHelper.end(), _helper);
-//    if(it != m_SocketHelper.end()) {
-//      m_SocketHelper.erase(it);
-//    }
+    SocketHelperVector::iterator it = std::find(m_SocketHelper.begin(), m_SocketHelper.end(), _helper);
+    if(it != m_SocketHelper.end()) {
+      m_SocketHelper.erase(it);
+    }
     m_SocketHelperMutex.unlock();
   } // removeSocketHelper
 
-  void SocketScriptContextExtension::addSocketHelper(SocketHelper& _helper) {
+  void SocketScriptContextExtension::addSocketHelper(boost::shared_ptr<SocketHelper> _helper) {
     m_SocketHelperMutex.lock();
-    m_SocketHelper.push_back(&_helper);
+    m_SocketHelper.push_back(_helper);
     m_SocketHelperMutex.unlock();
   } // addSocketHelper
 
diff --git a/core/scripting/jssocket.h b/core/scripting/jssocket.h
index b5fe0e3..bdf2e9b 100644
--- a/core/scripting/jssocket.h
+++ b/core/scripting/jssocket.h
@@ -23,6 +23,10 @@
 #ifndef JSSOCKET_H_
 #define JSSOCKET_H_
 
+#include <vector>
+
+#include <boost/shared_ptr.hpp>
+
 #include "core/jshandler.h"
 
 namespace dss {
@@ -34,13 +38,13 @@ namespace dss {
     SocketScriptContextExtension();
 
     virtual void extendContext(ScriptContext& _context);
-    void removeSocketHelper(SocketHelper& _helper);
-    void addSocketHelper(SocketHelper& _helper);
+    void removeSocketHelper(boost::shared_ptr<SocketHelper> _helper);
+    void addSocketHelper(boost::shared_ptr<SocketHelper> _helper);
 
 //    JSObject* createJSSocket(ScriptContext& _ctx);
   private:
     Mutex m_SocketHelperMutex;
-    typedef boost::ptr_vector<SocketHelper> SocketHelperVector;
+    typedef std::vector<boost::shared_ptr<SocketHelper> > SocketHelperVector;
     SocketHelperVector m_SocketHelper;
   }; // SocketScriptExtension
 
diff --git a/tests/jssockettests.cpp b/tests/jssockettests.cpp
index 8483408..05e6774 100644
--- a/tests/jssockettests.cpp
+++ b/tests/jssockettests.cpp
@@ -27,19 +27,70 @@
 #include "core/scripting/jssocket.h"
 
 #include <boost/scoped_ptr.hpp>
+#include <boost/asio.hpp>
+#include <boost/bind.hpp>
+
+#include "core/thread.h"
 
 using namespace std;
 using namespace dss;
+using boost::asio::ip::tcp;
 
 BOOST_AUTO_TEST_SUITE(SocketJS)
 
+class TestListener : public Thread {
+public:
+  TestListener(int _port) 
+  : m_IOService(),
+    m_Endpoint(tcp::v4(), _port),
+    m_Acceptor(m_IOService, m_Endpoint)
+  {
+    boost::shared_ptr<tcp::socket> sock(new tcp::socket(m_IOService));
+    m_Acceptor.async_accept(*sock, boost::bind(&TestListener::handleConnection, this, sock));
+  }
+  
+  virtual void execute() {
+    while(!m_Terminated) {
+      m_IOService.run();
+    }
+  }
+  
+  std::string m_DataReceived;  
+  boost::asio::io_service m_IOService;
+private:
+  
+  void handleConnection(boost::shared_ptr<tcp::socket> _sock) {
+    char data[100];
+    boost::system::error_code error;
+    _sock->read_some(boost::asio::buffer(data), error);
+    if(error == boost::asio::error::eof) {
+      return; 
+    } else if(!error) {
+      m_DataReceived = data;
+    }
+  }
+  
+  tcp::endpoint m_Endpoint;
+  tcp::acceptor m_Acceptor;
+};
+
+
 BOOST_AUTO_TEST_CASE(testBasics) {
   boost::scoped_ptr<ScriptEnvironment> env(new ScriptEnvironment());
   env->initialize();
   ScriptExtension* ext = new SocketScriptContextExtension();
   env->addExtension(ext);
+  
+  TestListener listener(1234);
+  listener.run();
 
-//  boost::scoped_ptr<ScriptContext> ctx(env->getContext());
+  boost::scoped_ptr<ScriptContext> ctx(env->getContext());
+  ctx->evaluate<void>("TcpSocket.sendTo('127.0.0.1', 1234, 'hello');");
+  sleepSeconds(2);
+  BOOST_CHECK_EQUAL(listener.m_DataReceived, "hello");
+  listener.m_IOService.stop();
+  listener.terminate();
+  sleepSeconds(2);
 }
 
 BOOST_AUTO_TEST_SUITE_END()


hooks/post-receive
-- 
digitalSTROM Server


More information about the dss-commits mailing list