Added SILC Thread Queue API
[crypto.git] / apps / irssi / src / core / queries.c
1 /*
2  queries.c : irssi
3
4     Copyright (C) 1999-2000 Timo Sirainen
5
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 #include "module.h"
22 #include "signals.h"
23 #include "misc.h"
24
25 #include "servers.h"
26 #include "queries.h"
27
28 GSList *queries;
29
30 static const char *query_get_target(WI_ITEM_REC *item)
31 {
32         return ((QUERY_REC *) item)->name;
33 }
34
35 void query_init(QUERY_REC *query, int automatic)
36 {
37         g_return_if_fail(query != NULL);
38         g_return_if_fail(query->name != NULL);
39
40         queries = g_slist_append(queries, query);
41
42         MODULE_DATA_INIT(query);
43         query->type = module_get_uniq_id_str("WINDOW ITEM TYPE", "QUERY");
44         query->destroy = (void (*) (WI_ITEM_REC *)) query_destroy;
45         query->get_target = query_get_target;
46         query->createtime = time(NULL);
47         query->last_unread_msg = time(NULL);
48         query->visible_name = g_strdup(query->name);
49
50         if (query->server_tag != NULL) {
51                 query->server = server_find_tag(query->server_tag);
52                 if (query->server != NULL) {
53                         query->server->queries =
54                                 g_slist_append(query->server->queries, query);
55                 }
56         }
57
58         signal_emit("query created", 2, query, GINT_TO_POINTER(automatic));
59 }
60
61 void query_destroy(QUERY_REC *query)
62 {
63         g_return_if_fail(IS_QUERY(query));
64
65         if (query->destroying) return;
66         query->destroying = TRUE;
67
68         queries = g_slist_remove(queries, query);
69         if (query->server != NULL) {
70                 query->server->queries =
71                         g_slist_remove(query->server->queries, query);
72         }
73         signal_emit("query destroyed", 1, query);
74
75         MODULE_DATA_DEINIT(query);
76         g_free_not_null(query->hilight_color);
77         g_free_not_null(query->server_tag);
78         g_free_not_null(query->address);
79         g_free(query->visible_name);
80         g_free(query->name);
81
82         query->type = 0;
83         g_free(query);
84 }
85
86 static QUERY_REC *query_find_server(SERVER_REC *server, const char *nick)
87 {
88         GSList *tmp;
89
90         g_return_val_if_fail(IS_SERVER(server), NULL);
91
92         if (server->query_find_func != NULL) {
93                 /* use the server specific query find function */
94                 return server->query_find_func(server, nick);
95         }
96
97         for (tmp = server->queries; tmp != NULL; tmp = tmp->next) {
98                 QUERY_REC *rec = tmp->data;
99
100                 if (g_strcasecmp(rec->name, nick) == 0)
101                         return rec;
102         }
103
104         return NULL;
105 }
106
107 QUERY_REC *query_find(SERVER_REC *server, const char *nick)
108 {
109         GSList *tmp;
110
111         g_return_val_if_fail(server == NULL || IS_SERVER(server), NULL);
112         g_return_val_if_fail(nick != NULL, NULL);
113
114         if (server != NULL)
115                 return query_find_server(server, nick);
116
117         for (tmp = queries; tmp != NULL; tmp = tmp->next) {
118                 QUERY_REC *rec = tmp->data;
119
120                 if (g_strcasecmp(rec->name, nick) == 0)
121                         return rec;
122         }
123
124         return NULL;
125 }
126
127 void query_change_nick(QUERY_REC *query, const char *nick)
128 {
129         char *oldnick;
130
131         g_return_if_fail(IS_QUERY(query));
132
133         oldnick = query->name;
134         query->name = g_strdup(nick);
135
136         g_free(query->visible_name);
137         query->visible_name = g_strdup(nick);
138
139         signal_emit("query nick changed", 2, query, oldnick);
140         signal_emit("window item name changed", 1, query);
141         g_free(oldnick);
142 }
143
144 void query_change_address(QUERY_REC *query, const char *address)
145 {
146         g_return_if_fail(IS_QUERY(query));
147
148         g_free_not_null(query->address);
149         query->address = g_strdup(address);
150         signal_emit("query address changed", 1, query);
151 }
152
153 void query_change_server(QUERY_REC *query, SERVER_REC *server)
154 {
155         g_return_if_fail(IS_QUERY(query));
156
157         if (query->server != NULL) {
158                 query->server->queries =
159                         g_slist_remove(query->server->queries, query);
160         }
161         if (server != NULL)
162                 server->queries = g_slist_append(server->queries, query);
163
164         query->server = server;
165         signal_emit("query server changed", 1, query);
166 }
167
168 void queries_init(void)
169 {
170 }
171
172 void queries_deinit(void)
173 {
174 }