about summary refs log tree commit diff stats
path: root/Makefile.am
blob: cc4d046fbc073a92ab0fcfc709717d4b4955041c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
core_sources = \
	src/contact.c src/contact.h src/log.c src/common.c \
	src/log.h src/profanity.c src/common.h \
	src/profanity.h src/chat_session.c \
	src/chat_session.h src/muc.c src/muc.h src/jid.h src/jid.c \
	src/chat_state.h src/chat_state.c \
	src/resource.c src/resource.h \
	src/roster_list.c src/roster_list.h \
	src/xmpp/xmpp.h src/xmpp/capabilities.c src/xmpp/connection.c \
	src/xmpp/iq.c src/xmpp/message.c src/xmpp/presence.c src/xmpp/stanza.c \
	src/xmpp/stanza.h src/xmpp/message.h src/xmpp/iq.h src/xmpp/presence.h \
	src/xmpp/capabilities.h src/xmpp/connection.h \
	src/xmpp/roster.c src/xmpp/roster.h \
	src/xmpp/bookmark.c src/xmpp/bookmark.h \
	src/xmpp/form.c src/xmpp/form.h \
	src/event/server_events.c src/event/server_events.h \
	src/event/client_events.c src/event/client_events.h \
	src/event/ui_events.c src/event/ui_events.h \
	src/ui/ui.h src/ui/window.c src/ui/window.h src/ui/core.c \
	src/ui/titlebar.c src/ui/statusbar.c src/ui/inputwin.c \
	src/ui/titlebar.h src/ui/statusbar.h src/ui/inputwin.h \
	src/ui/console.c src/ui/notifier.c \
	src/ui/windows.c src/ui/windows.h \
	src/ui/rosterwin.c src/ui/occupantswin.c \
	src/ui/buffer.c src/ui/buffer.h \
	src/command/command.h src/command/command.c \
	src/command/commands.h src/command/commands.c \
	src/tools/parser.c \
	src/tools/parser.h \
	src/tools/p_sha1.h src/tools/p_sha1.c \
	src/tools/autocomplete.c src/tools/autocomplete.h \
	src/tools/tinyurl.c src/tools/tinyurl.h \
	src/config/accounts.c src/config/accounts.h \
	src/config/account.c src/config/account.h \
	src/config/preferences.c src/config/preferences.h \
	src/config/theme.c src/config/theme.h

unittest_sources = \
	src/contact.c src/contact.h src/common.c \
	src/log.h src/profanity.c src/common.h \
	src/profanity.h src/chat_session.c \
	src/chat_session.h src/muc.c src/muc.h src/jid.h src/jid.c \
	src/resource.c src/resource.h \
	src/chat_state.h src/chat_state.c \
	src/roster_list.c src/roster_list.h \
	src/xmpp/xmpp.h src/xmpp/form.c \
	src/ui/ui.h \
	src/otr/otr.h \
	src/pgp/gpg.h \
	src/command/command.h src/command/command.c \
	src/command/commands.h src/command/commands.c \
	src/tools/parser.c \
	src/tools/parser.h \
	src/tools/p_sha1.h src/tools/p_sha1.c \
	src/tools/autocomplete.c src/tools/autocomplete.h \
	src/tools/tinyurl.c src/tools/tinyurl.h \
	src/config/accounts.h \
	src/config/account.c src/config/account.h \
	src/config/preferences.c src/config/preferences.h \
	src/config/theme.c src/config/theme.h \
	src/ui/windows.c src/ui/windows.h \
	src/ui/window.c src/ui/window.h \
	src/ui/buffer.c \
	src/ui/titlebar.c src/ui/statusbar.c src/ui/inputwin.c \
	src/ui/titlebar.h src/ui/statusbar.h src/ui/inputwin.h \
	src/event/server_events.c src/event/server_events.h \
	src/event/client_events.c src/event/client_events.h \
	src/event/ui_events.c src/event/ui_events.h \
	unittests/xmpp/stub_xmpp.c \
	unittests/ui/stub_ui.c \
	unittests/log/stub_log.c \
	unittests/config/stub_accounts.c \
	unittests/helpers.c unittests/helpers.h \
	unittests/test_cmd_account.c unittests/test_cmd_account.h \
	unittests/test_cmd_alias.c unittests/test_cmd_alias.h \
	unittests/test_cmd_bookmark.c unittests/test_cmd_bookmark.h \
	unittests/test_cmd_connect.c unittests/test_cmd_connect.h \
	unittests/test_cmd_join.c unittests/test_cmd_join.h \
	unittests/test_cmd_otr.c unittests/test_cmd_otr.h \
	unittests/test_cmd_rooms.c unittests/test_cmd_rooms.h \
	unittests/test_cmd_roster.c unittests/test_cmd_roster.h \
	unittests/test_cmd_statuses.c unittests/test_cmd_statuses.h \
	unittests/test_cmd_sub.c unittests/test_cmd_sub.h \
	unittests/test_cmd_disconnect.c unittests/test_cmd_disconnect.h \
	unittests/test_common.c unittests/test_common.h \
	unittests/test_contact.c unittests/test_contact.h \
	unittests/test_form.c unittests/test_form.h \
	unittests/test_jid.c unittests/test_jid.h \
	unittests/test_muc.c unittests/test_muc.h \
	unittests/test_parser.c unittests/test_parser.h \
	unittests/test_preferences.c unittests/test_preferences.h \
	unittests/test_roster_list.c unittests/test_roster_list.h \
	unittests/test_server_events.c unittests/test_server_events.h \
	unittests/test_autocomplete.c unittests/test_autocomplete.h \
	unittests/test_chat_session.c unittests/test_chat_session.h \
	unittests/unittests.c

functionaltest_sources = \
	functionaltests/proftest.c functionaltests/proftest.h \
	functionaltests/test_connect.c functionaltests/test_connect.h \
	functionaltests/test_ping.c functionaltests/test_ping.h \
	functionaltests/test_rooms.c functionaltests/test_rooms.h \
	functionaltests/test_presence.c functionaltests/test_presence.h \
	functionaltests/test_message.c functionaltests/test_message.h \
	functionaltests/test_chat_session.c functionaltests/test_chat_session.h \
	functionaltests/functionaltests.c

main_source = src/main.c

git_include = src/gitversion.h

pgp_sources = \
	src/pgp/gpg.h src/pgp/gpg.c

pgp_test_sources = \
	tests/pgp/stub_gpg.c

otr3_sources = \
	src/otr/otrlib.h src/otr/otrlibv3.c src/otr/otr.h src/otr/otr.c

otr4_sources = \
	src/otr/otrlib.h src/otr/otrlibv4.c src/otr/otr.h src/otr/otr.c

otr_unittest_sources = \
	unittests/otr/stub_otr.c

themes_sources = themes/*

script_sources = bootstrap.sh configure-debug install-all.sh

man_sources = docs/profanity.1

if BUILD_PGP
core_sources += $(pgp_sources)
unittest_sources += $(pgp_test_sources)
endif

if BUILD_OTR
unittest_sources += $(otr_unittest_sources)
if BUILD_OTR3
core_sources += $(otr3_sources)
endif
if BUILD_OTR4
core_sources += $(otr4_sources)
endif
endif

bin_PROGRAMS = profanity
profanity_SOURCES = $(core_sources) $(main_source)
if THEMES_INSTALL
profanity_themesdir = @THEMES_PATH@
profanity_themes_DATA = $(themes_sources)
endif
if INCLUDE_GIT_VERSION
BUILT_SOURCES = $(git_include)
endif

TESTS = unittests/unittests functionaltests/functionaltests
check_PROGRAMS = unittests/unittests functionaltests/functionaltests
unittests_unittests_SOURCES = $(unittest_sources)
unittests_unittests_LDADD = -lcmocka
functionaltests_functionaltests_SOURCES = $(functionaltest_sources)
functionaltests_functionaltests_CFLAGS = -I/usr/include/tcl8.6 -I/usr/include/tcl8.5
functionaltests_functionaltests_LDADD = -lcmocka -lstabber -lexpect -ltcl

man_MANS = $(man_sources)

EXTRA_DIST = $(man_sources) $(themes_sources) $(script_sources) profrc.example LICENSE.txt

if INCLUDE_GIT_VERSION
EXTRA_DIST += .git/HEAD .git/index

$(git_include).in: .git/HEAD .git/index
	rm -f $@
	echo "#ifndef PROF_GIT_BRANCH" >> $@
	echo "#define PROF_GIT_BRANCH \"$(shell git rev-parse --symbolic-full-name --abbrev-ref HEAD)\"" >> $@
	echo "#endif" >> $@
	echo "#ifndef PROF_GIT_REVISION" >> $@
	echo "#define PROF_GIT_REVISION \"$(shell git log --pretty=format:'%h' -n 1)\"" >> $@
	echo "#endif" >> $@

#
# Create $(git_include) atomically to catch possible race. The race can occur
# when $(git_include) is generated in parallel with building of src/profanity.c.
# So this hack allows to find and fix the problem earlier.
#
$(git_include): $(git_include).in
	cp $< $@

clean-local:
	rm -f $(git_include) $(git_include).in
endif
lass="p">) && !chat_session_get_sent(recipient)) { message_send_gone(recipient); } else if (chat_session_is_inactive(recipient) && !chat_session_get_sent(recipient)) { message_send_inactive(recipient); } else if (prefs_get_boolean(PREF_OUTTYPE) && chat_session_is_paused(recipient) && !chat_session_get_sent(recipient)) { message_send_paused(recipient); } } curr = g_slist_next(curr); } if (recipients != NULL) { g_slist_free(recipients); } } } void prof_handle_activity(void) { win_type_t win_type = ui_current_win_type(); jabber_conn_status_t status = jabber_get_connection_status(); if ((status == JABBER_CONNECTED) && (win_type == WIN_CHAT)) { char *recipient = ui_current_recipient(); if (chat_session_get_recipient_supports(recipient)) { chat_session_set_composing(recipient); if (!chat_session_get_sent(recipient) || chat_session_is_paused(recipient)) { message_send_composing(recipient); } } } } /* * Take a line of input and process it, return TRUE if profanity is to * continue, FALSE otherwise */ gboolean process_input(char *inp) { log_debug("Input recieved: %s", inp); gboolean result = FALSE; g_strstrip(inp); // add line to history if something typed if (strlen(inp) > 0) { cmd_history_append(inp); } // just carry on if no input if (strlen(inp) == 0) { result = TRUE; // habdle command if input starts with a '/' } else if (inp[0] == '/') { char inp_cpy[strlen(inp) + 1]; strcpy(inp_cpy, inp); char *command = strtok(inp_cpy, " "); result = cmd_execute(command, inp); // call a default handler if input didn't start with '/' } else { result = cmd_execute_default(inp); } inp_win_reset(); roster_reset_search_attempts(); ui_current_page_off(); return result; } static void _handle_idle_time() { gint prefs_time = prefs_get_autoaway_time() * 60000; resource_presence_t current_presence = accounts_get_last_presence(jabber_get_account_name()); unsigned long idle_ms = ui_get_idle_time(); if (!idle) { if ((current_presence == RESOURCE_ONLINE) || (current_presence == RESOURCE_CHAT)) { if (idle_ms >= prefs_time) { idle = TRUE; // handle away mode if (strcmp(prefs_get_string(PREF_AUTOAWAY_MODE), "away") == 0) { presence_update(RESOURCE_AWAY, prefs_get_string(PREF_AUTOAWAY_MESSAGE), 0); if (prefs_get_string(PREF_AUTOAWAY_MESSAGE) != NULL) { int pri = accounts_get_priority_for_presence_type(jabber_get_account_name(), RESOURCE_AWAY); cons_show("Idle for %d minutes, status set to away (priority %d), \"%s\".", prefs_get_autoaway_time(), pri, prefs_get_string(PREF_AUTOAWAY_MESSAGE)); title_bar_set_presence(CONTACT_AWAY); ui_current_page_off(); } else { int pri = accounts_get_priority_for_presence_type(jabber_get_account_name(), RESOURCE_AWAY); cons_show("Idle for %d minutes, status set to away (priority %d).", prefs_get_autoaway_time(), pri); title_bar_set_presence(CONTACT_AWAY); ui_current_page_off(); } // handle idle mode } else if (strcmp(prefs_get_string(PREF_AUTOAWAY_MODE), "idle") == 0) { presence_update(RESOURCE_ONLINE, prefs_get_string(PREF_AUTOAWAY_MESSAGE), idle_ms / 1000); } } } } else { if (idle_ms < prefs_time) { idle = FALSE; // handle check if (prefs_get_boolean(PREF_AUTOAWAY_CHECK)) { if (strcmp(prefs_get_string(PREF_AUTOAWAY_MODE), "away") == 0) { presence_update(RESOURCE_ONLINE, NULL, 0); int pri = accounts_get_priority_for_presence_type(jabber_get_account_name(), RESOURCE_ONLINE); cons_show("No longer idle, status set to online (priority %d).", pri); title_bar_set_presence(CONTACT_ONLINE); ui_current_page_off(); } else if (strcmp(prefs_get_string(PREF_AUTOAWAY_MODE), "idle") == 0) { presence_update(RESOURCE_ONLINE, NULL, 0); title_bar_set_presence(CONTACT_ONLINE); } } } } } static void _init(const int disable_tls, char *log_level) { setlocale(LC_ALL, ""); // ignore SIGPIPE signal(SIGPIPE, SIG_IGN); _create_directories(); log_level_t prof_log_level = log_level_from_string(log_level); log_init(prof_log_level); if (strcmp(PACKAGE_STATUS, "development") == 0) { #ifdef HAVE_GIT_VERSION log_info("Starting Profanity (%sdev.%s.%s)...", PACKAGE_VERSION, PROF_GIT_BRANCH, PROF_GIT_REVISION); #else log_info("Starting Profanity (%sdev)...", PACKAGE_VERSION); #endif } else { log_info("Starting Profanity (%s)...", PACKAGE_VERSION); } chat_log_init(); groupchat_log_init(); prefs_load(); accounts_load(); gchar *theme = prefs_get_string(PREF_THEME); theme_init(theme); g_free(theme); ui_init(); jabber_init(disable_tls); cmd_init(); log_info("Initialising contact list"); roster_init(); muc_init(); #ifdef HAVE_LIBOTR otr_init(); #endif atexit(_shutdown); } static void _shutdown(void) { ui_close_all_wins(); jabber_disconnect(); jabber_shutdown(); roster_free(); muc_close(); caps_close(); ui_close(); chat_log_close(); prefs_close(); theme_close(); accounts_close(); cmd_uninit(); log_close(); } static void _create_directories(void) { gchar *xdg_config = xdg_get_config_home(); gchar *xdg_data = xdg_get_data_home(); GString *themes_dir = g_string_new(xdg_config); g_string_append(themes_dir, "/profanity/themes"); GString *chatlogs_dir = g_string_new(xdg_data); g_string_append(chatlogs_dir, "/profanity/chatlogs"); GString *logs_dir = g_string_new(xdg_data); g_string_append(logs_dir, "/profanity/logs"); if (!mkdir_recursive(themes_dir->str)) { log_error("Error while creating directory %s", themes_dir->str); } if (!mkdir_recursive(chatlogs_dir->str)) { log_error("Error while creating directory %s", chatlogs_dir->str); } if (!mkdir_recursive(logs_dir->str)) { log_error("Error while creating directory %s", logs_dir->str); } g_string_free(themes_dir, TRUE); g_string_free(chatlogs_dir, TRUE); g_string_free(logs_dir, TRUE); g_free(xdg_config); g_free(xdg_data); }