IPC: External polling loop with a Client
[platform/core/security/vasum.git] / common / ipc / ipc-gsource.hpp
1 /*
2 *  Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
3 *
4 *  Contact: Jan Olszak <j.olszak@samsung.com>
5 *
6 *  Licensed under the Apache License, Version 2.0 (the "License");
7 *  you may not use this file except in compliance with the License.
8 *  You may obtain a copy of the License at
9 *
10 *      http://www.apache.org/licenses/LICENSE-2.0
11 *
12 *  Unless required by applicable law or agreed to in writing, software
13 *  distributed under the License is distributed on an "AS IS" BASIS,
14 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 *  See the License for the specific language governing permissions and
16 *  limitations under the License
17 */
18
19 /**
20  * @file
21  * @author  Jan Olszak (j.olszak@samsung.com)
22  * @brief    Class for creating a dedicated GSource
23  */
24
25 #ifndef COMMON_IPC_IPC_GSOURCE_HPP
26 #define COMMON_IPC_IPC_GSOURCE_HPP
27
28 #include <glib.h>
29 #if GLIB_CHECK_VERSION(2,36,0)
30
31 #include "ipc/service.hpp"
32 #include "ipc/types.hpp"
33
34 #include <memory>
35
36
37 namespace vasum {
38 namespace ipc {
39
40 /**
41  * Class for connecting to the glib's loop.
42  * Creates a dedicated GSource.
43  *
44  * It's supposed to be constructed ONLY with the static create method
45  * and destructed in a glib callback.
46  *
47  * TODO:
48  * - waiting till the managed object (Client or Service) is destroyed
49  *   before IPCGSource stops operating. For now programmer has to ensure this.
50  */
51 struct IPCGSource {
52 public:
53     typedef std::function<void(FileDescriptor fd, short pollEvent)> HandlerCallback;
54     typedef std::shared_ptr<IPCGSource> Pointer;
55
56     ~IPCGSource();
57
58     IPCGSource() = delete;
59     IPCGSource(const IPCGSource&) = delete;
60     IPCGSource& operator=(const IPCGSource&) = delete;
61
62     /**
63      * New file descriptor to listen on.
64      *
65      * @param peerFD file descriptor
66      */
67     void addFD(const FileDescriptor peerFD);
68
69     /**
70      * Removes the file descriptor from the GSource
71      *
72      * @param peerFD file descriptor
73      */
74     void removeFD(const FileDescriptor peerFD);
75
76     /**
77      * Attach to the glib's GMainContext
78      *
79      * @param context where to connect
80      * @return result of the g_source_attach call
81      */
82     guint attach(GMainContext* context = nullptr);
83
84     /**
85      * Creates the IPCGSource class in the memory allocated by glib.
86      * Calls IPCGSource's constructor
87      *
88      * @param fds initial set of file descriptors
89      * @param handlerCallback event handling callback
90      *
91      * @return pointer to the IPCGSource
92      */
93     static Pointer create(const std::vector<FileDescriptor>& fds,
94                           const HandlerCallback& handlerCallback);
95
96 private:
97
98     /**
99      * GSourceFuncs' callback
100      */
101     static gboolean prepare(GSource* source, gint* timeout);
102
103     /**
104      * GSourceFuncs' callback
105      */
106     static gboolean check(GSource* source);
107
108     /**
109      * GSourceFuncs' callback
110      */
111     static gboolean dispatch(GSource* source,
112                              GSourceFunc callbacks,
113                              gpointer userData);
114
115     /**
116      * GSourceFuncs' callback
117      */
118     static void  finalize(GSource* source);
119
120
121
122     // Called only from IPCGSource::create
123     IPCGSource(const std::vector<FileDescriptor> fds,
124                const HandlerCallback& handlerCallback);
125
126     struct FDInfo {
127         FDInfo(gpointer tag, FileDescriptor fd)
128             : tag(tag), fd(fd) {}
129
130         bool operator==(const gpointer t)
131         {
132             return t == tag;
133         }
134
135         bool operator==(const FileDescriptor f)
136         {
137             return f == fd;
138         }
139
140         gpointer tag;
141         FileDescriptor fd;
142     };
143
144     GSource mGSource;
145     HandlerCallback mHandlerCallback;
146     std::vector<FDInfo> mFDInfos;
147 };
148
149 } // namespace ipc
150 } // namespace vasum
151
152 #endif // GLIB_CHECK_VERSION
153
154 #endif // COMMON_IPC_IPC_GSOURCE_HPP