Added working_directory parameter to execute_command_line()
[claws.git] / src / plugins / notification / notification_command.c
1 /* Notification plugin for Claws-Mail
2  * Copyright (C) 2005-2007 Holger Berndt
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 3 of the License, or
7  * (at your option) any later version.
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, see <http://www.gnu.org/licenses/>.
16  */
17
18 #ifdef HAVE_CONFIG_H
19 #  include "config.h"
20 #  include "claws-features.h"
21 #endif
22
23 #ifdef NOTIFICATION_COMMAND
24
25 #include <string.h>
26 #include <glib.h>
27 #include "common/utils.h"
28 #include "folder.h"
29 #include "notification_command.h"
30 #include "notification_prefs.h"
31 #include "notification_foldercheck.h"
32
33 typedef struct {
34   gboolean blocked;
35   guint timeout_id;
36 } NotificationCommand;
37
38 static gboolean command_timeout_fun(gpointer data);
39
40 static NotificationCommand command;
41
42 G_LOCK_DEFINE_STATIC(command);
43
44 void notification_command_msg(MsgInfo *msginfo)
45 {
46   gchar *ret_str, *buf;
47   gsize by_read = 0, by_written = 0;
48
49   if(!msginfo || !notify_config.command_enabled || !MSG_IS_NEW(msginfo->flags))
50     return;
51
52   if(!notify_config.command_enabled || !MSG_IS_NEW(msginfo->flags))
53     return;
54
55   if(notify_config.command_folder_specific) {
56     guint id;
57     GSList *list;
58     gchar *identifier;
59     gboolean found = FALSE;
60
61     if(!(msginfo->folder))
62       return;
63
64     identifier = folder_item_get_identifier(msginfo->folder);
65
66     id =
67       notification_register_folder_specific_list(COMMAND_SPECIFIC_FOLDER_ID_STR);
68     list = notification_foldercheck_get_list(id);
69     for(; (list != NULL) && !found; list = g_slist_next(list)) {
70       gchar *list_identifier;
71       FolderItem *list_item = (FolderItem*) list->data;
72       
73       list_identifier = folder_item_get_identifier(list_item);
74       if(!strcmp2(list_identifier, identifier))
75         found = TRUE;
76
77       g_free(list_identifier);
78     }
79     g_free(identifier);
80     
81     if(!found)
82       return;
83   } /* folder specific */
84
85   buf = g_strdup(notify_config.command_line);
86
87   G_LOCK(command);
88
89   if(!command.blocked) {
90     /* execute command */
91     command.blocked = TRUE;
92     ret_str = g_locale_from_utf8(buf,strlen(buf),&by_read,&by_written,NULL);
93     if(ret_str && by_written) {
94       g_free(buf);
95       buf = ret_str;
96     }
97     execute_command_line(buf, TRUE, NULL);
98     g_free(buf);
99   }
100
101   /* block further execution for some time,
102      no matter if it was blocked or not */
103   if(command.timeout_id)
104     g_source_remove(command.timeout_id);
105   command.timeout_id = g_timeout_add(notify_config.command_timeout,
106                                      command_timeout_fun, NULL);    
107   G_UNLOCK(command);
108 }
109
110 static gboolean command_timeout_fun(gpointer data)
111 {
112   G_LOCK(command);
113   command.timeout_id = 0;
114   command.blocked = FALSE;
115   G_UNLOCK(command);
116   return FALSE;
117 }
118
119 #endif /* NOTIFICATION_COMMAND */