1/* Plugin connection declarations
2   Copyright (C) 2014 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8Software Foundation; either version 3, or (at your option) any later
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING3.  If not see
18<http://www.gnu.org/licenses/>.  */
19
20#ifndef CC1_PLUGIN_CONNECTION_HH
21#define CC1_PLUGIN_CONNECTION_HH
22
23#include "status.hh"
24#include "callbacks.hh"
25
26namespace cc1_plugin
27{
28  // The connection class represents one side of the connection
29  // between the gdb-side library and the gcc plugin.  It handles the
30  // low-level details of reading and writing data.
31  class connection
32  {
33  public:
34
35    connection (int fd)
36      : m_fd (fd),
37	m_aux_fd (-1),
38	m_callbacks ()
39    {
40    }
41
42    connection (int fd, int aux_fd)
43      : m_fd (fd),
44	m_aux_fd (aux_fd),
45	m_callbacks ()
46    {
47    }
48
49    virtual ~connection ();
50
51    // Send a single character.  This is used to introduce various
52    // higher-level protocol elements.
53    status send (char c);
54
55    // Send data in bulk.
56    status send (const void *buf, int len);
57
58    // Read a single byte from the connection and verify that it
59    // matches the argument C.
60    status require (char c);
61
62    // Read data in bulk.
63    status get (void *buf, int len);
64
65    // This is called after a query (remote function call) has been
66    // sent to the remote.  It waits for a response packet.  The
67    // response character is read before returning.  Any query packets
68    // sent from the remote while waiting for a response are handled
69    // by this function.
70    status wait_for_result ()
71    {
72      return do_wait (true);
73    }
74
75    // Read and respond to query packets sent by the remote.  This
76    // function returns when the connection is closed.
77    status wait_for_query ()
78    {
79      return do_wait (false);
80    }
81
82    // Register a callback with this connection.  NAME is the name of
83    // the method being registered.  FUNC is the function.  It must
84    // know how to decode its own arguments.  When a query packet is
85    // received by one of the wait_* methods, the corresponding
86    // callback is invoked.
87    void add_callback (const char *name, callback_ftype *func)
88    {
89      m_callbacks.add_callback (name, func);
90    }
91
92    virtual void print (const char *);
93
94  private:
95
96    // Declared but not defined, to prevent use.
97    connection (const connection &);
98    connection &operator= (const connection &);
99
100    // Helper function for the wait_* methods.
101    status do_wait (bool);
102
103    // The file descriptor.
104    int m_fd;
105
106    // An auxiliary file descriptor, or -1 if none.
107    int m_aux_fd;
108
109    // Callbacks associated with this connection.
110    callbacks m_callbacks;
111  };
112}
113
114#endif // CC1_PLUGIN_CONNECTION_HH
115