summaryrefslogtreecommitdiff
path: root/tests/FlReactor_Test.cpp
diff options
context:
space:
mode:
authorcoryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-05-18 15:17:14 +0000
committercoryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-05-18 15:17:14 +0000
commitb77c4b7eb17d9d806bca7f623df0f4afbcb91ba1 (patch)
tree2143c158ed3b91e835f8281d75a8d7d7a003ce94 /tests/FlReactor_Test.cpp
parent6d372da62d9a30dddc7da37dbefa1fe623517557 (diff)
downloadATCD-b77c4b7eb17d9d806bca7f623df0f4afbcb91ba1.tar.gz
ChangeLogTag:Tue May 18 10:14:47 1999 Carlos O'Ryan <coryan@cs.wustl.edu>
Diffstat (limited to 'tests/FlReactor_Test.cpp')
-rw-r--r--tests/FlReactor_Test.cpp294
1 files changed, 294 insertions, 0 deletions
diff --git a/tests/FlReactor_Test.cpp b/tests/FlReactor_Test.cpp
new file mode 100644
index 00000000000..81b7d869382
--- /dev/null
+++ b/tests/FlReactor_Test.cpp
@@ -0,0 +1,294 @@
+/* -*- C++ -*- */
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// tests
+//
+// = FILENAME
+// FlReactor_Test.cpp
+//
+// = DESCRIPTION
+// A simple test that ilustrates the integration of the fast-light
+// toolkit (http://fltk.easysw.org/) with ACE, it uses FL to create
+// an OpenGL window and display a polygon, it uses ACE to open an
+// acceptor. Every time there is a connection the number of polygons
+// is increased, a little widget can be used to change the number of
+// polygons too.
+//
+// ============================================================================
+
+#include "test_config.h"
+
+ACE_RCSID(tests, FlReactor_Test, "$Id$")
+
+#if defined(__BORLANDC__) && __BORLANDC__ >= 0x0530
+USELIB("..\ace\aced.lib");
+//---------------------------------------------------------------------------
+#endif /* defined(__BORLANDC__) && __BORLANDC__ >= 0x0530 */
+
+#if !defined (ACE_HAS_FL)
+
+int main (int, char*[])
+{
+ ACE_START_TEST (ASYS_TEXT ("FlReactor_Test"));
+
+ ACE_ERROR ((LM_INFO,
+ "FL not supported on this platform\n"));
+ ACE_END_TEST;
+
+ return 0;
+}
+
+#else
+
+#include "ace/FlReactor.h"
+#include "ace/Event_Handler.h"
+#include "ace/Acceptor.h"
+#include "ace/SOCK_Acceptor.h"
+#include "ace/SOCK_Connector.h"
+#include "ace/Service_Config.h"
+#include "ace/Thread_Manager.h"
+
+#include <FL/Fl.h>
+#include <FL/Fl_Window.h>
+#include <FL/Fl_Hor_Slider.h>
+#include <FL/Fl_Box.h>
+#include <FL/math.h>
+#include <FL/gl.h>
+#include <FL/Fl_Gl_Window.h>
+
+class Test_Window : public Fl_Gl_Window
+{
+public:
+ Test_Window (int x, int y, int w, int h,
+ const char * l = 0);
+ // Constructor
+
+ int sides (void) const;
+ void sides (int s);
+ void incr_sides (void);
+
+private:
+ virtual void draw (void);
+ // from the Fl_Gl_Window...
+
+ int sides_;
+};
+
+Test_Window::Test_Window (int x, int y,
+ int w, int h,
+ const char* l)
+ : Fl_Gl_Window (x, y, w, h, l),
+ sides_ (3)
+{
+}
+
+int
+Test_Window::sides (void) const
+{
+ return this->sides_;
+}
+
+void
+Test_Window::sides (int s)
+{
+ this->sides_ = s;
+ this->redraw ();
+}
+
+void
+Test_Window::incr_sides (void)
+{
+ this->sides_++;
+ if (this->sides_ > 10)
+ this->sides_ = 3;
+ this->redraw ();
+}
+
+void
+Test_Window::draw (void)
+{
+ // the valid() property may be used to avoid reinitializing your
+ // GL transformation for each redraw:
+ if (!this->valid())
+ {
+ this->valid(1);
+ glLoadIdentity();
+ glViewport(0, 0, this->w(), this->h());
+ }
+ // draw an amazing but slow graphic:
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glBegin(GL_POLYGON);
+ int s = this->sides_;
+ for (int i=0; i != s; ++i)
+ {
+ double ang = i * 2 * M_PI / s;
+ glColor3f (float(i) / s,
+ float(i) / s,
+ float(i) / s);
+ glVertex3f(cos(ang), sin(ang), 0);
+ }
+ glEnd();
+}
+
+// when you change the data, as in this callback, you must call redraw():
+void sides_cb (Fl_Widget *o, void *p)
+{
+ Test_Window *tw = ACE_reinterpret_cast(Test_Window *,p);
+ Fl_Slider *slider = ACE_dynamic_cast (Fl_Slider*,o);
+ tw->sides (ACE_static_cast (int, slider->value ()));
+}
+
+class Connection_Handler : public ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH>
+{
+public:
+ Connection_Handler (Test_Window *w = 0,
+ Fl_Box* box = 0);
+
+ virtual int open (void *);
+ virtual int handle_input (ACE_HANDLE);
+
+private:
+ Test_Window* w_;
+ Fl_Box *box_;
+};
+
+class Acceptor : public ACE_Acceptor<Connection_Handler,ACE_SOCK_ACCEPTOR>
+{
+public:
+ Acceptor (Test_Window *w = 0,
+ Fl_Box *box = 0);
+
+ virtual int make_svc_handler (Connection_Handler *&sh);
+
+private:
+ Test_Window* w_;
+ Fl_Box *box_;
+};
+
+Connection_Handler::Connection_Handler (Test_Window *w,
+ Fl_Box *box)
+ : w_ (w),
+ box_ (box)
+{
+}
+
+int
+Connection_Handler::open (void*)
+{
+ if (this->box_ != 0)
+ {
+ ACE_INET_Addr from;
+
+ this->peer ().get_remote_addr (from);
+ const int bufsiz = 128;
+ char buf[bufsiz];
+
+ from.addr_to_string (buf, bufsiz, 0);
+
+ static char msg[256];
+ ACE_OS::sprintf (msg, "connection from <%s>\n", buf);
+
+ this->box_->label (msg);
+ this->box_->redraw ();
+ }
+
+ if (this->w_ != 0)
+ {
+ this->w_->incr_sides ();
+ }
+
+ return this->peer ().enable (ACE_NONBLOCK);
+}
+
+int
+Connection_Handler::handle_input (ACE_HANDLE)
+{
+ char buf[BUFSIZ];
+ if (this->peer ().recv (buf, BUFSIZ) <= 0)
+ return -1;
+ return 0;
+}
+
+Acceptor::Acceptor (Test_Window *w, Fl_Box *box)
+ : w_ (w),
+ box_ (box)
+{
+}
+
+int
+Acceptor::make_svc_handler (Connection_Handler *&sh)
+{
+ if (sh == 0)
+ ACE_NEW_RETURN (sh, Connection_Handler (this->w_, this->box_), -1);
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ ACE_START_TEST (ASYS_TEXT ("FlReactor_Test"));
+
+ Fl_Window window(300, 370);
+
+ Test_Window tw(10, 75, window.w() - 20, window.h()-90);
+ window.resizable(&tw);
+
+ Fl_Hor_Slider slider(60, 5, window.w() - 70, 30, "Sides:");
+ slider.align(FL_ALIGN_LEFT);
+ slider.callback(sides_cb, &tw);
+ slider.value(tw.sides ());
+ slider.step(1);
+ slider.bounds(3, 10);
+
+ ACE_FlReactor reactor;
+ ACE_Reactor r (&reactor);
+
+ Fl_Box *box = new Fl_Box (FL_UP_BOX, 10, 40,
+ window.w () - 20, 30,
+ "Setting up");
+ box->labelfont (FL_BOLD);
+
+ Acceptor acceptor (&tw, box);
+
+ ACE_INET_Addr address;
+ if (acceptor.open (address, &r) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "open acceptor"), -1);
+
+ acceptor.acceptor ().get_local_addr (address);
+
+ const int bufsiz = 128;
+ char buf[bufsiz];
+
+ address.addr_to_string (buf, bufsiz, 0);
+
+ char msg[2*bufsiz];
+ ACE_OS::sprintf (msg, "Listening on <%s>\n", buf);
+
+ box->label (msg);
+ box->redraw ();
+
+ window.end();
+ window.show(argc,argv);
+ tw.show();
+
+ return Fl::run();
+
+ ACE_END_TEST;
+}
+
+#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
+
+template class ACE_Acceptor<Connection_Handler, ACE_SOCK_ACCEPTOR>;
+template class ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH>;
+
+#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
+
+#pragma instantiate ACE_Acceptor<Connection_Handler, ACE_SOCK_ACCEPTOR>
+#pragma instantiate ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH>
+
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
+
+#endif /* ACE_HAS_FL */