264c9f2c691ab20de0d0a4117c2475af0fb553ce
[framework/api/application.git] / src / app_finalizer.c
1 /*
2  * Copyright (c) 2011 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 <stdlib.h>
19 #include <string.h>
20 #include <libintl.h>
21
22 #include <app_private.h>
23
24 typedef struct _app_finalizer_s_ {
25         app_finalizer_cb callback;
26         void *data;
27         struct _app_finalizer_s_ *next;
28 } app_finalizer_s;
29
30 typedef app_finalizer_s *app_finalizer_h;
31
32 static app_finalizer_s finalizer_head = {
33         .callback = NULL,
34         .data = NULL,
35         .next = NULL
36 };
37
38 int app_finalizer_add(app_finalizer_cb callback, void *data)
39 {
40         app_finalizer_h finalizer_tail = &finalizer_head;
41         app_finalizer_h finalizer_new;
42
43         finalizer_new = malloc(sizeof(app_finalizer_s));
44
45         if (finalizer_new == NULL)
46         {
47                 return app_error(APP_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
48         }
49
50         finalizer_new->callback = callback;
51         finalizer_new->data = data;
52         finalizer_new->next = NULL;
53
54         while (finalizer_tail->next)
55         {
56                 finalizer_tail = finalizer_tail->next;
57         }
58         
59         finalizer_tail->next = finalizer_new;
60
61         return APP_ERROR_NONE;
62 }
63
64 int app_finalizer_remove(app_finalizer_cb callback)
65 {
66         app_finalizer_h finalizer_node = &finalizer_head;
67
68         while (finalizer_node->next)
69         {
70                 if (finalizer_node->next->callback == callback)
71                 {
72                         app_finalizer_h removed_node = finalizer_node->next;
73                         finalizer_node->next = removed_node->next;
74                         free(removed_node);
75                         return APP_ERROR_NONE;
76                 }
77
78                 finalizer_node = finalizer_node->next;
79         }       
80
81         return APP_ERROR_INVALID_PARAMETER;
82 }
83
84 void app_finalizer_execute(void)
85 {
86         app_finalizer_h finalizer_node = &finalizer_head;
87         app_finalizer_h finalizer_executed;
88         app_finalizer_cb finalizer_cb = NULL;
89
90         while (finalizer_node->next)
91         {
92                 finalizer_cb = finalizer_node->next->callback;
93
94                 finalizer_cb(finalizer_node->next->data);
95
96                 finalizer_executed = finalizer_node->next;
97
98                 finalizer_node = finalizer_node->next;
99
100                 free(finalizer_executed);
101         }
102
103         finalizer_head.next = NULL;
104 }
105