ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/ermyth/modules/memoserv/delete.C
Revision: 1.1
Committed: Thu Jul 19 08:24:54 2007 UTC (19 years, 2 months ago) by pippijn
Content type: text/plain
Branch: MAIN
Log Message:
initial import. the most important changes since Atheme are:
- fixed many memory leaks
- fixed many bugs
- converted to C++ and use more STL containers
- added a (not very enhanced yet) perl module
- greatly improved XML-RPC speed
- added a JSON-RPC module with code from json-cpp
- added a valgrind memcheck module to operserv
- added a more object oriented base64 implementation
- added a specialised unit test framework
- improved stability
- use gettimeofday() if available
- reworked adding/removing commands
- MemoServ IGNORE DEL can now remove indices

File Contents

# User Rev Content
1 pippijn 1.1 /*
2     * Copyright © 2005 Atheme Development Group
3     * Rights to this code are as documented in doc/LICENSE.
4     *
5     * This file contains code for the Memoserv DELETE function
6     *
7     * $Id: delete.c 8329 2007-05-27 13:31:59Z jilles $
8     */
9    
10     #include "atheme.h"
11     #include <account/myuser.h>
12     #include <account/mymemo.h>
13    
14     static char const rcsid[] = "$Id";
15    
16     struct ms_delete_listeners : callback::has_listeners
17     {
18     };
19    
20     ms_delete_listeners listeners;
21    
22     DECLARE_MODULE_V1 ("memoserv/delete", false, _modinit, _moddeinit, rcsid, "The Ermyth Team <http://ermyth.schmorp.de>");
23    
24     static void ms_cmd_delete (sourceinfo_t *si, int parc, char *parv[]);
25    
26     command_t ms_delete = { "DELETE", N_("Deletes memos."),
27     AC_NONE, 1, ms_cmd_delete
28     };
29     command_t ms_del = { "DEL", N_("Alias for DELETE"),
30     AC_NONE, 1, ms_cmd_delete
31     };
32    
33     cmdvec *ms_cmdtree;
34     helpvec *ms_helptree;
35    
36     void
37     _modinit (module_t *m)
38     {
39     MODULE_USE_SYMBOL_T (ms_cmdtree, cmdvec, "memoserv/main", "ms_cmdtree");
40     MODULE_USE_SYMBOL_T (ms_helptree, helpvec, "memoserv/main", "ms_helptree");
41    
42     ms_cmdtree << ms_delete;
43     ms_cmdtree << ms_del;
44     help_addentry (ms_helptree, "DELETE", "help/memoserv/delete", NULL);
45     }
46    
47     void
48     _moddeinit ()
49     {
50     ms_cmdtree >> ms_delete;
51     ms_cmdtree >> ms_del;
52     help_delentry (ms_helptree, "DELETE");
53     }
54    
55     static void
56     ms_cmd_delete (sourceinfo_t *si, int parc, char *parv[])
57     {
58     /* Misc structs etc */
59     unsigned memonum = 0, deleteall = 0;
60     mymemo_t *memo;
61     std::vector<mymemo_t *> mortals;
62    
63     /* We only take 1 arg, and we ignore all others */
64     char *arg1 = parv[0];
65    
66     /* Does the arg exist? */
67     if (!arg1)
68     {
69     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "DELETE");
70    
71     command_fail (si, fault_needmoreparams, _("Syntax: DELETE ALL|message id"));
72     return;
73     }
74    
75     /* user logged in? */
76     if (si->smu == NULL)
77     {
78     command_fail (si, fault_noprivs, _("You are not logged in."));
79     return;
80     }
81    
82     /* Do we have any memos? */
83     if (si->smu->memos.empty ())
84     {
85     command_fail (si, fault_nochange, _("You have no memos to delete."));
86     return;
87     }
88    
89     /* Do we want to delete all memos? */
90     if (!strcasecmp ("all", arg1))
91     deleteall = 1;
92     else
93     {
94     memonum = atoi (arg1);
95    
96     /* Make sure they didn't slip us an alphabetic index */
97     if (!memonum)
98     {
99     command_fail (si, fault_badparams, _("Invalid message index."));
100     return;
101     }
102    
103     /* If int, does that index exist? And do we have something to delete? */
104     if (memonum > si->smu->memos.size ())
105     {
106     command_fail (si, fault_nosuch_key, _("The specified memo doesn't exist."));
107     return;
108     }
109     }
110    
111     /* Iterate through memos, doing deletion */
112     if (deleteall)
113     {
114     int delcount = 0;
115     while (!si->smu->memos.empty ())
116     {
117     memo = si->smu->memos.back ();
118     si->smu->memos.erase (memo);
119     free (memo);
120    
121     ++delcount;
122     }
123    
124     command_success_nodata (si, ngettext (N_("%d memo deleted."), N_("%d memos deleted."), delcount), delcount);
125    
126     return;
127     }
128    
129     memo = si->smu->memos[memonum - 1];
130     if (!(memo->status & MEMO_READ))
131     si->smu->memoct_new--;
132    
133     si->smu->memos.erase (memo);
134     free (memo);
135    
136     command_success_nodata (si, _("%d memo deleted."), 1);
137    
138     return;
139     }