1// vi:set ft=cpp: -*- Mode: C++ -*-
2/*
3 * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
4 *               Alexander Warg <warg@os.inf.tu-dresden.de>
5 *     economic rights: Technische Universität Dresden (Germany)
6 *
7 * This file is part of TUD:OS and distributed under the terms of the
8 * GNU General Public License 2.
9 * Please see the COPYING-GPL-2 file for details.
10 *
11 * As a special exception, you may use this file as part of a free software
12 * library without restriction.  Specifically, if other files instantiate
13 * templates or use macros or inline functions from this file, or you compile
14 * this file and link it with other files to produce an executable, this
15 * file does not by itself cause the resulting executable to be covered by
16 * the GNU General Public License.  This exception does not however
17 * invalidate any other reasons why the executable file might be covered by
18 * the GNU General Public License.
19 */
20
21#pragma once
22
23#include <l4/re/dataspace>
24#include <l4/re/video/goos>
25#include <l4/re/video/goos-sys.h>
26
27#include <l4/sys/capability>
28#include <l4/sys/cxx/ipc_legacy>
29
30namespace L4Re { namespace Util { namespace Video {
31
32/**
33 * \brief Goos server class.
34 * \ingroup api_l4re_util
35 */
36class Goos_svr
37{
38  typedef L4Re::Video::Goos::Rights Rights;
39protected:
40  /** Goos memory dataspace */
41  L4::Cap<L4Re::Dataspace> _fb_ds;
42  /** Goos information */
43  L4Re::Video::Goos::Info _screen_info;
44  /** View information */
45  L4Re::Video::View::Info _view_info;
46
47public:
48  L4_RPC_LEGACY_DISPATCH(L4Re::Video::Goos);
49  /**
50   * \brief Return framebuffer memory dataspace.
51   * \return Goos memory dataspace
52   */
53  L4::Cap<L4Re::Dataspace> get_fb() const { return _fb_ds; }
54
55  /**
56   * \brief Goos information structure.
57   * \return Return goos information structure.
58   */
59  L4Re::Video::Goos::Info const *screen_info() const { return &_screen_info; }
60
61  /**
62   * \brief View information structure.
63   * \return Return view information structure.
64   */
65  L4Re::Video::View::Info const *view_info() const { return &_view_info; }
66
67  /**
68   * \brief Refresh area of the framebuffer
69   *
70   * \param x X coordinate (pixels)
71   * \param y Y coordinate (pixels)
72   * \param w Width of area in pixels
73   * \param h Height of area in pixels
74   *
75   * \return 0 on success, negative error code otherwise
76   */
77  virtual int refresh(int x, int y, int w, int h)
78  { (void)x; (void)y; (void)w; (void)h; return -L4_ENOSYS; }
79
80
81  /**
82   * \brief Initialize the view information structure of this object.
83   *
84   * This function initializes the view info structure of this goos object
85   * based on the information in the goos information, i.e. the width,
86   * height and pixel_info of the goos information has to contain valid
87   * values before calling init_info().
88   */
89  void init_infos()
90  {
91    using L4Re::Video::View;
92
93    _view_info.flags = View::F_none;
94
95    _view_info.view_index = 0;
96    _view_info.xpos = 0;
97    _view_info.ypos = 0;
98    _view_info.width = _screen_info.width;
99    _view_info.height = _screen_info.height;
100    _view_info.pixel_info = _screen_info.pixel_info;
101    _view_info.buffer_index = 0;
102  }
103
104  /**
105   * \brief Destructor.
106   */
107  virtual ~Goos_svr() {}
108
109  long op_view_info(Rights, unsigned idx, L4Re::Video::View::Info &info)
110  {
111    if (idx != 0)
112      return -L4_ERANGE;
113
114    info = _view_info;
115    return L4_EOK;
116  }
117
118  long op_info(Rights, L4Re::Video::Goos::Info &info)
119  {
120    info = _screen_info;
121    return L4_EOK;
122  }
123
124  long op_get_static_buffer(Rights, unsigned idx,
125                            L4::Ipc::Cap<L4Re::Dataspace> &ds)
126  {
127    if (idx != 0)
128      return -L4_ERANGE;
129
130    ds = L4::Ipc::Cap<L4Re::Dataspace>(_fb_ds, L4_CAP_FPAGE_RW);
131    return L4_EOK;
132  }
133
134  long op_refresh(Rights, int x, int y, int w, int h)
135  { return refresh(x, y, w, h); }
136
137  long op_view_refresh(Rights, unsigned idx, int x, int y, int w, int h)
138  {
139    if (idx != 0)
140      return -L4_ERANGE;
141
142    return refresh(x, y, w, h);
143  }
144
145  long op_set_view_info(Rights, unsigned, L4Re::Video::View::Info)
146  { return -L4_ENOSYS; }
147
148  long op_view_stack(Rights, unsigned, unsigned, bool)
149  { return -L4_ENOSYS; }
150
151  long op_delete_view(Rights, unsigned)
152  { return -L4_ENOSYS; }
153
154  long op_create_view(Rights)
155  { return -L4_ENOSYS; }
156
157  long op_create_buffer(Rights, unsigned long,
158                        L4::Ipc::Cap<L4Re::Dataspace> &)
159  { return -L4_ENOSYS; }
160
161  long op_delete_buffer(Rights, unsigned)
162  { return -L4_ENOSYS; }
163};
164
165
166}}}
167