Changeset dec60b4
- Timestamp:
- Jun 17, 2010, 9:41:41 AM (15 years ago)
- Branches:
- master, release-1.10, release-1.7, release-1.8, release-1.9
- Children:
- 3c2c7fc
- Parents:
- 68e5464 (diff), 95414bf (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - Files:
-
- 20 added
- 2 deleted
- 27 edited
Legend:
- Unmodified
- Added
- Removed
-
.gitignore
r7d03c8d rde18326 35 35 pm_to_blib 36 36 stamp-h1 37 tester38 37 varstubs.c -
Makefile.am
rc45e1eb rdec60b4 12 12 zcrypt_SOURCES = zcrypt.c filterproc.c 13 13 14 check_PROGRAMS = tester perl_tester14 check_PROGRAMS = tester.bin 15 15 16 16 barnowl_bin_SOURCES = $(BASE_SRCS) \ … … 21 21 barnowl_bin_LDADD = libfaim/libfaim.a 22 22 23 tester_ SOURCES = $(BASE_SRCS) \23 tester_bin_SOURCES = $(BASE_SRCS) \ 24 24 owl.h owl_perl.h config.h \ 25 25 $(GEN_C) $(GEN_H) \ 26 26 tester.c 27 27 28 tester_LDADD = libfaim/libfaim.a 29 30 perl_tester_SOURCES = $(BASE_SRCS) \ 31 owl.h owl_perl.h config.h \ 32 $(GEN_C) $(GEN_H) \ 33 perl_tester.c 34 35 perl_tester_LDADD = libfaim/libfaim.a 28 tester_bin_LDADD = libfaim/libfaim.a 36 29 37 30 TESTS=runtests.sh -
barnowl
r9a7b4f2 rde18326 5 5 6 6 SRCDIR=`dirname "${0}"` 7 EXE="$ SRCDIR/barnowl.bin"7 EXE="$0.bin" 8 8 9 9 if ! test -x "$EXE"; then -
global.c
r68e5464 rdec60b4 1032 1032 g->interrupted = 0; 1033 1033 } 1034 1035 void owl_global_setup_default_filters(owl_global *g) 1036 { 1037 int i; 1038 static const struct { 1039 const char *name; 1040 const char *desc; 1041 } filters[] = { 1042 { "personal", 1043 "private ^true$ and ( not type ^zephyr$ or " 1044 "( class ^message and ( instance ^personal$ or instance ^urgent$ ) ) )" }, 1045 { "trash", 1046 "class ^mail$ or opcode ^ping$ or type ^admin$ or ( not login ^none$ )" }, 1047 { "wordwrap", "not ( type ^admin$ or type ^zephyr$ )" }, 1048 { "ping", "opcode ^ping$" }, 1049 { "auto", "opcode ^auto$" }, 1050 { "login", "not login ^none$" }, 1051 { "reply-lockout", "class ^noc or class ^mail$" }, 1052 { "out", "direction ^out$" }, 1053 { "aim", "type ^aim$" }, 1054 { "zephyr", "type ^zephyr$" }, 1055 { "none", "false" }, 1056 { "all", "true" }, 1057 { NULL, NULL } 1058 }; 1059 1060 owl_function_debugmsg("startup: creating default filters"); 1061 1062 for (i = 0; filters[i].name != NULL; i++) 1063 owl_global_add_filter(g, owl_filter_new_fromstring(filters[i].name, 1064 filters[i].desc)); 1065 } -
owl.c
r3aa0522 rdec60b4 149 149 } 150 150 151 static void owl_setup_default_filters(void)152 {153 int i;154 static const struct {155 const char *name;156 const char *desc;157 } filters[] = {158 { "personal",159 "isprivate ^true$ and ( not type ^zephyr$ or ( class ^message ) )" },160 { "trash",161 "class ^mail$ or opcode ^ping$ or type ^admin$ or ( not login ^none$ )" },162 { "wordwrap", "not ( type ^admin$ or type ^zephyr$ )" },163 { "ping", "opcode ^ping$" },164 { "auto", "opcode ^auto$" },165 { "login", "not login ^none$" },166 { "reply-lockout", "class ^noc or class ^mail$" },167 { "out", "direction ^out$" },168 { "aim", "type ^aim$" },169 { "zephyr", "type ^zephyr$" },170 { "none", "false" },171 { "all", "true" },172 { NULL, NULL }173 };174 175 owl_function_debugmsg("startup: creating default filters");176 177 for (i = 0; filters[i].name != NULL; i++)178 owl_global_add_filter(&g, owl_filter_new_fromstring(filters[i].name,179 filters[i].desc));180 }181 151 182 152 /* … … 563 533 owl_global_complete_setup(&g); 564 534 565 owl_ setup_default_filters();535 owl_global_setup_default_filters(&g); 566 536 567 537 /* set the current view */ -
perlconfig.c
r3aa0522 rdec60b4 12 12 /* extern XS(boot_DBI); */ 13 13 14 static void owl_perl_xs_init(pTHX) 14 void owl_perl_xs_init(pTHX) /* noproto */ 15 15 { 16 16 const char *file = __FILE__; … … 363 363 perl_construct(p); 364 364 365 PL_exit_flags |= PERL_EXIT_DESTRUCT_END; 366 365 367 owl_global_set_no_have_config(&g); 366 368 -
runtests.sh
r9f026c1 r5aa33fd 1 1 #!/bin/sh 2 HARNESS_PERL=./perl_tester exec prove t/ 2 SRCDIR=`dirname "${0}"` 3 4 export BARNOWL_DATA_DIR="$SRCDIR/perl/" 5 export BARNOWL_BIN_DIR="$SRCDIR/" 6 7 HARNESS_PERL=./tester exec prove t/ -
t/00-core-tests.t
r1cf3f8d3 r95414bf 1 1 #!/usr/bin/env perl 2 2 use File::Basename; 3 system(dirname($0) . "/../tester" );3 system(dirname($0) . "/../tester", "--builtin"); -
t/mock.pl
r42ad917 r5aa33fd 1 use File::Basename;2 use lib (dirname($0) . '/../perl/lib');3 4 1 package BarnOwl; 5 2 use strict; 6 3 use warnings; 7 use Carp;8 4 9 sub get_data_dir {"."} 10 sub get_config_dir {"."} 11 sub create_style {} 12 13 sub debug { 5 no warnings 'redefine'; 6 sub debug($) { 14 7 warn "[DEBUG] ", shift, "\n" if $ENV{TEST_VERBOSE}; 15 8 } 16 9 17 sub BarnOwl::Internal::new_command {}18 sub BarnOwl::Internal::new_variable_bool {}19 sub BarnOwl::Internal::new_variable_int {}20 sub BarnOwl::Internal::new_variable_string {}21 sub BarnOwl::Editwin::save_excursion(&) {}22 23 use BarnOwl;24 25 10 1; -
tester.c
r3f6555d rdec60b4 1 #define OWL_PERL 2 #define WINDOW FAKE_WINDOW 1 3 #include "owl.h" 4 #undef WINDOW 5 2 6 #include <unistd.h> 3 7 #include <stdlib.h> 4 8 9 #undef instr 10 #include <curses.h> 11 5 12 owl_global g; 6 13 7 14 int numtests; 8 15 16 int owl_regtest(void); 9 17 int owl_util_regtest(void); 10 18 int owl_dict_regtest(void); … … 14 22 int owl_editwin_regtest(void); 15 23 24 extern void owl_perl_xs_init(pTHX); 25 16 26 int main(int argc, char **argv, char **env) 17 27 { 28 FILE *rnull; 29 FILE *wnull; 30 char *perlerr; 31 int status = 0; 32 33 if (argc <= 1) { 34 fprintf(stderr, "Usage: %s --builtin|TEST.t|-le CODE\n", argv[0]); 35 return 1; 36 } 37 18 38 /* initialize a fake ncurses, detached from std{in,out} */ 19 FILE *rnull = fopen("/dev/null", "r");20 FILE *wnull = fopen("/dev/null", "w");39 wnull = fopen("/dev/null", "w"); 40 rnull = fopen("/dev/null", "r"); 21 41 newterm("xterm", wnull, rnull); 22 42 /* initialize global structures */ 23 43 owl_global_init(&g); 24 44 45 perlerr = owl_perlconfig_initperl(NULL, &argc, &argv, &env); 46 if (perlerr) { 47 endwin(); 48 fprintf(stderr, "Internal perl error: %s\n", perlerr); 49 status = 1; 50 goto out; 51 } 52 53 owl_global_complete_setup(&g); 54 owl_global_setup_default_filters(&g); 55 56 owl_view_create(owl_global_get_current_view(&g), "main", 57 owl_global_get_filter(&g, "all"), 58 owl_global_get_style_by_name(&g, "default")); 59 60 owl_function_firstmsg(); 61 62 ENTER; 63 SAVETMPS; 64 65 if (strcmp(argv[1], "--builtin") == 0) { 66 status = owl_regtest(); 67 } else if (strcmp(argv[1], "-le") == 0 && argc > 2) { 68 /* 69 * 'prove' runs its harness perl with '-le CODE' to get some 70 * information out. 71 */ 72 moreswitches("l"); 73 eval_pv(argv[2], true); 74 } else { 75 sv_setpv(get_sv("0", false), argv[1]); 76 sv_setpv(get_sv("main::test_prog", TRUE), argv[1]); 77 78 eval_pv("do $main::test_prog; die($@) if($@)", true); 79 } 80 81 status = 0; 82 83 FREETMPS; 84 LEAVE; 85 86 out: 87 perl_destruct(owl_global_get_perlinterp(&g)); 88 perl_free(owl_global_get_perlinterp(&g)); 89 /* probably not necessary, but tear down the screen */ 90 endwin(); 91 fclose(rnull); 92 fclose(wnull); 93 return status; 94 } 95 96 int owl_regtest(void) { 25 97 numtests = 0; 26 98 int numfailures=0; … … 38 110 } 39 111 printf("1..%d\n", numtests); 40 41 /* probably not necessary, but tear down the screen */42 endwin();43 fclose(rnull);44 fclose(wnull);45 112 46 113 return(numfailures); -
commands.c
r7ba9e0de r89ce405 106 106 OWLCMD_ARGS("zwrite", owl_command_zwrite, OWL_CTX_INTERACTIVE, 107 107 "send a zephyr", 108 "zwrite [-n] [-C] [-c class] [-i instance] [-r realm] [-O opc de] [<user> ...] [-m <message...>]",108 "zwrite [-n] [-C] [-c class] [-i instance] [-r realm] [-O opcode] [<user> ...] [-m <message...>]", 109 109 "Zwrite send a zephyr to the one or more users specified.\n\n" 110 110 "The following options are available:\n\n" … … 138 138 OWLCMD_ARGS("zcrypt", owl_command_zcrypt, OWL_CTX_INTERACTIVE, 139 139 "send an encrypted zephyr", 140 "zcrypt [-n] [-C] [-c class] [-i instance] [-r realm] [-O opc de] [-m <message...>]\n",140 "zcrypt [-n] [-C] [-c class] [-i instance] [-r realm] [-O opcode] [-m <message...>]\n", 141 141 "Behaves like zwrite but uses encryption. Not for use with\n" 142 142 "personal messages\n"), … … 148 148 "allow editing.\n\n" 149 149 "If 'sender' is specified, reply to the sender.\n\n" 150 "If 'all' or no args are specified, reply public ally to the\n"150 "If 'all' or no args are specified, reply publicly to the\n" 151 151 "same class/instance for non-personal messages and to the\n" 152 152 "sender for personal messages.\n\n" … … 266 266 "zpunt <class> <instance> [recipient]\n" 267 267 "zpunt <instance>", 268 "The zpunt command will sup ress messageto the specified\n"268 "The zpunt command will suppress messages to the specified\n" 269 269 "zephyr triplet. In the second usage messages are suppressed\n" 270 270 "for class MESSAGE and the named instance.\n\n" … … 283 283 "punt <filter-text>", 284 284 "punt <filter-text (multiple words)>\n" 285 "The punt command will sup ress messageto the specified\n"285 "The punt command will suppress messages to the specified\n" 286 286 "filter\n\n" 287 287 "SEE ALSO: unpunt, zpunt, show zpunts\n"), … … 586 586 "name style after the -s argument.\n" 587 587 "\n" 588 "The other usages listed above are abbre ivated forms that simply set\n"588 "The other usages listed above are abbreviated forms that simply set\n" 589 589 "the filter of the current view. The -d option allows you to write a\n" 590 590 "filter expression that will be dynamically created by owl and then\n" … … 594 594 OWLCMD_ARGS("smartnarrow", owl_command_smartnarrow, OWL_CTX_INTERACTIVE, 595 595 "view only messages similar to the current message", 596 "smartnarrow [-i | --instance] [-r | --relat de]",596 "smartnarrow [-i | --instance] [-r | --related]", 597 597 "If the curmsg is a personal message narrow\n" 598 598 " to the conversation with that user.\n" … … 614 614 " message, the filter is to that instance.\n" 615 615 "If the curmsg is a class message, the filter is that class.\n" 616 "If the curmsg is a class message and '-i' is speci ed\n"616 "If the curmsg is a class message and '-i' is specified\n" 617 617 " the filter is to that class and instance.\n"), 618 618 … … 674 674 "for formatting messages.\n\n" 675 675 "Show variables will list the names of all variables.\n\n" 676 "Show errors will show a list of errors e countered by Owl.\n\n"676 "Show errors will show a list of errors encountered by Owl.\n\n" 677 677 "SEE ALSO: filter, view, alias, bindkey, help\n"), 678 678 … … 743 743 "set the search highlight string without searching", 744 744 "setsearch <string>", 745 "The setsearch command highlights all occur ences of its\n"745 "The setsearch command highlights all occurrences of its\n" 746 746 "argument and makes it the default argument for future\n" 747 747 "search commands, but does not move the cursor. With\n" … … 2184 2184 argc--; 2185 2185 argv++; 2186 } else if (!strcmp(argv[0], "-r")) {2187 const char *foo;2188 foo=owl_function_create_negative_filter(owl_view_get_filtname(owl_global_get_current_view(&g)));2189 owl_function_change_currentview_filter(foo);2190 2186 } else if (!strcmp(argv[0], "-s")) { 2191 2187 if (argc<2) { -
doc/code.txt
r1286893 r44cc9ab 86 86 Meta. At any one time, there is exactly one active 87 87 keymap which determines where keybindings are looked for 88 (along with its submaps).88 (along with its parents). 89 89 90 90 list: Simple list abstraction. (Uses realloc to resize the list.) -
functions.c
r7ba9e0de r13ebf92 1999 1999 pclose(p); 2000 2000 2001 if (type == OWL_OUTPUT_POPUP) { 2002 owl_function_popless_text(out); 2003 } else if (type == OWL_OUTPUT_RETURN) { 2001 if (type == OWL_OUTPUT_RETURN) { 2004 2002 owl_free(newbuff); 2005 2003 return out; 2006 2004 } else if (type == OWL_OUTPUT_ADMINMSG) { 2007 2005 owl_function_adminmsg(buff, out); 2008 } else {2009 owl_function_popless_text(out);2010 2006 } 2011 2007 owl_free(out); … … 2040 2036 } else if (type == OWL_OUTPUT_RETURN) { 2041 2037 return perlout; 2042 } else {2043 owl_function_popless_text(perlout);2044 2038 } 2045 2039 owl_free(perlout); … … 2505 2499 2506 2500 owl_mainwin_redisplay(owl_global_get_mainwin(&g)); 2501 } 2502 2503 static char *owl_function_smartfilter_cc(const owl_message *m) { 2504 const char *ccs; 2505 char *filtname; 2506 char *text; 2507 owl_filter *f; 2508 2509 ccs = owl_message_get_attribute_value(m, "zephyr_ccs"); 2510 2511 filtname = owl_sprintf("conversation-%s", ccs); 2512 owl_text_tr(filtname, ' ', '-'); 2513 2514 if (owl_global_get_filter(&g, filtname)) { 2515 return filtname; 2516 } 2517 2518 text = owl_sprintf("type ^zephyr$ and filter personal and " 2519 "zephyr_ccs ^%s%s%s$", 2520 owl_getquoting(ccs), ccs, owl_getquoting(ccs)); 2521 2522 f = owl_filter_new_fromstring(filtname, text); 2523 2524 owl_global_add_filter(&g, f); 2525 2526 owl_free(text); 2527 2528 return filtname; 2507 2529 } 2508 2530 … … 2560 2582 if (owl_message_is_type_zephyr(m)) { 2561 2583 if (owl_message_is_personal(m) || owl_message_is_loginout(m)) { 2584 if (owl_message_get_attribute_value(m, "zephyr_ccs") != NULL) { 2585 return owl_function_smartfilter_cc(m); 2586 } 2587 2562 2588 if (owl_message_is_direction_in(m)) { 2563 2589 zperson=short_zuser(owl_message_get_sender(m)); … … 2853 2879 km = owl_keyhandler_get_keymap(kh, kmname); 2854 2880 owl_fmtext_append_bold(&fm, "\n\n----------------------------------------------------------------------------------------------------\n\n"); 2855 owl_keymap_get_details(km, &fm );2881 owl_keymap_get_details(km, &fm, 0); 2856 2882 } 2857 2883 owl_fmtext_append_normal(&fm, "\n"); … … 2879 2905 km = owl_keyhandler_get_keymap(owl_global_get_keyhandler(&g), name); 2880 2906 if (km) { 2881 owl_keymap_get_details(km, &fm );2907 owl_keymap_get_details(km, &fm, 1); 2882 2908 } else { 2883 2909 owl_fmtext_append_normal(&fm, "No such keymap...\n"); -
keymap.c
r8a921b5 r44cc9ab 1 1 #include <string.h> 2 2 #include "owl.h" 3 4 static void _owl_keymap_format_bindings(const owl_keymap *km, owl_fmtext *fm); 5 static void _owl_keymap_format_with_parents(const owl_keymap *km, owl_fmtext *fm); 3 6 4 7 /* returns 0 on success */ … … 9 12 if ((km->desc = owl_strdup(desc)) == NULL) return(-1); 10 13 if (0 != owl_list_create(&km->bindings)) return(-1); 11 km-> submap= NULL;14 km->parent = NULL; 12 15 km->default_fn = default_fn; 13 16 km->prealways_fn = prealways_fn; … … 24 27 } 25 28 26 void owl_keymap_set_ submap(owl_keymap *km, const owl_keymap *submap)27 { 28 km-> submap = submap;29 void owl_keymap_set_parent(owl_keymap *km, const owl_keymap *parent) 30 { 31 km->parent = parent; 29 32 } 30 33 … … 86 89 87 90 /* Appends details about the keymap to fm */ 88 void owl_keymap_get_details(const owl_keymap *km, owl_fmtext *fm) 89 { 90 int i, nbindings; 91 const owl_keybinding *kb; 92 91 void owl_keymap_get_details(const owl_keymap *km, owl_fmtext *fm, int recurse) 92 { 93 93 owl_fmtext_append_bold(fm, "KEYMAP - "); 94 94 owl_fmtext_append_bold(fm, km->name); … … 99 99 owl_fmtext_append_normal(fm, "\n"); 100 100 } 101 if (km-> submap) {102 owl_fmtext_append_normal(fm, OWL_TABSTR "Has submap: ");103 owl_fmtext_append_normal(fm, km-> submap->name);101 if (km->parent) { 102 owl_fmtext_append_normal(fm, OWL_TABSTR "Has parent: "); 103 owl_fmtext_append_normal(fm, km->parent->name); 104 104 owl_fmtext_append_normal(fm, "\n"); 105 105 } … … 119 119 120 120 owl_fmtext_append_bold(fm, "\nKey bindings:\n\n"); 121 if (recurse) { 122 _owl_keymap_format_with_parents(km, fm); 123 } else { 124 _owl_keymap_format_bindings(km, fm); 125 } 126 } 127 128 static void _owl_keymap_format_with_parents(const owl_keymap *km, owl_fmtext *fm) 129 { 130 while (km) { 131 _owl_keymap_format_bindings(km, fm); 132 km = km->parent; 133 if (km) { 134 owl_fmtext_append_bold(fm, "\nInherited from "); 135 owl_fmtext_append_bold(fm, km->name); 136 owl_fmtext_append_bold(fm, ":\n\n"); 137 } 138 } 139 } 140 141 static void _owl_keymap_format_bindings(const owl_keymap *km, owl_fmtext *fm) 142 { 143 int i, nbindings; 144 const owl_keybinding *kb; 145 121 146 nbindings = owl_list_get_size(&km->bindings); 122 147 for (i=0; i<nbindings; i++) { … … 248 273 } 249 274 250 /* deal with the always_fn for the map and submaps */251 for (km=kh->active; km; km=km-> submap) {275 /* deal with the always_fn for the map and parents */ 276 for (km=kh->active; km; km=km->parent) { 252 277 if (km->prealways_fn) { 253 278 km->prealways_fn(j); … … 256 281 257 282 /* search for a match. goes through active keymap and then 258 * through submaps... TODO: clean this up so we can pull283 * through parents... TODO: clean this up so we can pull 259 284 * keyhandler and keymap apart. */ 260 for (km=kh->active; km; km=km-> submap) {285 for (km=kh->active; km; km=km->parent) { 261 286 for (i=owl_list_get_size(&km->bindings)-1; i>=0; i--) { 262 287 kb = owl_list_get_element(&km->bindings, i); -
keys.c
r8a5b5a1 r44cc9ab 30 30 "Text editing and command window", 31 31 owl_keys_editwin_default, NULL, owl_keys_editwin_postalways); 32 owl_keymap_set_ submap(km_editwin, km_global);32 owl_keymap_set_parent(km_editwin, km_global); 33 33 /* 34 34 BIND_CMD("F1", "help", ""); … … 99 99 "Multi-line text editing", 100 100 owl_keys_editwin_default, NULL, owl_keys_editwin_postalways); 101 owl_keymap_set_ submap(km_ew_multi, km_editwin);101 owl_keymap_set_parent(km_ew_multi, km_editwin); 102 102 103 103 BIND_CMD("UP", "edit:move-up-line", ""); … … 129 129 "Single-line text editing", 130 130 owl_keys_editwin_default, NULL, owl_keys_editwin_postalways); 131 owl_keymap_set_ submap(km_ew_onel, km_editwin);131 owl_keymap_set_parent(km_ew_onel, km_editwin); 132 132 133 133 BIND_CMD("C-u", "edit:delete-all", "Clears the entire line"); … … 154 154 "Single-line response to question", 155 155 owl_keys_editwin_default, NULL, owl_keys_editwin_postalways); 156 owl_keymap_set_ submap(km_ew_onel, km_editwin);156 owl_keymap_set_parent(km_ew_onel, km_editwin); 157 157 158 158 BIND_CMD("C-u", "edit:delete-all", "Clears the entire line"); … … 169 169 "Pop-up window (eg, help)", 170 170 owl_keys_default_invalid, NULL, owl_keys_popless_postalways); 171 owl_keymap_set_ submap(km_viewwin, km_global);171 owl_keymap_set_parent(km_viewwin, km_global); 172 172 173 173 BIND_CMD("SPACE", "popless:scroll-down-page", ""); … … 222 222 "Main window / message list", 223 223 owl_keys_default_invalid, owl_keys_recwin_prealways, NULL); 224 owl_keymap_set_ submap(km_mainwin, km_global);224 owl_keymap_set_parent(km_mainwin, km_global); 225 225 BIND_CMD("C-x C-c", "start-command quit", ""); 226 226 BIND_CMD("F1", "help", ""); -
logging.c
r91634ec r839697d 128 128 char filename[MAXPATHLEN], *logpath; 129 129 char *to, *temp; 130 GList *cc; 130 131 131 132 /* expand ~ in path names */ … … 135 136 if (owl_message_is_type_zephyr(m)) { 136 137 /* If this has CC's, do all but the "recipient" which we'll do below */ 137 to = owl_message_get_cc_without_recipient(m); 138 if (to != NULL) { 139 temp = strtok(to, " "); 140 while (temp != NULL) { 141 temp = short_zuser(temp); 142 snprintf(filename, MAXPATHLEN, "%s/%s", logpath, temp); 143 owl_log_append(m, filename); 144 temp = strtok(NULL, " "); 145 } 146 owl_free(to); 147 } 138 cc = owl_message_get_cc_without_recipient(m); 139 while (cc != NULL) { 140 temp = short_zuser(cc->data); 141 snprintf(filename, MAXPATHLEN, "%s/%s", logpath, temp); 142 owl_log_append(m, filename); 143 144 owl_free(cc->data); 145 cc = g_list_delete_link(cc, cc); 146 } 147 148 148 to = short_zuser(owl_message_get_recipient(m)); 149 149 } else if (owl_message_is_type_jabber(m)) { … … 325 325 * the sender, as well. 326 326 */ 327 char *cc, *temp; 327 char *temp; 328 GList *cc; 328 329 cc = owl_message_get_cc_without_recipient(m); 329 if (cc != NULL) { 330 temp = strtok(cc, " "); 331 while (temp != NULL) { 332 temp = short_zuser(temp); 333 if (strcasecmp(temp, frombuff) != 0) { 334 snprintf(filename, MAXPATHLEN, "%s/%s", logpath, temp); 335 owl_log_append(m, filename); 336 } 337 temp = strtok(NULL, " "); 330 while (cc != NULL) { 331 temp = short_zuser(cc->data); 332 if (strcasecmp(temp, frombuff) != 0) { 333 snprintf(filename, MAXPATHLEN, "%s/%s", logpath, temp); 334 owl_log_append(m, filename); 338 335 } 339 owl_free(cc); 336 337 owl_free(cc->data); 338 cc = g_list_delete_link(cc, cc); 340 339 } 341 340 } -
message.c
r9a7b4f2 r89ab5c8 61 61 owl_pair *p = NULL, *pair = NULL; 62 62 63 attrname = g_intern_string(attrname); 64 63 65 /* look for an existing pair with this key, */ 64 66 j=owl_list_get_size(&(m->attributes)); 65 67 for (i=0; i<j; i++) { 66 68 p=owl_list_get_element(&(m->attributes), i); 67 if ( !strcmp(owl_pair_get_key(p), attrname)) {69 if (owl_pair_get_key(p) == attrname) { 68 70 owl_free(owl_pair_get_value(p)); 69 71 pair = p; … … 74 76 if(pair == NULL) { 75 77 pair = owl_malloc(sizeof(owl_pair)); 76 owl_pair_create(pair, owl_global_intern(&g, attrname), NULL);78 owl_pair_create(pair, attrname, NULL); 77 79 owl_list_append_element(&(m->attributes), pair); 78 80 } … … 87 89 int i, j; 88 90 owl_pair *p; 91 GQuark quark; 92 93 quark = g_quark_try_string(attrname); 94 if (quark == 0) 95 /* don't bother inserting into string table */ 96 return NULL; 97 attrname = g_quark_to_string(quark); 89 98 90 99 j=owl_list_get_size(&(m->attributes)); 91 100 for (i=0; i<j; i++) { 92 101 p=owl_list_get_element(&(m->attributes), i); 93 if ( !strcmp(owl_pair_get_key(p), attrname)) {102 if (owl_pair_get_key(p) == attrname) { 94 103 return(owl_pair_get_value(p)); 95 104 } … … 496 505 void owl_message_set_hostname(owl_message *m, const char *hostname) 497 506 { 498 m->hostname =owl_global_intern(&g,hostname);507 m->hostname = g_intern_string(hostname); 499 508 } 500 509 … … 584 593 585 594 /* caller must free return value */ 586 char*owl_message_get_cc_without_recipient(const owl_message *m)587 { 588 char *cc, * out, *end, *shortuser, *recip;595 GList *owl_message_get_cc_without_recipient(const owl_message *m) 596 { 597 char *cc, *shortuser, *recip; 589 598 const char *user; 599 GList *out = NULL; 590 600 591 601 cc = owl_message_get_cc(m); … … 594 604 595 605 recip = short_zuser(owl_message_get_recipient(m)); 596 out = owl_malloc(strlen(cc) + 2);597 end = out;598 606 599 607 user = strtok(cc, " "); … … 601 609 shortuser = short_zuser(user); 602 610 if (strcasecmp(shortuser, recip) != 0) { 603 strcpy(end, user); 604 end[strlen(user)] = ' '; 605 end += strlen(user) + 1; 611 out = g_list_prepend(out, owl_strdup(user)); 606 612 } 607 613 owl_free(shortuser); 608 614 user = strtok(NULL, " "); 609 615 } 610 end[0] = '\0';611 616 612 617 owl_free(recip); 613 618 owl_free(cc); 614 615 if (strlen(out) == 0) {616 owl_free(out);617 out = NULL;618 }619 619 620 620 return(out); … … 732 732 owl_message_set_recipient(m, "looprecip"); 733 733 owl_message_set_isprivate(m); 734 } 735 736 void owl_message_save_ccs(owl_message *m) { 737 GList *cc; 738 char *tmp; 739 740 cc = owl_message_get_cc_without_recipient(m); 741 742 if (cc != NULL) { 743 GString *recips = g_string_new(""); 744 cc = g_list_prepend(cc, short_zuser(owl_message_get_sender(m))); 745 cc = g_list_prepend(cc, short_zuser(owl_message_get_recipient(m))); 746 cc = g_list_sort(cc, (GCompareFunc)strcasecmp); 747 748 while(cc != NULL) { 749 /* Collapse any identical entries */ 750 while (cc->next && strcasecmp(cc->data, cc->next->data) == 0) { 751 owl_free(cc->data); 752 cc = g_list_delete_link(cc, cc); 753 } 754 755 tmp = short_zuser(cc->data); 756 g_string_append(recips, tmp); 757 758 owl_free(tmp); 759 owl_free(cc->data); 760 cc = g_list_delete_link(cc, cc); 761 762 if (cc) 763 g_string_append_c(recips, ' '); 764 } 765 766 owl_message_set_attribute(m, "zephyr_ccs", recips->str); 767 g_string_free(recips, true); 768 } 734 769 } 735 770 … … 869 904 } 870 905 } 906 907 owl_message_save_ccs(m); 871 908 } 872 909 #else … … 963 1000 owl_message_set_isprivate(m); 964 1001 } 1002 1003 owl_message_save_ccs(m); 965 1004 } 966 1005 -
owl.h
r7ba9e0de r68e5464 476 476 char *desc; /* description */ 477 477 owl_list bindings; /* key bindings */ 478 const struct _owl_keymap * submap; /* submap*/478 const struct _owl_keymap *parent; /* parent */ 479 479 void (*default_fn)(owl_input j); /* default action (takes a keypress) */ 480 480 void (*prealways_fn)(owl_input j); /* always called before a keypress is received */ … … 521 521 short **pairs; 522 522 } owl_colorpair_mgr; 523 524 typedef struct _owl_obarray {525 owl_list strings;526 } owl_obarray;527 523 528 524 typedef struct _owl_io_dispatch { … … 599 595 owl_colorpair_mgr cpmgr; 600 596 pid_t newmsgproc_pid; 601 int malloced, freed;602 597 owl_regex search_re; 603 598 aim_session_t aimsess; … … 610 605 char *aim_screenname_for_filters; /* currently logged in AIM screen name */ 611 606 owl_buddylist buddylist; /* list of logged in AIM buddies */ 612 owl_list messagequeue;/* for queueing up aim and other messages */607 GQueue *messagequeue; /* for queueing up aim and other messages */ 613 608 owl_dict styledict; /* global dictionary of available styles */ 614 609 char *response; /* response to the last question asked */ … … 623 618 int pseudologin_notify; 624 619 struct termios startup_tio; 625 owl_obarray obarray;626 620 owl_list io_dispatch_list; 627 621 owl_list psa_list; -
perl/lib/BarnOwl/Hooks.pm
rb30c256 r3aa0522 79 79 our %EXPORT_TAGS = (all => [@EXPORT_OK]); 80 80 81 use BarnOwl::MainLoopCompatHook; 82 81 83 our $startup = BarnOwl::Hook->new; 82 84 our $shutdown = BarnOwl::Hook->new; 83 85 our $receiveMessage = BarnOwl::Hook->new; 84 86 our $newMessage = BarnOwl::Hook->new; 85 our $mainLoop = BarnOwl:: Hook->new;87 our $mainLoop = BarnOwl::MainLoopCompatHook->new; 86 88 our $getBuddyList = BarnOwl::Hook->new; 87 89 our $getQuickstart = BarnOwl::Hook->new; … … 162 164 } 163 165 166 $mainLoop->check_owlconf(); 164 167 $startup->run(0); 165 168 BarnOwl::startup() if *BarnOwl::startup{CODE}; … … 186 189 187 190 BarnOwl::new_msg($m) if *BarnOwl::new_msg{CODE}; 188 }189 190 sub _mainloop_hook {191 $mainLoop->run;192 BarnOwl::mainloop_hook() if *BarnOwl::mainloop_hook{CODE};193 191 } 194 192 -
perl/lib/BarnOwl/Message/Generic.pm
ree183be r5d1324f 6 6 use base qw( BarnOwl::Message ); 7 7 8 sub body { "" } 9 8 10 9 11 1; -
perl/lib/BarnOwl/Style/Default.pm
r0fe69d2 r08544e0 32 32 my $m = shift; 33 33 return $m->is_personal && $m->direction eq "in"; 34 } 35 36 sub maybe { 37 my $x = shift; 38 return defined($x) ? $x : ""; 34 39 } 35 40 … … 99 104 $header .= ' / ' . $self->humanize($m->subcontext, 1); 100 105 } 101 $header .= ' / @b{' . $m->pretty_sender. '}';106 $header .= ' / @b{' . maybe($m->pretty_sender) . '}'; 102 107 } 103 108 -
perl/lib/BarnOwl/Timer.pm
ree183be r8d16e58 21 21 } 22 22 23 sub stop { 24 my $self = shift; 25 if(defined($self->{timer})) { 26 BarnOwl::Internal::remove_timer($self->{timer}); 27 undef $self->{timer}; 28 } 29 } 30 23 31 sub do_callback { 24 32 my $self = shift; … … 28 36 sub DESTROY { 29 37 my $self = shift; 30 if(defined($self->{timer})) { 31 BarnOwl::Internal::remove_timer($self->{timer}); 32 } 38 $self->stop; 33 39 } 34 40 -
perl/modules/Jabber/lib/BarnOwl/Message/Jabber.pm
rc854e74 r2f25537 20 20 sub to { shift->{to} }; 21 21 sub room { shift->{room} }; 22 sub nick { shift->{nick} }; 22 23 sub subject { shift->{subject} }; 23 24 sub status { shift->{status} } … … 41 42 sub long_sender { 42 43 my $self = shift; 44 if ($self->jtype eq 'groupchat' && $self->nick) { 45 my $from_jid = Net::Jabber::JID->new($self->from); 46 if ($from_jid->GetJID('base') eq $self->room && 47 $from_jid->GetResource() eq $self->nick) { 48 return $self->nick; 49 } 50 } 43 51 return $self->from; 44 52 } … … 77 85 } elsif ($self->jtype eq 'groupchat') { 78 86 my $room = $self->room; 79 $filter = "jabber-room-$room"; 80 BarnOwl::command(qw[filter], $filter, 81 qw[type ^jabber$ and room], "^\Q$room\E\$"); 87 if ($inst) { 88 my $subject = $self->subject; 89 $filter = "jabber-room-$room-subject-$subject"; 90 BarnOwl::command(qw[filter], $filter, 91 qw[type ^jabber$ and room], "^\Q$room\E\$", 92 qw[and subject], "^\Q$subject\E\$"); 93 } else { 94 $filter = "jabber-room-$room"; 95 BarnOwl::command(qw[filter], $filter, 96 qw[type ^jabber$ and room], "^\Q$room\E\$"); 97 } 82 98 return $filter; 83 99 } elsif ($self->login ne 'none') { -
perl/modules/Jabber/lib/BarnOwl/Module/Jabber.pm
r8789410 r2f25537 285 285 { 286 286 summary => "Send a Jabber Message", 287 usage => "jwrite <jid> [-t <thread>] [-s <subject>] [-a <account>] "287 usage => "jwrite <jid> [-t <thread>] [-s <subject>] [-a <account>] [-m <message>]" 288 288 } 289 289 ); … … 308 308 description => "jmuc sends Jabber commands related to MUC.\n\n" 309 309 . "The following commands are available\n\n" 310 . "join <muc> Join a MUC.\n\n" 310 . "join <muc>[/<nick>]\n" 311 . " Join a MUC (with a given nickname, or otherwise your JID).\n\n" 311 312 . "part <muc> Part a MUC.\n" 312 313 . " The MUC is taken from the current message if not supplied.\n\n" … … 377 378 my $cjidStr = $conn->baseJIDExists($jidStr); 378 379 if ($cjidStr) { 379 BarnOwl::error("Already logged in as $cjidStr."); 380 return; 380 die("Already logged in as $cjidStr.\n"); 381 381 } 382 382 } … … 387 387 388 388 if ( !$uid || !$componentname ) { 389 BarnOwl::error("usage: $cmd JID"); 390 return; 389 die("usage: $cmd JID\n"); 391 390 } 392 391 393 392 if ( $conn->jidActive($jidStr) ) { 394 BarnOwl::error("Already logged in as $jidStr."); 395 return; 393 die("Already logged in as $jidStr.\n"); 396 394 } elsif ($conn->jidExists($jidStr)) { 397 395 return $conn->tryReconnect($jidStr, 1); … … 526 524 sub cmd_jlist { 527 525 if ( !( scalar $conn->getJIDs() ) ) { 528 BarnOwl::error("You are not logged in to Jabber."); 529 return; 526 die("You are not logged in to Jabber.\n"); 530 527 } 531 528 BarnOwl::popless_ztext( onGetBuddyList() ); … … 534 531 sub cmd_jwrite { 535 532 if ( !$conn->connected() ) { 536 BarnOwl::error("You are not logged in to Jabber."); 537 return; 533 die("You are not logged in to Jabber.\n"); 538 534 } 539 535 … … 543 539 my $jwrite_thread = ""; 544 540 my $jwrite_subject = ""; 541 my $jwrite_body; 545 542 my ($to, $from); 546 543 my $jwrite_type = "chat"; … … 554 551 'subject=s' => \$jwrite_subject, 555 552 'account=s' => \$from, 556 'id=s' => \$jwrite_sid, 553 'id=s' => \$jwrite_sid, 554 'message=s' => \$jwrite_body, 557 555 ) or die("Usage: jwrite <jid> [-t <thread>] [-s <subject>] [-a <account>]\n"); 558 556 $jwrite_type = 'groupchat' if $gc; 559 557 560 558 if ( scalar @ARGV != 1 ) { 561 BarnOwl::error( 562 "Usage: jwrite <jid> [-t <thread>] [-s <subject>] [-a <account>]"); 563 return; 559 die("Usage: jwrite <jid> [-t <thread>] [-s <subject>] [-a <account>]\n"); 564 560 } 565 561 else { … … 570 566 571 567 unless(scalar @candidates) { 572 die("Unable to resolve JID $to ");568 die("Unable to resolve JID $to\n"); 573 569 } 574 570 … … 577 573 unless(scalar @candidates) { 578 574 if(!$from) { 579 die("You must specify an account with -a ");575 die("You must specify an account with -a\n"); 580 576 } else { 581 die("Unable to resolve account $from ");577 die("Unable to resolve account $from\n"); 582 578 } 583 579 } … … 594 590 type => $jwrite_type 595 591 }; 592 593 if (defined($jwrite_body)) { 594 process_owl_jwrite($jwrite_body); 595 return; 596 } 596 597 597 598 if(scalar @candidates > 1) { … … 631 632 my $func = $jmuc_commands{$cmd}; 632 633 if ( !$func ) { 633 BarnOwl::error("jmuc: Unknown command: $cmd"); 634 return; 634 die("jmuc: Unknown command: $cmd\n"); 635 635 } 636 636 … … 654 654 } 655 655 else { 656 BarnOwl::error('You must specify an account with -a <jid>');656 die("You must specify an account with -a <jid>\n"); 657 657 } 658 658 return $func->( $jid, $muc, @ARGV ); … … 667 667 668 668 $muc = shift @ARGV 669 or die("Usage: jmuc join <muc> [-p <password>] [-a <account>] ");669 or die("Usage: jmuc join <muc> [-p <password>] [-a <account>]\n"); 670 670 671 671 die("Error: Must specify a fully-qualified MUC name (e.g. barnowl\@conference.mit.edu)\n") … … 680 680 MaxChars => 0 681 681 }); 682 $completion_jids{$muc } = 1;682 $completion_jids{$muc->GetJID('base')} = 1; 683 683 return; 684 684 } … … 688 688 689 689 $muc = shift @args if scalar @args; 690 die("Usage: jmuc part [<muc>] [-a <account>] ") unless $muc;690 die("Usage: jmuc part [<muc>] [-a <account>]\n") unless $muc; 691 691 692 692 if($conn->getConnectionFromJID($jid)->MUCLeave(JID => $muc)) { 693 693 queue_admin_msg("$jid has left $muc."); 694 694 } else { 695 die("Error: Not joined to $muc ");695 die("Error: Not joined to $muc\n"); 696 696 } 697 697 } … … 703 703 $muc = shift @args if scalar @args; 704 704 705 die( 'Usage: jmuc invite <jid> [<muc>] [-a <account>]')705 die("Usage: jmuc invite <jid> [<muc>] [-a <account>]\n") 706 706 unless $muc && $invite_jid; 707 707 … … 718 718 my ( $jid, $muc, @args ) = @_; 719 719 $muc = shift @args if scalar @args; 720 die("Usage: jmuc configure [<muc>] ") unless $muc;720 die("Usage: jmuc configure [<muc>]\n") unless $muc; 721 721 my $iq = Net::Jabber::IQ->new(); 722 722 $iq->SetTo($muc); … … 759 759 760 760 $muc = shift @args if scalar @args; 761 die("Usage: jmuc presence [<muc>] ") unless $muc;761 die("Usage: jmuc presence [<muc>]\n") unless $muc; 762 762 763 763 if ($muc eq '-a') { … … 774 774 else { 775 775 my $m = $conn->getConnectionFromJID($jid)->FindMUC(jid => $muc); 776 die("No such muc: $muc ") unless $m;776 die("No such muc: $muc\n") unless $m; 777 777 BarnOwl::popless_ztext(jmuc_presence_single($m)); 778 778 } … … 801 801 my $func = $jroster_commands{$cmd}; 802 802 if ( !$func ) { 803 BarnOwl::error("jroster: Unknown command: $cmd"); 804 return; 803 die("jroster: Unknown command: $cmd\n"); 805 804 } 806 805 … … 825 824 } 826 825 else { 827 BarnOwl::error('You must specify an account with -a <jid>');826 die("You must specify an account with -a <jid>\n"); 828 827 } 829 828 return $func->( $jid, $name, \@groups, $purgeGroups, @ARGV ); … … 849 848 } 850 849 else { 851 BarnOwl::error('You must specify an account with -a <jid>');850 die("You must specify an account with -a <jid>\n"); 852 851 } 853 852 … … 1234 1233 $completion_jids{$room} = 1; 1235 1234 1235 my $muc; 1236 if ($dir eq 'in') { 1237 my $connection = $conn->getConnectionFromSid($props{sid}); 1238 $muc = $connection->FindMUC(jid => $from); 1239 } else { 1240 my $connection = $conn->getConnectionFromJID($props{from}); 1241 $muc = $connection->FindMUC(jid => $to); 1242 } 1243 $props{from} = $muc->GetFullJID($from) || $props{from}; 1236 1244 $props{sender} = $nick || $room; 1237 1245 $props{recipient} = $room; … … 1331 1339 return $givenJIDStr if ($conn->jidExists($givenJIDStr) ); 1332 1340 return resolveConnectedJID($givenJID->GetJID('base')) if $loose; 1333 die("Invalid account: $givenJIDStr ");1341 die("Invalid account: $givenJIDStr\n"); 1334 1342 } 1335 1343 … … 1384 1392 # Not one of ours. 1385 1393 else { 1386 die("Invalid account: $givenJIDStr ");1394 die("Invalid account: $givenJIDStr\n"); 1387 1395 } 1388 1396 … … 1430 1438 if($from) { 1431 1439 $from_jid = resolveConnectedJID($from, 1); 1432 die("Unable to resolve account $from ") unless $from_jid;1440 die("Unable to resolve account $from\n") unless $from_jid; 1433 1441 $to_jid = resolveDestJID($to, $from_jid); 1434 1442 push @matches, [$from_jid, $to_jid] if $to_jid; -
perl/modules/Makefile.am
r636de2a r1fd469d4 1 MODULES = Jabber IRC WordWrap 1 MODULES = Jabber IRC WordWrap Twitter 2 2 3 3 EXTRA_DIST = $(MODULES:=/Makefile.PL) $(MODULES:=/inc) $(MODULES:=/lib) -
variable.c
r3687413 rd544237 110 110 111 111 OWLVAR_ENUM( "loggingdirection" /* %OwlVarStub */, OWL_LOGGING_DIRECTION_BOTH, 112 "specifi ces which kind of messages should be logged",112 "specifies which kind of messages should be logged", 113 113 "Can be one of 'both', 'in', or 'out'. If 'in' is\n" 114 114 "selected, only incoming messages are logged, if 'out'\n" … … 138 138 "location of users in your .anyone file. If a user is present\n" 139 139 "but sent no login message, or a user is not present that sent no\n" 140 "logout message, a pseudo login or logout message wil be created\n",140 "logout message, a pseudo login or logout message will be created\n", 141 141 NULL, owl_variable_pseudologins_set, NULL), 142 142 … … 151 151 152 152 "If non empty, any messages matching the given filter will be logged.\n" 153 "This is a completely separate mechanis im from the other logging\n"153 "This is a completely separate mechanism from the other logging\n" 154 154 "variables like logging, classlogging, loglogins, loggingdirection,\n" 155 155 "etc. If you want this variable to control all logging, make sure\n" … … 198 198 OWLVAR_PATH( "newmsgproc" /* %OwlVarStub:newmsgproc */, NULL, 199 199 "name of a program to run when new messages are present", 200 "The named program will be run when owl rece vies new.\n"200 "The named program will be run when owl receives new\n" 201 201 "messages. It will not be run again until the first\n" 202 202 "instance exits"), … … 213 213 "Called every time you start a zephyrgram without an\n" 214 214 "explicit zsig. The default setting implements the policy\n" 215 "descri pted in the documentation for the 'zsig' variable.\n"),215 "described in the documentation for the 'zsig' variable.\n"), 216 216 217 217 OWLVAR_STRING( "zsig" /* %OwlVarStub */, "", … … 297 297 "number of seconds after AIM login to ignore login messages", 298 298 "This specifies the number of seconds to wait after an\n" 299 "AIM login before allowing the rec ipt of AIM login notifications.\n"299 "AIM login before allowing the receipt of AIM login notifications.\n" 300 300 "By default this is set to 15. If you would like to view login\n" 301 301 "notifications of buddies as soon as you login, set it to 0 instead."), -
zephyr.c
r3687413 r922f589 258 258 259 259 if (stat(subsfile, &statbuff) != 0) { 260 owl_free(subsfile); 260 261 if (error_on_nofile == 1) 261 262 return -1; … … 373 374 subsfile = owl_zephyr_dotfile(".anyone", filename); 374 375 375 if (stat(subsfile, &statbuff) == -1) 376 if (stat(subsfile, &statbuff) == -1) { 377 owl_free(subsfile); 376 378 return 0; 379 } 377 380 378 381 ZResetAuthentication();
Note: See TracChangeset
for help on using the changeset viewer.