ef918f74aa08e0fc1e8cf8942a9fb7a569a98514
[platform/core/appfw/app-core.git] / src / multiwindow_base / appcore_multiwindow_base_instance.c
1 /*
2  * Copyright (c) 2017 Samsung Electronics Co., Ltd. All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <stdio.h>
18 #include <stdarg.h>
19 #include <string.h>
20 #include <stdlib.h>
21 #include <stdbool.h>
22 #include <malloc.h>
23
24 #include <glib-object.h>
25 #include <glib.h>
26 #include <gio/gio.h>
27
28 #include "appcore_base.h"
29 #include "appcore_multiwindow_base.h"
30 #include "appcore_multiwindow_base_private.h"
31
32 extern appcore_multiwindow_base_context _appcore_mw_context;
33
34 static gint __comp(gconstpointer a, gconstpointer b)
35 {
36         const appcore_multiwindow_base_class *cls = a;
37
38         return strcmp(cls->id, b);
39 }
40
41 EXPORT_API appcore_multiwindow_base_instance_h appcore_multiwindow_base_instance_run(const char *class_id, const char *id, void *extra)
42 {
43         appcore_multiwindow_base_instance *inst;
44         GList * class_node = g_list_find_custom(_appcore_mw_context.classes, class_id, __comp);
45
46         if (!class_node)
47                 return NULL;
48         inst = malloc(sizeof(appcore_multiwindow_base_instance));
49         if (!inst)
50                 return NULL;
51
52         inst->shell = class_node->data;
53         inst->window_id = 0;
54         inst->id = strdup(id);
55         inst->extra = extra;
56         inst->is_resumed = false;
57
58         _appcore_mw_context.instances = g_list_append(_appcore_mw_context.instances, inst);
59         if (inst->shell->create)
60                 inst->shell->create(inst, inst->shell->data);
61
62         return inst;
63 }
64
65 EXPORT_API void appcore_multiwindow_base_instance_exit(appcore_multiwindow_base_instance_h context)
66 {
67         appcore_multiwindow_base_instance *inst = context;
68
69         appcore_multiwindow_base_instance_pause(inst);
70         if (inst->shell->terminate)
71                 inst->shell->terminate(inst, inst->shell->data);
72
73         _appcore_mw_context.instances = g_list_remove(_appcore_mw_context.instances, inst);
74         free(inst->id);
75         free(inst);
76 }
77
78 EXPORT_API void appcore_multiwindow_base_instance_drop(appcore_multiwindow_base_instance_h context)
79 {
80         appcore_multiwindow_base_instance *inst = context;
81
82         inst->shell->terminate(inst, inst->shell->data);
83
84         _appcore_mw_context.instances = g_list_remove(_appcore_mw_context.instances, inst);
85         free(inst->id);
86         free(inst);
87 }
88
89 EXPORT_API void *appcore_multiwindow_base_instance_get_extra(appcore_multiwindow_base_instance_h context)
90 {
91         appcore_multiwindow_base_instance *inst = context;
92
93         return inst->extra;
94 }
95
96 EXPORT_API void appcore_multiwindow_base_instance_set_extra(appcore_multiwindow_base_instance_h context, void *extra)
97 {
98         appcore_multiwindow_base_instance *inst = context;
99
100         inst->extra = extra;
101 }
102
103 EXPORT_API bool appcore_multiwindow_base_instance_is_resumed(appcore_multiwindow_base_instance_h context)
104 {
105         appcore_multiwindow_base_instance *inst = context;
106
107         return inst->is_resumed;
108 }
109
110 EXPORT_API void appcore_multiwindow_base_instance_pause(appcore_multiwindow_base_instance_h context)
111 {
112         appcore_multiwindow_base_instance *inst = context;
113
114         if (!inst->is_resumed)
115                 return;
116
117         if (inst->shell->pause)
118                 inst->shell->pause(inst, inst->shell->data);
119         inst->is_resumed = false;
120 }
121
122 EXPORT_API void appcore_multiwindow_base_instance_resume(appcore_multiwindow_base_instance_h context)
123 {
124         appcore_multiwindow_base_instance *inst = context;
125
126         if (inst->is_resumed)
127                 return;
128
129         if (inst->shell->resume)
130                 inst->shell->resume(inst, inst->shell->data);
131         inst->is_resumed = true;
132 }
133
134 EXPORT_API const char *appcore_multiwindow_base_instance_get_id(appcore_multiwindow_base_instance_h context)
135 {
136         appcore_multiwindow_base_instance *inst = context;
137
138         return inst->id;
139 }
140
141 EXPORT_API const char *appcore_multiwindow_base_instance_get_class_id(appcore_multiwindow_base_instance_h context)
142 {
143         appcore_multiwindow_base_instance *inst = context;
144
145         return inst->shell->id;
146 }
147
148 EXPORT_API const appcore_multiwindow_base_class *appcore_multiwindow_base_instance_get_class(appcore_multiwindow_base_instance_h context)
149 {
150         appcore_multiwindow_base_instance *inst = context;
151
152         return inst->shell;
153 }
154
155 static gint __comp_id(gconstpointer a, gconstpointer b)
156 {
157         const appcore_multiwindow_base_instance *inst = a;
158
159         return strcmp(inst->id, b);
160 }
161
162 EXPORT_API appcore_multiwindow_base_instance_h appcore_multiwindow_base_instance_find(const char *id)
163 {
164         GList * inst_node = g_list_find_custom(_appcore_mw_context.instances, id, __comp_id);
165
166         if (!inst_node)
167                 return NULL;
168
169         return inst_node->data;
170 }
171
172 EXPORT_API void appcore_multiwindow_base_instance_foreach(const char *class_id,
173                 appcore_multiwindow_base_instance_cb cb, void *data)
174 {
175         GList * inst_node = _appcore_mw_context.instances;
176         appcore_multiwindow_base_instance *inst;
177
178         if (!class_id || !cb)
179                 return;
180
181         while (inst_node) {
182                 inst = inst_node->data;
183
184                 if (!strcmp(class_id, inst->shell->id))
185                         cb(class_id, inst->id, inst, data);
186
187                 inst_node = g_list_next(inst_node);
188         }
189 }
190
191 EXPORT_API void appcore_multiwindow_base_instance_foreach_full(appcore_multiwindow_base_instance_cb cb,
192                 void *data)
193 {
194         GList * inst_node = _appcore_mw_context.instances;
195         appcore_multiwindow_base_instance *inst;
196
197         if (!cb)
198                 return;
199
200         while (inst_node) {
201                 inst = inst_node->data;
202                 cb(inst->shell->id, inst->id, inst, data);
203                 inst_node = g_list_next(inst_node);
204         }
205 }
206
207 EXPORT_API int appcore_multiwindow_base_instance_get_cnt(void)
208 {
209         return g_list_length(_appcore_mw_context.instances);
210 }
211
212