1 // ----------------------------------------------------------------------------
2 //
3 // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese <iam_w1hkj@w1hkj.com>
4 //
5 // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley
6 //
7 // This file is part of fldigi
8 //
9 // flxmlrpc is free software; you can redistribute it and/or modify
10 // it under the terms of the GNU Lesser General Public License as published by
11 // the Free Software Foundation; either version 3 of the License, or
12 // (at your option) any later version.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 // ----------------------------------------------------------------------------
17 
18 #ifndef _XMLRPCSOURCE_H_
19 #define _XMLRPCSOURCE_H_
20 
21 #if defined(_MSC_VER)
22 # pragma warning(disable:4786)    // identifier was truncated in debug info
23 #endif
24 
25 #include "XmlRpcSocket.h"
26 
27 
28 namespace XmlRpc {
29 
30   //! Proxy for Ssl data to avoid including headers here.
31   struct SslProxy;
32 
33   //! An RPC source represents a file descriptor to monitor
34   class XmlRpcSource {
35   public:
36     //! Constructor
37     //!  @param fd The socket file descriptor to monitor.
38     //!  @param deleteOnClose If true, the object deletes itself when close is called.
39     XmlRpcSource(XmlRpcSocket::Socket fd = XmlRpcSocket::Invalid, bool deleteOnClose = false);
40 
41     //! Destructor
42     virtual ~XmlRpcSource();
43 
44     //! Return the file descriptor being monitored.
getfd()45     XmlRpcSocket::Socket getfd() const { return _fd; }
46     //! Specify the file descriptor to monitor.
setfd(XmlRpcSocket::Socket fd)47     void setfd(XmlRpcSocket::Socket fd) { _fd = fd; }
48 
49     //! Return whether the file descriptor should be kept open if it is no longer monitored.
getKeepOpen()50     bool getKeepOpen() const { return _keepOpen; }
51     //! Specify whether the file descriptor should be kept open if it is no longer monitored.
52     void setKeepOpen(bool b=true) { _keepOpen = b; }
53 
54     //! Return whether ssl is enabled.
getSslEnabled()55     bool getSslEnabled() const { return _sslEnabled; }
56     //! Specify whether to enable ssl. Use getSslEnabled() to verify that Ssl is available.
57     void setSslEnabled(bool b=true);
58 
59     //! Close the owned fd. If deleteOnClose was specified at construction, the object is deleted.
60     virtual void close();
61 
62     //! Return true to continue monitoring this source
63     virtual unsigned handleEvent(unsigned eventType) = 0;
64 
65   protected:
66 
67     // Execution processing helpers
68     virtual bool doConnect();
69 
70     //! Read text from the source. Returns false on error.
71     bool nbRead(std::string& s, bool *eof);
72 
73     //! Write text to the source. Returns false on error.
74     bool nbWrite(std::string const& s, int *bytesSoFar);
75 
76   private:
77 
78     // Socket. This is an int for linux/unix, and unsigned on win32, and unsigned __int64 on win64.
79     // Casting to int/long/unsigned on win64 is a bad idea.
80     XmlRpcSocket::Socket _fd;
81 
82     // In the server, a new source (XmlRpcServerConnection) is created
83     // for each connected client. When each connection is closed, the
84     // corresponding source object is deleted.
85     bool _deleteOnClose;
86 
87     // In the client, keep connections open if you intend to make multiple calls.
88     bool _keepOpen;
89 
90     // Enable use of SSL
91     bool _sslEnabled;
92 
93     // SSL data
94     SslProxy *_ssl;
95   };
96 } // namespace XmlRpc
97 
98 #endif //_XMLRPCSOURCE_H_
99