extend stubs a bit
[fg:hoorays-flightgear.git] / src / Scripting / NasalFGProtocol.cxx
1 // Expose FGProtocol module to Nasal to enable I/O protocols to be implemented in Nasal space, e.g.
2 // to support REST/AJAX, JSON or HTTP WebSockets
3 //
4 // Copyright (C) 2013  The FlightGear community
5 //
6 // This program is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU General Public License as
8 // published by the Free Software Foundation; either version 2 of the
9 // License, or (at your option) any later version.
10 //
11 // This program is distributed in the hope that it will be useful, but
12 // WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // General Public License for more details.
15 //
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software
18 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19
20 #ifdef HAVE_CONFIG_H
21 #  include "config.h"
22 #endif
23
24 #include "NasalFGProtocol.hxx"
25 #include <Main/globals.hxx>
26 #include <Main/util.hxx>
27
28 #include <simgear/nasal/cppbind/from_nasal.hxx>
29 #include <simgear/nasal/cppbind/to_nasal.hxx>
30 #include <simgear/nasal/cppbind/NasalHash.hxx>
31 #include <simgear/nasal/cppbind/Ghost.hxx>
32
33 class NasalProtocolWrapper;
34
35 typedef boost::shared_ptr<NasalProtocolWrapper> NasalProtocolWrapper_ptr;
36 typedef nasal::Ghost< NasalProtocolWrapper_ptr > NasalProtocol;
37
38 class NasalProtocolWrapper : public FGProtocol {
39 public:
40  bool open();
41  bool process();
42  bool close();
43  bool gen_message();
44  bool parse_message();
45  void set_direction();
46  
47 protected:
48 private:
49 };
50
51 bool
52 NasalProtocolWrapper::open() {
53 SG_LOG(SG_GENERAL, SG_ALERT, "::open" << std::endl);
54 return true;
55 }
56
57 bool
58 NasalProtocolWrapper::process() {
59 SG_LOG(SG_GENERAL, SG_ALERT, "::process" << std::endl);
60 return true;
61 }
62
63 bool
64 NasalProtocolWrapper::close() {
65 SG_LOG(SG_GENERAL, SG_ALERT, "::close" << std::endl);
66 return true;
67 }
68
69 bool
70 NasalProtocolWrapper::gen_message() {
71 SG_LOG(SG_GENERAL, SG_ALERT, "::gen_message" << std::endl);
72 return true;
73 }
74
75 bool
76 NasalProtocolWrapper::parse_message() {
77 SG_LOG(SG_GENERAL, SG_ALERT, "::parse_message" << std::endl);
78 return true;
79 }
80
81 void
82 NasalProtocolWrapper::set_direction() {
83 SG_LOG(SG_GENERAL, SG_ALERT, "::set_direction" << std::endl);
84 }
85
86
87
88 naRef to_nasal_helper(naContext c, NasalProtocolWrapper *obj)
89   { 
90     NasalProtocolWrapper_ptr ptr(obj); 
91     return NasalProtocol::create(c, ptr ); 
92   }
93  
94
95 NasalProtocolWrapper*
96 from_nasal_helper(naContext c, naRef ref, const NasalProtocolWrapper*)
97   { 
98       return (NasalProtocolWrapper*) naGhost_ptr(ref);
99   }
100
101 static naRef f_new_protocol(const nasal::CallContext& ctx)
102 {
103  
104   return ctx.to_nasal( new  NasalProtocolWrapper );
105 }
106
107 //------------------------------------------------------------------------------
108 naRef initNasalFGProtocol(naRef globals, naContext c)
109 {
110   NasalProtocol::init("io.protocol")
111 // This is where you want to expose various methods from FGProtocol/NetChat/NetChannel
112         .method("open", &NasalProtocolWrapper::open) 
113         .method("close", &NasalProtocolWrapper::close) 
114         .method("gen_message", &NasalProtocolWrapper::gen_message) 
115         .method("parse_message", &NasalProtocolWrapper::parse_message) 
116         .method("set_direction", &NasalProtocolWrapper::set_direction);
117
118   nasal::Hash globals_module(globals, c);
119   nasal::Hash protocol = globals_module.createHash("protocol");
120   protocol.set("new", &f_new_protocol); 
121
122   return naNil();
123 }