store.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include <auth.h>
  5. #include "imap4d.h"
  6. static NamedInt flagMap[] =
  7. {
  8. {"\\Seen", MSeen},
  9. {"\\Answered", MAnswered},
  10. {"\\Flagged", MFlagged},
  11. {"\\Deleted", MDeleted},
  12. {"\\Draft", MDraft},
  13. {"\\Recent", MRecent},
  14. {nil, 0}
  15. };
  16. int
  17. storeMsg(Box *box, Msg *m, int uids, void *vst)
  18. {
  19. Store *st;
  20. int f, flags;
  21. USED(uids);
  22. if(m->expunged)
  23. return uids;
  24. st = vst;
  25. flags = st->flags;
  26. f = m->flags;
  27. if(st->sign == '+')
  28. f |= flags;
  29. else if(st->sign == '-')
  30. f &= ~flags;
  31. else
  32. f = flags;
  33. /*
  34. * not allowed to change the recent flag
  35. */
  36. f = (f & ~MRecent) | (m->flags & MRecent);
  37. setFlags(box, m, f);
  38. if(st->op != STFlagsSilent){
  39. m->sendFlags = 1;
  40. box->sendFlags = 1;
  41. }
  42. return 1;
  43. }
  44. /*
  45. * update flags & global flag counts in box
  46. */
  47. void
  48. setFlags(Box *box, Msg *m, int f)
  49. {
  50. if(f == m->flags)
  51. return;
  52. box->dirtyImp = 1;
  53. if((f & MRecent) != (m->flags & MRecent)){
  54. if(f & MRecent)
  55. box->recent++;
  56. else
  57. box->recent--;
  58. }
  59. m->flags = f;
  60. }
  61. void
  62. sendFlags(Box *box, int uids)
  63. {
  64. Msg *m;
  65. if(!box->sendFlags)
  66. return;
  67. box->sendFlags = 0;
  68. for(m = box->msgs; m != nil; m = m->next){
  69. if(!m->expunged && m->sendFlags){
  70. Bprint(&bout, "* %lud fetch (", m->seq);
  71. if(uids)
  72. Bprint(&bout, "uid %lud ", m->uid);
  73. Bprint(&bout, "flags (");
  74. writeFlags(&bout, m, 1);
  75. Bprint(&bout, "))\r\n");
  76. m->sendFlags = 0;
  77. }
  78. }
  79. }
  80. void
  81. writeFlags(Biobuf *b, Msg *m, int recentOk)
  82. {
  83. char *sep;
  84. int f;
  85. sep = "";
  86. for(f = 0; flagMap[f].name != nil; f++){
  87. if((m->flags & flagMap[f].v)
  88. && (flagMap[f].v != MRecent || recentOk)){
  89. Bprint(b, "%s%s", sep, flagMap[f].name);
  90. sep = " ";
  91. }
  92. }
  93. }
  94. int
  95. msgSeen(Box *box, Msg *m)
  96. {
  97. if(m->flags & MSeen)
  98. return 0;
  99. m->flags |= MSeen;
  100. box->sendFlags = 1;
  101. m->sendFlags = 1;
  102. box->dirtyImp = 1;
  103. return 1;
  104. }
  105. ulong
  106. mapFlag(char *name)
  107. {
  108. return mapInt(flagMap, name);
  109. }