Fix:build:Another workaround for intl
[navit-package] / navit / messages.c
1 /**
2  * Navit, a modular navigation system.
3  * Copyright (C) 2005-2008 Navit Team
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * version 2 as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the
16  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA  02110-1301, USA.
18  */
19
20 #include <glib.h>
21 #include <time.h>
22 #include "messages.h"
23 #include "callback.h"
24 #include "event.h"
25 #include "attr.h"
26
27 struct messagelist {
28         struct message *messages;       /**< All the messages that can currently be shown */
29         int last_mid;                                                   /**< Last Message ID */
30         int maxage;                                                             /**< Maximum age of messages */
31         int maxnum;                                                             /**< Maximum number of messages */
32         struct callback *msg_cleanup_cb;                        /**< Callback to clean up the messages */
33         struct event_timeout *msg_cleanup_to;           /**< Idle event to clean up the messages */
34 };
35
36 int
37 message_new(struct messagelist *this_, char *message)
38 {
39         struct message *msg;
40
41         msg = g_new0(struct message, 1);
42         msg->text = g_strdup(message);
43         msg->id = ++(this_->last_mid);
44         msg->time = time(NULL);
45
46         msg->next = this_->messages;
47         this_->messages = msg;
48
49         return msg->id;
50 }
51
52 int
53 message_delete(struct messagelist *this_, int mid)
54 {
55         struct message *msg,*last;;
56
57         msg = this_->messages;
58         last = NULL;
59
60         while (msg) {
61                 if (msg->id == mid) {
62                         break;
63                 }
64
65                 last = msg;
66                 msg = msg->next;
67         }
68
69         if (msg) {
70                 if (last) {
71                         last->next = msg->next;
72                 } else {
73                         this_->messages = msg->next;
74                 }
75
76                 g_free(msg->text);
77                 g_free(msg);
78
79                 return 1;
80         } else {
81                 return 0;
82         }
83 }
84
85 static void 
86 message_cleanup(struct messagelist *this_)
87 {
88         struct message *msg,*next,*prev=NULL;
89         int i;
90         time_t now;
91
92         msg = this_->messages;
93
94         now = time(NULL);
95
96         i = 0;
97         while (msg && (i < this_->maxnum)) {
98                 if ((this_->maxage > 0) && (now - msg->time) > this_->maxage) {
99                         break;
100                 }
101
102                 i++;
103                 prev = msg;
104                 msg = msg->next;
105         }
106
107         if (prev) {
108                 prev->next = NULL;
109         } else {
110                 this_->messages = NULL;
111         }
112
113         while (msg) {
114                 next = msg->next;
115
116                 g_free(msg->text);
117                 g_free(msg);
118
119                 msg = next;
120         }
121 }
122
123 struct messagelist
124 *messagelist_new(struct attr **attrs)
125 {
126         struct messagelist *this = g_new0(struct messagelist, 1);
127         struct attr num_attr,age_attr;
128
129         if (attr_generic_get_attr(attrs, NULL, attr_message_maxage, &age_attr, NULL)) {
130                 this->maxage = age_attr.u.num;
131         } else {
132                 this->maxage = 10;
133         }
134
135         if (attr_generic_get_attr(attrs, NULL, attr_message_maxnum, &num_attr, NULL)) {
136                 this->maxnum = num_attr.u.num;
137         } else {
138                 this->maxnum = 3;
139         }
140
141         return this;
142 }
143
144 void
145 messagelist_init(struct messagelist *this_)
146 {
147         this_->msg_cleanup_cb = callback_new_1(callback_cast(message_cleanup), this_);
148         this_->msg_cleanup_to = event_add_timeout(1000, 1, this_->msg_cleanup_cb);
149 }
150
151 struct message 
152 *message_get(struct messagelist *this_)
153 {
154         return this_->messages;
155 }