ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/proj/trunk/WinXPFAQPoll/Poller.cpp
(Generate patch)

Comparing trunk/WinXPFAQPoll/Poller.cpp (file contents):
Revision 104 by douglas, 2003-03-31T20:18:26-08:00 vs.
Revision 121 by douglas, 2003-04-01T20:21:47-08:00

# Line 8 | Line 8
8  
9   Poller::Poller()
10   {
11 <        //
11 >        string mailbox = session->list("\"\" \"" + account.getMailbox() + "\"");
12 >
13 >        if (mailbox.find(account.getMailbox()) == string::npos)
14 >        {
15 >                cerr << program << ": Mailbox does not exist: " << account.getMailbox()
16 >                        << "\n";
17 >
18 >                exit(1);
19 >        }
20 > }
21 >
22 > void Poller::poll(bool nodelete, const string& file)
23 > {
24 >        this->nodelete = nodelete;
25 >        this->file = file;
26 >
27 >        load();
28 >
29 >        ballots();
30 >        approvals();
31 >
32 >        save();
33 > }
34 >
35 > void Poller::load()
36 > {
37 >        ifstream fin(file.c_str());
38 >        if (!fin.is_open())
39 >        {
40 >                ofstream fout(file.c_str());
41 >
42 >                fout << "_find_\n"
43 >                        << "reply=0\n"
44 >                        << "news=0\n"
45 >                        << "sig=0\n"
46 >                        << "search=0\n"
47 >                        << "link=0\n"
48 >                        << "browse=0\n"
49 >                        << "other=0\n"
50 >                        << "_help_\n"
51 >                        << "solved=0\n"
52 >                        << "note=0\n"
53 >                        << "link=0\n"
54 >                        << "news=0\n"
55 >                        << "lazy=0\n"
56 >                        << "_improve_\n"
57 >                        << "nothing=0\n"
58 >                        << "links=0\n"
59 >                        << "suggest=0\n";
60 >
61 >                fout.close();
62 >
63 >                fin.open(file.c_str());
64 >        }
65 >
66 >        do
67 >        {
68 >                enum { FIND, HELP, IMPROVE } type;
69 >                string vote;
70 >                unsigned count;
71 >                string text;
72 >
73 >                getline(fin, vote, '=');
74 >                if (debug) cerr << "vote = " << vote << "\n";
75 >
76 >                if (vote == "_find_")
77 >                {
78 >                        type = FIND;
79 >                        continue;
80 >                }
81 >                else if (vote == "_help_")
82 >                {
83 >                        type = HELP;
84 >                        continue;
85 >                }
86 >                else if (vote == "_improve_")
87 >                {
88 >                        type = IMPROVE;
89 >                        continue;
90 >                }
91 >                else if (vote == "approved" || vote == "approve")
92 >                {
93 >                        getline(fin, text);
94 >                }
95 >                else
96 >                {
97 >                        fin >> count;
98 >                        fin.get();
99 >                }
100 >
101 >                switch (type)
102 >                {
103 >                case FIND:
104 >                        if (vote == "reply")
105 >                        {
106 >                                find.reply = count;
107 >                        }
108 >                        else if (vote == "news")
109 >                        {
110 >                                find.news = count;
111 >                        }
112 >                        else if (vote == "sig")
113 >                        {
114 >                                find.sig = count;
115 >                        }
116 >                        else if (vote == "search")
117 >                        {
118 >                                find.search = count;
119 >                        }
120 >                        else if (vote == "link")
121 >                        {
122 >                                find.link = count;
123 >                        }
124 >                        else if (vote == "browse")
125 >                        {
126 >                                find.browse = count;
127 >                        }
128 >                        else if (vote == "other")
129 >                        {
130 >                                find.other = count;
131 >                        }
132 >                        else if (vote == "approved")
133 >                        {
134 >                                find.approved.push_back(text);
135 >                        }
136 >                        else if (vote == "approve")
137 >                        {
138 >                                find.approve.push_back(text);
139 >                        }
140 >                        break;
141 >                case HELP:
142 >                        if (vote == "solved")
143 >                        {
144 >                                help.solved = count;
145 >                        }
146 >                        else if (vote == "note")
147 >                        {
148 >                                help.note = count;
149 >                        }
150 >                        else if (vote == "link")
151 >                        {
152 >                                help.link = count;
153 >                        }
154 >                        else if (vote == "news")
155 >                        {
156 >                                help.news = count;
157 >                        }
158 >                        else if (vote == "lazy")
159 >                        {
160 >                                help.lazy = count;
161 >                        }
162 >                        break;
163 >                case IMPROVE:
164 >                        if (vote == "nothing")
165 >                        {
166 >                                improve.nothing = count;
167 >                        }
168 >                        else if (vote == "links")
169 >                        {
170 >                                improve.links = count;
171 >                        }
172 >                        else if (vote == "suggest")
173 >                        {
174 >                                improve.suggest = count;
175 >                        }
176 >                        else if (vote == "approved")
177 >                        {
178 >                                improve.approved.push_back(text);
179 >                        }
180 >                        else if (vote == "approve")
181 >                        {
182 >                                improve.approve.push_back(text);
183 >                        }
184 >                        break;
185 >                }
186 >        }
187 >        while (fin.good());
188 >
189 >        fin.close();
190 > }
191 >
192 > void Poller::save()
193 > {
194 >        unsigned index;
195 >        ofstream fout(file.c_str());
196 >
197 >        fout << "_find_\n"
198 >                << "reply=" << find.reply << "\n"
199 >                << "news=" << find.news << "\n"
200 >                << "sig=" << find.sig << "\n"
201 >                << "search=" << find.search << "\n"
202 >                << "link=" << find.link << "\n"
203 >                << "browse=" << find.browse << "\n"
204 >                << "other=" << find.other << "\n";
205 >
206 >        for (index = 0; index < find.approved.size(); index++)
207 >        {
208 >                fout << "approved=" << find.approved[index] << "\n";
209 >        }
210 >
211 >        for (index = 0; index < find.approve.size(); index++)
212 >        {
213 >                fout << "approve=" << find.approve[index] << "\n";
214 >        }
215 >
216 >        fout << "_help_\n"
217 >                << "solved=" << help.solved << "\n"
218 >                << "note=" << help.note << "\n"
219 >                << "link=" << help.link << "\n"
220 >                << "news=" << help.news << "\n"
221 >                << "lazy=" << help.lazy << "\n"
222 >                << "_improve_\n"
223 >                << "nothing=" << improve.nothing << "\n"
224 >                << "links=" << improve.links << "\n"
225 >                << "suggest=" << improve.suggest << "\n";
226 >
227 >        for (index = 0; index < improve.approved.size(); index++)
228 >        {
229 >                fout << "approved=" << improve.approved[index] << "\n";
230 >        }
231 >
232 >        for (index = 0; index < improve.approve.size(); index++)
233 >        {
234 >                fout << "approve=" << improve.approve[index] << "\n";
235 >        }
236 >
237 >        fout.close();
238   }
239  
240 < void Poller::poll(bool nodelete)
240 > void Poller::ballots()
241 > {
242 >        session->select('\"' + account.getMailbox() + '\"');
243 >
244 >        stringstream search;
245 >        search << session->search(string("ALL HEADER X-Mailer \"WinXPFAQPoll 1.0 ")
246 >                + "(Perl)\" SUBJECT \"Windows XP FAQ | Poll Ballot\" UNDELETED FROM \""
247 >                + "Windows XP FAQ | Poll\" HEADER \"X-WinXPFAQPoll-Post-Host\" * HEADE"
248 >                + "R \"X-WinXPFAQPoll-Post-Agent\" *");
249 >
250 >        string junk;
251 >
252 >        getline(search, junk, ' ');
253 >        getline(search, junk, ' ');
254 >
255 >        while (search.good())
256 >        {
257 >                unsigned message;
258 >                search >> message;
259 >                search.get();
260 >
261 >                if (debug) cerr << "message = " << message << "\n";
262 >                messages.push(message);
263 >        }
264 >
265 >        if (!messages.empty())
266 >        {
267 >                unsigned message = messages.front();
268 >                messages.pop();
269 >
270 >                ballot(message);
271 >        }
272 >
273 >        if (!nodelete)
274 >        {
275 >                session->expunge();
276 >        }
277 > }
278 >
279 > void Poller::ballot(unsigned message)
280 > {
281 >        cout << "Checking message: " << message << "..." << flush;
282 >
283 >        char number[32 + 1];
284 >        sprintf(number, "%u", message);
285 >
286 >        stringstream buffer;
287 >
288 >        buffer << session->fetch(string(number) + " BODY.PEEK[2]");
289 >
290 >        if (session->successful())
291 >        {
292 >                bool approved = session->fetch(string(number) + " FLAGS").find("\\Flag"
293 >                        + string("ged")) != string::npos;
294 >
295 >                do
296 >                {
297 >                        enum { FIND, HELP, IMPROVE } type;
298 >                        string vote;
299 >
300 >                        getline(buffer, vote);
301 >                        if (debug) cerr << "vote = " << vote << "\n";
302 >
303 >                        if (vote == "_find_")
304 >                        {
305 >                                type = FIND;
306 >                                continue;
307 >                        }
308 >                        else if (vote == "_help_")
309 >                        {
310 >                                type = HELP;
311 >                                continue;
312 >                        }
313 >                        else if (vote == "_improve_")
314 >                        {
315 >                                type = IMPROVE;
316 >                                continue;
317 >                        }
318 >
319 >                        switch (type)
320 >                        {
321 >                        case FIND:
322 >                                if (vote == "reply")
323 >                                {
324 >                                        find.reply++;
325 >                                }
326 >                                else if (vote == "news")
327 >                                {
328 >                                        find.news++;
329 >                                }
330 >                                else if (vote == "sig")
331 >                                {
332 >                                        find.sig++;
333 >                                }
334 >                                else if (vote == "search")
335 >                                {
336 >                                        find.search++;
337 >                                }
338 >                                else if (vote == "link")
339 >                                {
340 >                                        find.link++;
341 >                                }
342 >                                else if (vote == "browse")
343 >                                {
344 >                                        find.browse++;
345 >                                }
346 >                                else if (vote == "other")
347 >                                {
348 >                                        find.other++;
349 >
350 >                                        //
351 >                                }
352 >                                break;
353 >                        case HELP:
354 >                                if (vote == "solved")
355 >                                {
356 >                                        help.solved++;
357 >                                }
358 >                                else if (vote == "note")
359 >                                {
360 >                                        help.note++;
361 >                                }
362 >                                else if (vote == "link")
363 >                                {
364 >                                        help.link++;
365 >                                }
366 >                                else if (vote == "news")
367 >                                {
368 >                                        help.news++;
369 >                                }
370 >                                else if (vote == "lazy")
371 >                                {
372 >                                        help.lazy++;
373 >                                }
374 >                                break;
375 >                        case IMPROVE:
376 >                                if (vote == "nothing")
377 >                                {
378 >                                        improve.nothing++;
379 >                                }
380 >                                else if (vote == "links")
381 >                                {
382 >                                        improve.links++;
383 >                                }
384 >                                else if (vote == "suggest")
385 >                                {
386 >                                        improve.suggest++;
387 >
388 >                                        //
389 >                                }
390 >                                break;
391 >                        }
392 >                }
393 >                while (buffer.good());
394 >
395 >                cout << "done.\n";
396 >        }
397 >        else
398 >        {
399 >                cout << "cancelled.\n";
400 >        }
401 >
402 >        if (!messages.empty())
403 >        {
404 >                unsigned message = messages.front();
405 >                messages.pop();
406 >
407 >                ballot(message);
408 >        }
409 > }
410 >
411 > void Poller::approvals()
412   {
413          //
414 +
415 +        if (!nodelete)
416 +        {
417 +                session->expunge();
418 +        }
419   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines