L4Re - L4 Runtime Environment
meta
Go to the documentation of this file.
1 // vi:set ft=cpp: -*- Mode: C++ -*-
2 /**
3  * \file
4  * Meta interface for getting dynamic type information about objects behind
5  * capabilities.
6  */
7 /*
8  * (c) 2008-2009 Alexander Warg <warg@os.inf.tu-dresden.de>
9  * economic rights: Technische Universit├Ąt Dresden (Germany)
10  *
11  * This file is part of TUD:OS and distributed under the terms of the
12  * GNU General Public License 2.
13  * Please see the COPYING-GPL-2 file for details.
14  *
15  * As a special exception, you may use this file as part of a free software
16  * library without restriction. Specifically, if other files instantiate
17  * templates or use macros or inline functions from this file, or you compile
18  * this file and link it with other files to produce an executable, this
19  * file does not by itself cause the resulting executable to be covered by
20  * the GNU General Public License. This exception does not however
21  * invalidate any other reasons why the executable file might be covered by
22  * the GNU General Public License.
23  */
24 
25 #pragma once
26 
27 #include "kobject"
28 #include "cxx/ipc_iface"
29 #include "cxx/ipc_string"
30 
31 namespace L4 {
32 
33 /**
34  * Meta interface that shall be implemented by each L4Re object
35  * and gives access to the dynamic type information for L4Re objects.
36  */
37 class Meta : public Kobject_t<Meta, Kobject, L4_PROTO_META>
38 {
39 public:
40  /**
41  * Get the number of interfaces implemented by this object.
42  *
43  * \retval l4_msgtag_t::label() >= 0 The number of supported interfaces.
44  * \retval l4_msgtag_t::label() < 0 Error code of the occurred error.
45  */
46  L4_INLINE_RPC(l4_msgtag_t, num_interfaces, ());
47 
48  /**
49  * Get the protocol number that must be used for the interface with
50  * the number `idx`.
51  *
52  * \param idx The index of the interface to get the protocol
53  * number for. `idx` must be >= 0 and < the return
54  * value of num_interfaces().
55  * \param[out] proto The protocol number for interface `idx`.
56  * \param[out] name The protocol name for interface `idx`.
57  *
58  * \retval l4_msgtag_t::label() == 0 Successful; see `proto` and `name`.
59  * \retval l4_msgtag_t::label() < 0 Error code.
60  */
61  L4_INLINE_RPC(l4_msgtag_t, interface, (l4_umword_t idx, long *proto,
62  L4::Ipc::String<char> *name));
63 
64  /**
65  * Figure out if the object supports the given protocol (number).
66  *
67  * \param protocol The protocol number to check for.
68  *
69  * \retval l4_msgtag_t::label() == 1 protocol is supported.
70  * \retval l4_msgtag_t::label() == 0 protocol is not supported.
71  *
72  * This method is intended to be used for statically assigned protocol
73  * numbers.
74  */
75  L4_INLINE_RPC(l4_msgtag_t, supports, (l4_mword_t protocol));
76 
77  typedef L4::Typeid::Rpcs<num_interfaces_t, interface_t, supports_t> Rpcs;
78 };
79 
80 }