source: message.c @ 9866c3a

barnowl_perlaimdebianrelease-1.10release-1.4release-1.5release-1.6release-1.7release-1.8release-1.9
Last change on this file since 9866c3a was 9866c3a, checked in by Alejandro R. Sedeño <asedeno@mit.edu>, 16 years ago
Reworked the fmtext format to use in-line formatting. Characters used for formatting are part of Unicode Supplemental Private Area-B, or Plane 16. fmtext no longer need 5x the text space to store formatting information, though they are harder to change at arbitrary points. This was something we hardly ever did anyhow, and we can still do everything we need to do. fmtext keeps a pair of colors and a char for default attributes to be applied when necessary. Searching is now done inline at owl_fmtext_waddstr() rather than specifying a section of the string to be reversed. This probably still needs some cleanup and more comments, but it works.
  • Property mode set to 100644
File size: 24.2 KB
Line 
1#include <stdlib.h>
2#include <unistd.h>
3#include <string.h>
4#include <sys/socket.h>
5#include <netdb.h>
6#include <sys/types.h>
7#include <sys/socket.h>
8#include <netinet/in.h>
9#include <arpa/inet.h>
10#include <time.h>
11#include "owl.h"
12
13static const char fileIdent[] = "$Id$";
14
15static owl_fmtext_cache fmtext_cache[OWL_FMTEXT_CACHE_SIZE];
16static owl_fmtext_cache * fmtext_cache_next = fmtext_cache;
17
18void owl_message_init_fmtext_cache ()
19{
20    int i;
21    for(i = 0; i < OWL_FMTEXT_CACHE_SIZE; i++) {
22        owl_fmtext_init_null(&(fmtext_cache[i].fmtext));
23        fmtext_cache[i].message = NULL;
24    }
25}
26
27owl_fmtext_cache * owl_message_next_fmtext() /*noproto*/
28{
29    owl_fmtext_cache * f = fmtext_cache_next;
30    if(fmtext_cache_next->message != NULL) {
31        owl_message_invalidate_format(fmtext_cache_next->message);
32    }
33    fmtext_cache_next++;
34    if(fmtext_cache_next - fmtext_cache == OWL_FMTEXT_CACHE_SIZE)
35        fmtext_cache_next = fmtext_cache;
36    return f;
37}
38
39void owl_message_init(owl_message *m)
40{
41  m->id=owl_global_get_nextmsgid(&g);
42  owl_message_set_direction_none(m);
43  m->delete=0;
44  m->zwriteline=NULL;
45
46  owl_message_set_hostname(m, "");
47  owl_list_create(&(m->attributes));
48 
49  /* save the time */
50  m->time=time(NULL);
51  m->timestr=owl_strdup(ctime(&(m->time)));
52  m->timestr[strlen(m->timestr)-1]='\0';
53
54  m->fmtext = NULL;
55}
56
57/* add the named attribute to the message.  If an attribute with the
58 * name already exists, replace the old value with the new value
59 */
60void owl_message_set_attribute(owl_message *m, char *attrname, char *attrvalue)
61{
62  int i, j;
63  owl_pair *p = NULL, *pair = NULL;
64
65  /* look for an existing pair with this key, */
66  j=owl_list_get_size(&(m->attributes));
67  for (i=0; i<j; i++) {
68    p=owl_list_get_element(&(m->attributes), i);
69    if (!strcmp(owl_pair_get_key(p), attrname)) {
70      owl_free(owl_pair_get_value(p));
71      pair = p;
72      break;
73    }
74  }
75
76  if(pair ==  NULL) {
77    pair = owl_malloc(sizeof(owl_pair));
78    owl_pair_create(pair, owl_global_intern(&g, attrname), NULL);
79    owl_list_append_element(&(m->attributes), pair);
80  }
81  owl_pair_set_value(pair, owl_strdup(attrvalue));
82}
83
84/* return the value associated with the named attribute, or NULL if
85 * the attribute does not exist
86 */
87char *owl_message_get_attribute_value(owl_message *m, char *attrname)
88{
89  int i, j;
90  owl_pair *p;
91
92  j=owl_list_get_size(&(m->attributes));
93  for (i=0; i<j; i++) {
94    p=owl_list_get_element(&(m->attributes), i);
95    if (!strcmp(owl_pair_get_key(p), attrname)) {
96      return(owl_pair_get_value(p));
97    }
98  }
99
100  /*
101  owl_function_debugmsg("No attribute %s found for message %i",
102                        attrname,
103                        owl_message_get_id(m));
104  */
105  return(NULL);
106}
107
108/* We cheat and indent it for now, since we really want this for
109 * the 'info' function.  Later there should just be a generic
110 * function to indent fmtext.
111 */
112void owl_message_attributes_tofmtext(owl_message *m, owl_fmtext *fm) {
113  int i, j;
114  owl_pair *p;
115  char *buff;
116
117  owl_fmtext_init_null(fm);
118
119  j=owl_list_get_size(&(m->attributes));
120  for (i=0; i<j; i++) {
121    p=owl_list_get_element(&(m->attributes), i);
122    buff=owl_sprintf("  %-15.15s: %-35.35s\n", owl_pair_get_key(p), owl_pair_get_value(p));
123    if(buff == NULL) {
124      buff=owl_sprintf("  %-15.15s: %-35.35s\n", owl_pair_get_key(p), "<error>");
125      if(buff == NULL)
126        buff=owl_strdup("   <error>\n");
127    }
128    owl_fmtext_append_normal(fm, buff);
129    owl_free(buff);
130  }
131}
132
133void owl_message_invalidate_format(owl_message *m)
134{
135  if(m->fmtext) {
136    m->fmtext->message = NULL;
137    owl_fmtext_clear(&(m->fmtext->fmtext));
138    m->fmtext=NULL;
139  }
140}
141
142owl_fmtext *owl_message_get_fmtext(owl_message *m)
143{
144  owl_message_format(m);
145  return(&(m->fmtext->fmtext));
146}
147
148void owl_message_format(owl_message *m)
149{
150  owl_style *s;
151  owl_view *v;
152
153  if (!m->fmtext) {
154    m->fmtext = owl_message_next_fmtext();
155    m->fmtext->message = m;
156    /* for now we assume there's just the one view and use that style */
157    v=owl_global_get_current_view(&g);
158    s=owl_view_get_style(v);
159
160    owl_style_get_formattext(s, &(m->fmtext->fmtext), m);
161  }
162}
163
164void owl_message_set_class(owl_message *m, char *class)
165{
166  owl_message_set_attribute(m, "class", class);
167}
168
169char *owl_message_get_class(owl_message *m)
170{
171  char *class;
172
173  class=owl_message_get_attribute_value(m, "class");
174  if (!class) return("");
175  return(class);
176}
177
178void owl_message_set_instance(owl_message *m, char *inst)
179{
180  owl_message_set_attribute(m, "instance", inst);
181}
182
183char *owl_message_get_instance(owl_message *m)
184{
185  char *instance;
186
187  instance=owl_message_get_attribute_value(m, "instance");
188  if (!instance) return("");
189  return(instance);
190}
191
192void owl_message_set_sender(owl_message *m, char *sender)
193{
194  owl_message_set_attribute(m, "sender", sender);
195}
196
197char *owl_message_get_sender(owl_message *m)
198{
199  char *sender;
200
201  sender=owl_message_get_attribute_value(m, "sender");
202  if (!sender) return("");
203  return(sender);
204}
205
206void owl_message_set_zsig(owl_message *m, char *zsig)
207{
208  owl_message_set_attribute(m, "zsig", zsig);
209}
210
211char *owl_message_get_zsig(owl_message *m)
212{
213  char *zsig;
214
215  zsig=owl_message_get_attribute_value(m, "zsig");
216  if (!zsig) return("");
217  return(zsig);
218}
219
220void owl_message_set_recipient(owl_message *m, char *recip)
221{
222  owl_message_set_attribute(m, "recipient", recip);
223}
224
225char *owl_message_get_recipient(owl_message *m)
226{
227  /* this is stupid for outgoing messages, we need to fix it. */
228
229  char *recip;
230
231  recip=owl_message_get_attribute_value(m, "recipient");
232  if (!recip) return("");
233  return(recip);
234}
235
236void owl_message_set_realm(owl_message *m, char *realm)
237{
238  owl_message_set_attribute(m, "realm", realm);
239}
240
241char *owl_message_get_realm(owl_message *m)
242{
243  char *realm;
244 
245  realm=owl_message_get_attribute_value(m, "realm");
246  if (!realm) return("");
247  return(realm);
248}
249
250void owl_message_set_body(owl_message *m, char *body)
251{
252  owl_message_set_attribute(m, "body", body);
253}
254
255char *owl_message_get_body(owl_message *m)
256{
257  char *body;
258
259  body=owl_message_get_attribute_value(m, "body");
260  if (!body) return("");
261  return(body);
262}
263
264
265void owl_message_set_opcode(owl_message *m, char *opcode)
266{
267  owl_message_set_attribute(m, "opcode", opcode);
268}
269
270char *owl_message_get_opcode(owl_message *m)
271{
272  char *opcode;
273
274  opcode=owl_message_get_attribute_value(m, "opcode");
275  if (!opcode) return("");
276  return(opcode);
277}
278
279
280void owl_message_set_islogin(owl_message *m)
281{
282  owl_message_set_attribute(m, "loginout", "login");
283}
284
285
286void owl_message_set_islogout(owl_message *m)
287{
288  owl_message_set_attribute(m, "loginout", "logout");
289}
290
291int owl_message_is_loginout(owl_message *m)
292{
293  char *res;
294
295  res=owl_message_get_attribute_value(m, "loginout");
296  if (!res) return(0);
297  return(1);
298}
299
300int owl_message_is_login(owl_message *m)
301{
302  char *res;
303
304  res=owl_message_get_attribute_value(m, "loginout");
305  if (!res) return(0);
306  if (!strcmp(res, "login")) return(1);
307  return(0);
308}
309
310
311int owl_message_is_logout(owl_message *m)
312{
313  char *res;
314
315  res=owl_message_get_attribute_value(m, "loginout");
316  if (!res) return(0);
317  if (!strcmp(res, "logout")) return(1);
318  return(0);
319}
320
321void owl_message_set_isprivate(owl_message *m)
322{
323  owl_message_set_attribute(m, "isprivate", "true");
324}
325
326int owl_message_is_private(owl_message *m)
327{
328  char *res;
329
330  res=owl_message_get_attribute_value(m, "isprivate");
331  if (!res) return(0);
332  return(1);
333}
334
335char *owl_message_get_timestr(owl_message *m)
336{
337  if (m->timestr) return(m->timestr);
338  return("");
339}
340
341/* caller must free the return */
342char *owl_message_get_shorttimestr(owl_message *m)
343{
344  struct tm *tmstruct;
345  char *out;
346
347  tmstruct=localtime(&(m->time));
348  out=owl_sprintf("%2.2i:%2.2i", tmstruct->tm_hour, tmstruct->tm_min);
349  if (out) return(out);
350  return("??:??");
351}
352
353void owl_message_set_type_admin(owl_message *m)
354{
355  owl_message_set_attribute(m, "type", "admin");
356}
357
358void owl_message_set_type_loopback(owl_message *m)
359{
360  owl_message_set_attribute(m, "type", "loopback");
361}
362
363void owl_message_set_type_zephyr(owl_message *m)
364{
365  owl_message_set_attribute(m, "type", "zephyr");
366}
367
368void owl_message_set_type_aim(owl_message *m)
369{
370  owl_message_set_attribute(m, "type", "AIM");
371}
372
373void owl_message_set_type(owl_message *m, char* type)
374{
375  owl_message_set_attribute(m, "type", type);
376}
377
378int owl_message_is_type(owl_message *m, char *type) {
379  char * t = owl_message_get_attribute_value(m, "type");
380  if(!t) return 0;
381  return !strcasecmp(t, type);
382}
383                                               
384int owl_message_is_type_admin(owl_message *m)
385{
386  return owl_message_is_type(m, "admin");
387}
388
389int owl_message_is_type_generic(owl_message *m)
390{
391  char * t = owl_message_get_attribute_value(m, "type");
392  return (t == NULL);
393}
394
395int owl_message_is_type_zephyr(owl_message *m)
396{
397  return owl_message_is_type(m, "zephyr");
398}
399
400int owl_message_is_type_aim(owl_message *m)
401{
402  return owl_message_is_type(m, "aim");
403}
404
405/* XXX TODO: deprecate this */
406int owl_message_is_type_jabber(owl_message *m)
407{
408  return owl_message_is_type(m, "jabber");
409}
410
411int owl_message_is_type_loopback(owl_message *m)
412{
413  return owl_message_is_type(m, "loopback");
414}
415
416int owl_message_is_pseudo(owl_message *m)
417{
418  if (owl_message_get_attribute_value(m, "pseudo")) return(1);
419  return(0);
420}
421
422char *owl_message_get_text(owl_message *m)
423{
424  owl_message_format(m);
425  return(owl_fmtext_get_text(&(m->fmtext->fmtext)));
426}
427
428void owl_message_set_direction_in(owl_message *m)
429{
430  m->direction=OWL_MESSAGE_DIRECTION_IN;
431}
432
433void owl_message_set_direction_out(owl_message *m)
434{
435  m->direction=OWL_MESSAGE_DIRECTION_OUT;
436}
437
438void owl_message_set_direction_none(owl_message *m)
439{
440  m->direction=OWL_MESSAGE_DIRECTION_NONE;
441}
442
443void owl_message_set_direction(owl_message *m, int direction)
444{
445  m->direction=direction;
446}
447
448int owl_message_is_direction_in(owl_message *m)
449{
450  if (m->direction==OWL_MESSAGE_DIRECTION_IN) return(1);
451  return(0);
452}
453
454int owl_message_is_direction_out(owl_message *m)
455{
456  if (m->direction==OWL_MESSAGE_DIRECTION_OUT) return(1);
457  return(0);
458}
459
460int owl_message_is_direction_none(owl_message *m)
461{
462  if (m->direction==OWL_MESSAGE_DIRECTION_NONE) return(1);
463  return(0);
464}
465
466int owl_message_get_numlines(owl_message *m)
467{
468  if (m == NULL) return(0);
469  owl_message_format(m);
470  return(owl_fmtext_num_lines(&(m->fmtext->fmtext)));
471}
472
473void owl_message_mark_delete(owl_message *m)
474{
475  if (m == NULL) return;
476  m->delete=1;
477}
478
479void owl_message_unmark_delete(owl_message *m)
480{
481  if (m == NULL) return;
482  m->delete=0;
483}
484
485char *owl_message_get_zwriteline(owl_message *m)
486{
487  if(!m->zwriteline)
488    return "";
489  return(m->zwriteline);
490}
491
492void owl_message_set_zwriteline(owl_message *m, char *line)
493{
494  if(m->zwriteline) owl_free(m->zwriteline);
495  m->zwriteline=owl_strdup(line);
496}
497
498int owl_message_is_delete(owl_message *m)
499{
500  if (m == NULL) return(0);
501  if (m->delete==1) return(1);
502  return(0);
503}
504
505#ifdef HAVE_LIBZEPHYR
506ZNotice_t *owl_message_get_notice(owl_message *m)
507{
508  return(&(m->notice));
509}
510#else
511void *owl_message_get_notice(owl_message *m)
512{
513  return(NULL);
514}
515#endif
516
517void owl_message_set_hostname(owl_message *m, char *hostname)
518{
519  m->hostname=owl_global_intern(&g, hostname);
520}
521
522char *owl_message_get_hostname(owl_message *m)
523{
524  return(m->hostname);
525}
526
527void owl_message_curs_waddstr(owl_message *m, WINDOW *win, int aline, int bline, int acol, int bcol, int fgcolor, int bgcolor)
528{
529  owl_fmtext a, b;
530
531  /* this will ensure that our cached copy is up to date */
532  owl_message_format(m);
533
534  owl_fmtext_init_null(&a);
535  owl_fmtext_init_null(&b);
536 
537  owl_fmtext_truncate_lines(&(m->fmtext->fmtext), aline, bline-aline+1, &a);
538  owl_fmtext_truncate_cols(&a, acol, bcol, &b);
539  owl_fmtext_colorize(&b, fgcolor);
540  owl_fmtext_colorizebg(&b, bgcolor);
541
542  owl_fmtext_curs_waddstr(&b, win, owl_global_is_search_active(&g));
543
544  owl_fmtext_free(&a);
545  owl_fmtext_free(&b);
546}
547
548int owl_message_is_personal(owl_message *m)
549{
550  owl_filter * f = owl_global_get_filter(&g, "personal");
551  if(!f) {
552      owl_function_error("personal filter is not defined");
553      return (0);
554  }
555  return owl_filter_message_match(f, m);
556}
557
558int owl_message_is_question(owl_message *m)
559{
560  if(!owl_message_is_type_admin(m)) return 0;
561  if(owl_message_get_attribute_value(m, "question") != NULL) return 1;
562  return 0;
563}
564
565int owl_message_is_answered(owl_message *m) {
566  char *q;
567  if(!owl_message_is_question(m)) return 0;
568  q = owl_message_get_attribute_value(m, "question");
569  if(!q) return 0;
570  return !strcmp(q, "answered");
571}
572
573void owl_message_set_isanswered(owl_message *m) {
574  owl_message_set_attribute(m, "question", "answered");
575}
576
577int owl_message_is_from_me(owl_message *m)
578{
579  if (owl_message_is_type_zephyr(m)) {
580    if (!strcasecmp(owl_message_get_sender(m), owl_zephyr_get_sender())) {
581      return(1);
582    } else {
583      return(0);
584    }
585  } else if (owl_message_is_type_aim(m)) {
586    if (!strcasecmp(owl_message_get_sender(m), owl_global_get_aim_screenname(&g))) {
587      return(1);
588    } else {
589      return(0);
590    }
591  } else if (owl_message_is_type_admin(m)) {
592    return(0);
593  }
594  return(0);
595}
596
597int owl_message_is_mail(owl_message *m)
598{
599  if (owl_message_is_type_zephyr(m)) {
600    if (!strcasecmp(owl_message_get_class(m), "mail") && owl_message_is_private(m)) {
601      return(1);
602    } else {
603      return(0);
604    }
605  }
606  return(0);
607}
608
609int owl_message_is_ping(owl_message *m)
610{
611  if (owl_message_is_type_zephyr(m)) {
612    if (!strcasecmp(owl_message_get_opcode(m), "ping")) {
613      return(1);
614    } else {
615      return(0);
616    }
617  }
618  return(0);
619}
620
621int owl_message_is_burningears(owl_message *m)
622{
623  /* we should add a global to cache the short zsender */
624  char sender[LINE], *ptr;
625
626  /* if the message is from us or to us, it doesn't count */
627  if (owl_message_is_from_me(m) || owl_message_is_private(m)) return(0);
628
629  if (owl_message_is_type_zephyr(m)) {
630    strcpy(sender, owl_zephyr_get_sender());
631    ptr=strchr(sender, '@');
632    if (ptr) *ptr='\0';
633  } else if (owl_message_is_type_aim(m)) {
634    strcpy(sender, owl_global_get_aim_screenname(&g));
635  } else {
636    return(0);
637  }
638
639  if (stristr(owl_message_get_body(m), sender)) {
640    return(1);
641  }
642  return(0);
643}
644
645/* caller must free return value. */
646char *owl_message_get_cc(owl_message *m)
647{
648  char *cur, *out, *end;
649
650  cur = owl_message_get_body(m);
651  while (*cur && *cur==' ') cur++;
652  if (strncasecmp(cur, "cc:", 3)) return(NULL);
653  cur+=3;
654  while (*cur && *cur==' ') cur++;
655  out = owl_strdup(cur);
656  end = strchr(out, '\n');
657  if (end) end[0] = '\0';
658  return(out);
659}
660
661/* caller must free return value */
662char *owl_message_get_cc_without_recipient(owl_message *m)
663{
664  char *cc, *out, *end, *user, *recip;
665
666  cc = owl_message_get_cc(m);
667  if (cc == NULL)
668    return NULL;
669
670  recip = short_zuser(owl_message_get_recipient(m));
671  out = owl_malloc(strlen(cc));
672  end = out;
673
674  user = strtok(cc, " ");
675  while (user != NULL) {
676    if (strcasecmp(user, recip) != 0) {
677      strcpy(end, user);
678      end[strlen(user)] = ' ';
679      end += strlen(user) + 1;
680    }
681    user = strtok(NULL, " ");
682  }
683  end[0] = '\0';
684
685  owl_free(recip);
686  owl_free(cc);
687
688  if (strlen(out) == 0) {
689    owl_free(out);
690    out = NULL;
691  }
692
693  return(out);
694}
695
696int owl_message_get_id(owl_message *m)
697{
698  return(m->id);
699}
700
701char *owl_message_get_type(owl_message *m) {
702  char * type = owl_message_get_attribute_value(m, "type");
703  if(!type) {
704    return "generic";
705  }
706  return type;
707}
708
709char *owl_message_get_direction(owl_message *m) {
710  switch (m->direction) {
711  case OWL_MESSAGE_DIRECTION_IN:
712    return("in");
713  case OWL_MESSAGE_DIRECTION_OUT:
714    return("out");
715  case OWL_MESSAGE_DIRECTION_NONE:
716    return("none");
717  default:
718    return("unknown");
719  }
720}
721
722int owl_message_parse_direction(char *d) {
723  if(!strcmp(d, "in")) {
724    return OWL_MESSAGE_DIRECTION_IN;
725  } else if(!strcmp(d, "out")) {
726    return OWL_MESSAGE_DIRECTION_OUT;
727  } else {
728    return OWL_MESSAGE_DIRECTION_NONE;
729  }
730}
731
732
733char *owl_message_get_login(owl_message *m) {
734  if (owl_message_is_login(m)) {
735    return "login";
736  } else if (owl_message_is_logout(m)) {
737    return "logout";
738  } else {
739    return "none";
740  }
741}
742
743
744char *owl_message_get_header(owl_message *m) {
745  return owl_message_get_attribute_value(m, "adminheader");
746}
747
748/* return 1 if the message contains "string", 0 otherwise.  This is
749 * case insensitive because the functions it uses are
750 */
751int owl_message_search(owl_message *m, char *string)
752{
753
754  owl_message_format(m); /* is this necessary? */
755 
756  return (owl_fmtext_search(&(m->fmtext->fmtext), string));
757}
758
759
760/* if loginout == -1 it's a logout message
761 *                 0 it's not a login/logout message
762 *                 1 it's a login message
763 */
764void owl_message_create_aim(owl_message *m, char *sender, char *recipient, char *text, int direction, int loginout)
765{
766  owl_message_init(m);
767  owl_message_set_body(m, text);
768  owl_message_set_sender(m, sender);
769  owl_message_set_recipient(m, recipient);
770  owl_message_set_type_aim(m);
771
772  if (direction==OWL_MESSAGE_DIRECTION_IN) {
773    owl_message_set_direction_in(m);
774  } else if (direction==OWL_MESSAGE_DIRECTION_OUT) {
775    owl_message_set_direction_out(m);
776  }
777
778  /* for now all messages that aren't loginout are private */
779  if (!loginout) {
780    owl_message_set_isprivate(m);
781  }
782
783  if (loginout==-1) {
784    owl_message_set_islogout(m);
785  } else if (loginout==1) {
786    owl_message_set_islogin(m);
787  }
788}
789
790void owl_message_create_admin(owl_message *m, char *header, char *text)
791{
792  owl_message_init(m);
793  owl_message_set_type_admin(m);
794  owl_message_set_body(m, text);
795  owl_message_set_attribute(m, "adminheader", header); /* just a hack for now */
796}
797
798/* caller should set the direction */
799void owl_message_create_loopback(owl_message *m, char *text)
800{
801  owl_message_init(m);
802  owl_message_set_type_loopback(m);
803  owl_message_set_body(m, text);
804  owl_message_set_sender(m, "loopsender");
805  owl_message_set_recipient(m, "looprecip");
806  owl_message_set_isprivate(m);
807}
808
809#ifdef HAVE_LIBZEPHYR
810void owl_message_create_from_znotice(owl_message *m, ZNotice_t *n)
811{
812  struct hostent *hent;
813  char *ptr, *tmp, *tmp2;
814  int len;
815
816  owl_message_init(m);
817 
818  owl_message_set_type_zephyr(m);
819  owl_message_set_direction_in(m);
820 
821  /* first save the full notice */
822  memcpy(&(m->notice), n, sizeof(ZNotice_t));
823
824  /* a little gross, we'll replace \r's with ' ' for now */
825  owl_zephyr_hackaway_cr(&(m->notice));
826 
827  /* save the time, we need to nuke the string saved by message_init */
828  if (m->timestr) owl_free(m->timestr);
829  m->time=n->z_time.tv_sec;
830  m->timestr=owl_strdup(ctime(&(m->time)));
831  m->timestr[strlen(m->timestr)-1]='\0';
832
833  /* set other info */
834  owl_message_set_sender(m, n->z_sender);
835  owl_message_set_class(m, n->z_class);
836  owl_message_set_instance(m, n->z_class_inst);
837  owl_message_set_recipient(m, n->z_recipient);
838  if (n->z_opcode) {
839    owl_message_set_opcode(m, n->z_opcode);
840  } else {
841    owl_message_set_opcode(m, "");
842  }
843  owl_message_set_zsig(m, owl_zephyr_get_zsig(n, &len));
844
845  if ((ptr=strchr(n->z_recipient, '@'))!=NULL) {
846    owl_message_set_realm(m, ptr+1);
847  } else {
848    owl_message_set_realm(m, owl_zephyr_get_realm());
849  }
850
851  /* Set the "isloginout" attribute if it's a login message */
852  if (!strcasecmp(n->z_class, "login") || !strcasecmp(n->z_class, OWL_WEBZEPHYR_CLASS)) {
853    if (!strcasecmp(n->z_opcode, "user_login") || !strcasecmp(n->z_opcode, "user_logout")) {
854      tmp=owl_zephyr_get_field(n, 1);
855      owl_message_set_attribute(m, "loginhost", tmp);
856      owl_free(tmp);
857
858      tmp=owl_zephyr_get_field(n, 3);
859      owl_message_set_attribute(m, "logintty", tmp);
860      owl_free(tmp);
861    }
862
863    if (!strcasecmp(n->z_opcode, "user_login")) {
864      owl_message_set_islogin(m);
865    } else if (!strcasecmp(n->z_opcode, "user_logout")) {
866      owl_message_set_islogout(m);
867    }
868  }
869
870 
871  /* set the "isprivate" attribute if it's a private zephyr.
872   ``private'' means recipient is non-empty and doesn't start wit
873   `@' */
874  if (*n->z_recipient && *n->z_recipient != '@') {
875    owl_message_set_isprivate(m);
876  }
877
878  /* set the "isauto" attribute if it's an autoreply */
879  if (!strcasecmp(n->z_message, "Automated reply:") ||
880      !strcasecmp(n->z_opcode, "auto")) {
881    owl_message_set_attribute(m, "isauto", "");
882  }
883
884  m->zwriteline=owl_strdup("");
885
886  /* save the hostname */
887  owl_function_debugmsg("About to do gethostbyaddr");
888  hent=gethostbyaddr((char *) &(n->z_uid.zuid_addr), sizeof(n->z_uid.zuid_addr), AF_INET);
889  if (hent && hent->h_name) {
890    owl_message_set_hostname(m, hent->h_name);
891  } else {
892    owl_message_set_hostname(m, inet_ntoa(n->z_sender_addr));
893  }
894
895  /* set the body */
896  tmp=owl_zephyr_get_message(n, m);
897  if (owl_global_is_newlinestrip(&g)) {
898    tmp2=owl_util_stripnewlines(tmp);
899    owl_message_set_body(m, tmp2);
900    owl_free(tmp2);
901  } else {
902    owl_message_set_body(m, tmp);
903  }
904  owl_free(tmp);
905
906#ifdef OWL_ENABLE_ZCRYPT
907  /* if zcrypt is enabled try to decrypt the message */
908  if (owl_global_is_zcrypt(&g) && !strcasecmp(n->z_opcode, "crypt")) {
909    char *out;
910    int ret;
911
912    out=owl_malloc(strlen(owl_message_get_body(m))*16+20);
913    ret=owl_zcrypt_decrypt(out, owl_message_get_body(m), owl_message_get_class(m), owl_message_get_instance(m));
914    if (ret==0) {
915      owl_message_set_body(m, out);
916    } else {
917      owl_free(out);
918    }
919  }
920#endif 
921}
922#else
923void owl_message_create_from_znotice(owl_message *m, void *n)
924{
925}
926#endif
927
928/* If 'direction' is '0' it is a login message, '1' is a logout message. */
929void owl_message_create_pseudo_zlogin(owl_message *m, int direction, char *user, char *host, char *time, char *tty)
930{
931  char *longuser, *ptr;
932
933#ifdef HAVE_LIBZEPHYR
934  memset(&(m->notice), 0, sizeof(ZNotice_t));
935#endif
936 
937  longuser=long_zuser(user);
938 
939  owl_message_init(m);
940 
941  owl_message_set_type_zephyr(m);
942  owl_message_set_direction_in(m);
943
944  owl_message_set_attribute(m, "pseudo", "");
945  owl_message_set_attribute(m, "loginhost", host ? host : "");
946  owl_message_set_attribute(m, "logintty", tty ? tty : "");
947
948  owl_message_set_sender(m, longuser);
949  owl_message_set_class(m, "LOGIN");
950  owl_message_set_instance(m, longuser);
951  owl_message_set_recipient(m, "");
952  if (direction==0) {
953    owl_message_set_opcode(m, "USER_LOGIN");
954    owl_message_set_islogin(m);
955  } else if (direction==1) {
956    owl_message_set_opcode(m, "USER_LOGOUT");
957    owl_message_set_islogout(m);
958  }
959
960  if ((ptr=strchr(longuser, '@'))!=NULL) {
961    owl_message_set_realm(m, ptr+1);
962  } else {
963    owl_message_set_realm(m, owl_zephyr_get_realm());
964  }
965
966  m->zwriteline=owl_strdup("");
967
968  owl_message_set_body(m, "<uninitialized>");
969
970  /* save the hostname */
971  owl_function_debugmsg("create_pseudo_login: host is %s", host ? host : "");
972  owl_message_set_hostname(m, host ? host : "");
973  owl_free(longuser);
974}
975
976void owl_message_create_from_zwriteline(owl_message *m, char *line, char *body, char *zsig)
977{
978  owl_zwrite z;
979  int ret;
980  char hostbuff[5000];
981 
982  owl_message_init(m);
983
984  /* create a zwrite for the purpose of filling in other message fields */
985  owl_zwrite_create_from_line(&z, line);
986
987  /* set things */
988  owl_message_set_direction_out(m);
989  owl_message_set_type_zephyr(m);
990  owl_message_set_sender(m, owl_zephyr_get_sender());
991  owl_message_set_class(m, owl_zwrite_get_class(&z));
992  owl_message_set_instance(m, owl_zwrite_get_instance(&z));
993  if (owl_zwrite_get_numrecips(&z)>0) {
994    owl_message_set_recipient(m,
995                              long_zuser(owl_zwrite_get_recip_n(&z, 0))); /* only gets the first user, must fix */
996  }
997  owl_message_set_opcode(m, owl_zwrite_get_opcode(&z));
998  owl_message_set_realm(m, owl_zwrite_get_realm(&z)); /* also a hack, but not here */
999  m->zwriteline=owl_strdup(line);
1000  owl_message_set_body(m, body);
1001  owl_message_set_zsig(m, zsig);
1002 
1003  /* save the hostname */
1004  ret=gethostname(hostbuff, MAXHOSTNAMELEN);
1005  hostbuff[MAXHOSTNAMELEN]='\0';
1006  if (ret) {
1007    owl_message_set_hostname(m, "localhost");
1008  } else {
1009    owl_message_set_hostname(m, hostbuff);
1010  }
1011
1012  /* set the "isprivate" attribute if it's a private zephyr. */
1013  if (owl_zwrite_is_personal(&z)) {
1014    owl_message_set_isprivate(m);
1015  }
1016
1017  owl_zwrite_free(&z);
1018}
1019
1020void owl_message_pretty_zsig(owl_message *m, char *buff)
1021{
1022  /* stick a one line version of the zsig in buff */
1023  char *ptr;
1024
1025  strcpy(buff, owl_message_get_zsig(m));
1026  ptr=strchr(buff, '\n');
1027  if (ptr) ptr[0]='\0';
1028}
1029
1030void owl_message_free(owl_message *m)
1031{
1032  int i, j;
1033  owl_pair *p;
1034#ifdef HAVE_LIBZEPHYR   
1035  if (owl_message_is_type_zephyr(m) && owl_message_is_direction_in(m)) {
1036    ZFreeNotice(&(m->notice));
1037  }
1038#endif
1039  if (m->timestr) owl_free(m->timestr);
1040  if (m->zwriteline) owl_free(m->zwriteline);
1041
1042  /* free all the attributes */
1043  j=owl_list_get_size(&(m->attributes));
1044  for (i=0; i<j; i++) {
1045    p=owl_list_get_element(&(m->attributes), i);
1046    owl_free(owl_pair_get_value(p));
1047    owl_free(p);
1048  }
1049
1050  owl_list_free_simple(&(m->attributes));
1051 
1052  owl_message_invalidate_format(m);
1053}
Note: See TracBrowser for help on using the repository browser.