Merges from Irssi CVS.
[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 void query_init(QUERY_REC *query, int automatic)
31 {
32         g_return_if_fail(query != NULL);
33         g_return_if_fail(query->name != NULL);
34
35         queries = g_slist_append(queries, query);
36
37         MODULE_DATA_INIT(query);
38         query->type = module_get_uniq_id_str("WINDOW ITEM TYPE", "QUERY");
39         query->destroy = (void (*) (WI_ITEM_REC *)) query_destroy;
40         query->createtime = time(NULL);
41         query->last_unread_msg = time(NULL);
42
43         if (query->server_tag != NULL) {
44                 query->server = server_find_tag(query->server_tag);
45                 if (query->server != NULL) {
46                         query->server->queries =
47                                 g_slist_append(query->server->queries, query);
48                 }
49         }
50
51         signal_emit("query created", 2, query, GINT_TO_POINTER(automatic));
52 }
53
54 void query_destroy(QUERY_REC *query)
55 {
56         g_return_if_fail(IS_QUERY(query));
57
58         if (query->destroying) return;
59         query->destroying = TRUE;
60
61         queries = g_slist_remove(queries, query);
62         if (query->server != NULL) {
63                 query->server->queries =
64                         g_slist_remove(query->server->queries, query);
65         }
66         signal_emit("query destroyed", 1, query);
67
68         MODULE_DATA_DEINIT(query);
69         g_free_not_null(query->hilight_color);
70         g_free_not_null(query->server_tag);
71         g_free_not_null(query->address);
72         g_free(query->name);
73
74         query->type = 0;
75         g_free(query);
76 }
77
78 static QUERY_REC *query_find_server(SERVER_REC *server, const char *nick)
79 {
80         GSList *tmp;
81
82         g_return_val_if_fail(IS_SERVER(server), NULL);
83
84         if (server->query_find_func != NULL) {
85                 /* use the server specific query find function */
86                 return server->query_find_func(server, nick);
87         }
88
89         for (tmp = server->queries; tmp != NULL; tmp = tmp->next) {
90                 QUERY_REC *rec = tmp->data;
91
92                 if (g_strcasecmp(rec->name, nick) == 0)
93                         return rec;
94         }
95
96         return NULL;
97 }
98
99 QUERY_REC *query_find(SERVER_REC *server, const char *nick)
100 {
101         GSList *tmp;
102
103         g_return_val_if_fail(server == NULL || IS_SERVER(server), NULL);
104         g_return_val_if_fail(nick != NULL, NULL);
105
106         if (server != NULL)
107                 return query_find_server(server, nick);
108
109         for (tmp = queries; tmp != NULL; tmp = tmp->next) {
110                 QUERY_REC *rec = tmp->data;
111
112                 if (g_strcasecmp(rec->name, nick) == 0)
113                         return rec;
114         }
115
116         return NULL;
117 }
118
119 void query_change_nick(QUERY_REC *query, const char *nick)
120 {
121         char *oldnick;
122
123         g_return_if_fail(IS_QUERY(query));
124
125         oldnick = query->name;
126         query->name = g_strdup(nick);
127         signal_emit("query nick changed", 2, query, oldnick);
128         signal_emit("window item name changed", 1, query);
129         g_free(oldnick);
130 }
131
132 void query_change_address(QUERY_REC *query, const char *address)
133 {
134         g_return_if_fail(IS_QUERY(query));
135
136         g_free_not_null(query->address);
137         query->address = g_strdup(address);
138         signal_emit("query address changed", 1, query);
139 }
140
141 void query_change_server(QUERY_REC *query, SERVER_REC *server)
142 {
143         g_return_if_fail(IS_QUERY(query));
144
145         if (query->server != NULL) {
146                 query->server->queries =
147                         g_slist_remove(query->server->queries, query);
148         }
149         if (server != NULL)
150                 server->queries = g_slist_append(server->queries, query);
151
152         query->server = server;
153         signal_emit("query server changed", 1, query);
154 }
155
156 void queries_init(void)
157 {
158 }
159
160 void queries_deinit(void)
161 {
162 }