Migrate to openssl 3.0
[platform/core/telephony/tel-plugin-manager.git] / src / manager_queue.c
1 /*
2  * tel-plugin-manager
3  *
4  * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Suresh Kumar N <suresh.n@samsung.com>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20
21 #include <glib.h>
22 #include <tcore.h>
23 #include <manager.h>
24 #include <plugin.h>
25 #include <user_request.h>
26
27 #include "manager_types.h"
28 #include "manager_queue.h"
29 #include "internal/manager_internal.h"
30
31 #define INVALID_PEEK_INDEX      (-1)
32
33 typedef struct {
34         enum tcore_request_command command;
35         GSList *ur_list;        /* UR list */
36 } ManagerQueueNode;
37
38 /******************************* Internal APIs *******************************/
39 static void __unref_ur(gpointer data)
40 {
41         UserRequest *ur = data;
42         tcore_user_request_unref(ur);
43 }
44
45 static void __clear_queue(GQueue *manager_queue)
46 {
47         ManagerQueueNode *node = NULL;
48
49         while (NULL != (node = g_queue_pop_head(manager_queue))) {
50                 g_slist_free_full(node->ur_list, __unref_ur);
51                 g_free(node);
52         }
53 }
54
55 static gint __get_peek_index(GQueue *manager_queue, enum tcore_request_command command)
56 {
57         UserRequest *ur = NULL;
58         gint peek_index = 0;
59
60         g_assert(manager_queue != NULL);
61
62         /*
63          * Peek each 'node' and check if there is a 'ur'
64          * with matching 'command'.
65          */
66         while (TRUE) {
67                 ur = g_queue_peek_nth(manager_queue, peek_index);
68                 if (ur == NULL)
69                         break;
70
71                 if (tcore_user_request_get_command(ur) == command)
72                         break;
73
74                 peek_index++;
75         }
76
77         return ((ur == NULL) ? INVALID_PEEK_INDEX : peek_index);
78 }
79
80 static GQueue *__get_queue(Manager *manager)
81 {
82         TcorePlugin *plugin = tcore_manager_get_plugin(manager);
83         PrivateData *priv_data = tcore_plugin_ref_user_data(plugin);
84         g_assert(priv_data != NULL);
85
86         return priv_data->manager_queue;
87 }
88
89 /******************************* External APIs *******************************/
90 GQueue *manager_queue_init(void)
91 {
92         GQueue *manager_queue = g_queue_new();
93
94         if (G_UNLIKELY(!manager_queue)) {
95                 err("Failed to create Manager queue");
96                 return NULL;
97         }
98         g_queue_init(manager_queue);
99
100         return manager_queue;
101 }
102
103 void manager_queue_deinit(GQueue *manager_queue)
104 {
105         if (!manager_queue)
106                 return;
107
108         /*
109          * In case Queue is NOT empty, then clear the queue.
110          */
111         if (g_queue_is_empty(manager_queue) == FALSE)
112                 __clear_queue(manager_queue);
113
114         g_queue_free(manager_queue);
115 }
116
117 void manager_queue_enqueue(Manager *manager, UserRequest *ur)
118 {
119         GQueue *manager_queue;
120
121         g_assert(manager != NULL);
122         g_assert(ur != NULL);
123
124         manager_queue = __get_queue(manager);
125         g_assert(manager_queue != NULL);
126
127         /* Reference 'ur' */
128         ur = tcore_user_request_ref(ur);
129         g_queue_push_tail(manager_queue, ur);
130 }
131
132 gboolean manager_queue_probe_command(Manager *manager,
133                                      enum tcore_request_command command)
134 {
135         GQueue *manager_queue;
136         gint peek_index;
137
138         g_assert(manager != NULL);
139         g_assert(command != 0);
140
141         manager_queue = __get_queue(manager);
142         g_assert(manager_queue != NULL);
143
144         peek_index = __get_peek_index(manager_queue, command);
145
146         return (peek_index == INVALID_PEEK_INDEX ? FALSE : TRUE);
147 }
148
149 guint manager_get_queue_length(Manager *manager,
150                                enum tcore_request_command command)
151 {
152         GQueue *manager_queue;
153         guint queue_length = 0;
154
155         g_assert(manager != NULL);
156         g_assert(command != 0);
157
158         manager_queue = __get_queue(manager);
159         g_assert(manager_queue != NULL);
160
161         queue_length = g_queue_get_length(manager_queue);
162
163         return queue_length;
164 }
165
166 UserRequest *manager_queue_dequeue(Manager *manager)
167 {
168         UserRequest *ur = NULL;
169         GQueue *manager_queue;
170
171         g_assert(manager != NULL);
172
173         manager_queue = __get_queue(manager);
174         g_assert(manager_queue != NULL);
175
176         if (g_queue_get_length(manager_queue) == 0)
177                 return NULL;
178
179         ur = (UserRequest *)g_queue_pop_head(manager_queue);
180         g_assert(ur != NULL);
181
182         tcore_user_request_unref(ur);
183
184         return ur;
185 }
186