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 125 by douglas, 2003-04-02T23:25:29-08:00 vs.
Revision 231 by douglas, 2003-08-05T20:36:00-07:00

# Line 27 | Line 27 | Poller::~Poller()
27          }
28   }
29  
30 < void Poller::poll(bool nodelete, const string& file)
30 > void Poller::poll(bool nodelete, const string& file, bool approve)
31   {
32          this->nodelete = nodelete;
33          this->file = file;
34  
35          load();
36  
37 <        ballots();
38 <        approvals();
37 >        session->select('\"' + account.getMailbox() + '\"');
38 >
39 >        if (!approve)
40 >        {
41 >                ballots();
42 >        }
43 >        else
44 >        {
45 >                approvals();
46 >        }
47  
48          save();
49   }
# Line 108 | Line 116 | void Poller::load()
116                          fin.get();
117                  }
118  
119 <                fin.peek();
119 >                if (fin.peek() == EOF) fin.get();
120  
121                  switch (type)
122                  {
# Line 250 | Line 258 | void Poller::save()
258  
259   void Poller::ballots()
260   {
261 <        session->select('\"' + account.getMailbox() + '\"');
261 >        istringstream search(session->search(string("ALL HEADER X-Mailer \"WinXPFA")
262 >                + "QPoll 1.0 (Perl)\" SUBJECT \"Windows XP FAQ | Poll Ballot\" FROM \"W"
263 >                + "indows XP FAQ | Poll\""));
264  
265 <        stringstream search;
266 <        search << session->search(string("ALL HEADER X-Mailer \"WinXPFAQPoll 1.0 ")
267 <                + "(Perl)\" SUBJECT \"Windows XP FAQ | Poll Ballot\" UNDELETED FROM \""
258 <                + "Windows XP FAQ | Poll\"");
265 >        while (search.good())
266 >        {
267 >                char next = search.peek();
268  
269 <        search.ignore(9);
270 <        search.peek();
269 >                if (isdigit(next)) break;
270 >                
271 >                search.get();
272 >        }
273  
274          while (search.good())
275          {
# Line 269 | Line 280 | void Poller::ballots()
280                  messages.push(message);
281  
282                  search.get();
283 <                search.peek();
283 >
284 >                while (!isdigit(search.peek()) && search.good())
285 >                {
286 >                        search.get();
287 >                }
288          }
289  
290          if (!messages.empty())
# Line 279 | Line 294 | void Poller::ballots()
294  
295                  ballot(message);
296          }
297 +
298 +        if (submits.size() > 0)
299 +        {
300 +                cout << "Sending submits..." << flush;
301 +
302 +                for (unsigned index = 0; index < submits.size(); index++)
303 +                {
304 +                        submit(submits[index].first, submits[index].second);
305 +                }
306 +
307 +                submits.clear();
308 +
309 +                cout << "done.\n";
310 +        }
311   }
312  
313   void Poller::ballot(unsigned message)
# Line 288 | Line 317 | void Poller::ballot(unsigned message)
317          ostringstream number;
318          number << message;
319  
320 <        stringstream buffer;
320 >        string junk;
321 >        istringstream buffer(session->fetch(number.str() + " BODY.PEEK[2]"));
322  
323 <        buffer << session->fetch(number.str() + " BODY.PEEK[2]");
323 >        if (session->successful() && buffer.str() == "* " + number.str() + " FETCH"
324 >                + " (BODY[2] \"\")\n")
325 >        {
326 >                buffer.str(session->fetch(number.str() + " BODY.PEEK[TEXT]"));
327  
328 <        if (session->successful())
328 >                for (unsigned index = 0; index < 25; index++)
329 >                {
330 >                        getline(buffer, junk);
331 >                }
332 >        }
333 >
334 >        if (session->successful() && session->fetch(number.str() + " FLAGS").find(
335 >                "\\Deleted") == string::npos)
336          {
337 <                buffer.ignore(string::npos, '\n');
337 >                getline(buffer, junk);
338  
339                  bool approved = session->fetch(number.str() + " FLAGS").find("\\Flagge"
340                          + string("d")) != string::npos;
# Line 367 | Line 407 | void Poller::ballot(unsigned message)
407                                          {
408                                                  find.approve.push_back(text);
409  
410 <                                                submit("find", text);
410 >                                                submits.push_back(pair<string, string>("find", text));
411                                          }
412                                  }
413                                  break;
# Line 417 | Line 457 | void Poller::ballot(unsigned message)
457                                          {
458                                                  improve.approve.push_back(text);
459  
460 <                                                submit("improve", text);
460 >                                                submits.push_back(pair<string, string>("improve",
461 >                                                        text));
462                                          }
463                                  }
464                                  break;
# Line 484 | Line 525 | void Poller::submit(const string& type,
525  
526   void Poller::approvals()
527   {
528 <        //
528 >        session->check();
529 >
530 >        unsigned index;
531 >
532 >        for (index = find.approve.size(); index > 0; index--)
533 >        {
534 >                cout << "Checking find: " << index << "..." << flush;
535 >
536 >                switch (approval("find", find.approve[index - 1]))
537 >                {
538 >                case true:
539 >                        find.approved.push_back(find.approve[index - 1]);
540 >                case false:
541 >                        find.approve.erase(find.approve.begin() + (index - 1));
542 >                        break;
543 >                default:
544 >                        break;
545 >                }
546 >        }
547 >
548 >        for (index = improve.approve.size(); index > 0; index--)
549 >        {
550 >                cout << "Checking improve: " << index << "..." << flush;
551 >
552 >                switch (approval("improve", improve.approve[index - 1]))
553 >                {
554 >                case true:
555 >                        improve.approved.push_back(improve.approve[index - 1]);
556 >                case false:
557 >                        improve.approve.erase(improve.approve.begin() + (index - 1));
558 >                        break;
559 >                default:
560 >                        break;
561 >                }
562 >        }
563 >
564 >        if (find.disapprove.size() > 0 || improve.disapprove.size() > 0)
565 >        {
566 >                cout << "Sending disapprovals..." << flush;
567 >
568 >                ostringstream message;
569 >
570 >                message << "From: \"Windows XP FAQ | Poll\" <" << account.getEmail()
571 >                        << ">\n"
572 >                        << "To: \"" << account.getName() << "\" <" << account.getEmail()
573 >                        << ">\n"
574 >                        << "Subject: Windows XP FAQ | Poll Disapprovals\n"
575 >                        << "Content-Type: multipart/mixed;\n"
576 >                        << "    boundary=\"----=_NextPart_WinXPFAQPoll_0\"\n"
577 >                        << "Content-Transfer-Encoding: 7bit\n"
578 >                        << "X-Mailer: WinXPFAQPoll 1.0\n\n"
579 >                        << "This is a multi-part message in MIME format.\n\n"
580 >                        << "------=_NextPart_WinXPFAQPoll_0\n"
581 >                        << "Content-Type: text/plain charset=\"us-ascii\"\n"
582 >                        << "Content-Transfer-Encoding: 7bit\n\n"
583 >                        << "Apparently these answers where disapproved:\n\n";
584 >
585 >                unsigned extra = 0;
586 >
587 >                for (index = 0; index < find.disapprove.size(); index++, extra += 4)
588 >                {
589 >                        message << "How did you find this page?\n"
590 >                                << "    I arrived here by entirely different means:\n"
591 >                                << "    " << find.disapprove[index] << "\n\n";
592 >                }
593 >
594 >                for (index = 0; index < improve.disapprove.size(); index++, extra += 4)
595 >                {
596 >                        message << "How could I improve this site?\n"
597 >                                << "    I have my own completely insane suggestion:\n"
598 >                                << "    " << improve.disapprove[index] << "\n\n";
599 >                }
600 >
601 >                message << "Make sure there were no errors.\n\n"
602 >                        << "------=_NextPart_WinXPFAQPoll_0\n"
603 >                        << "Content-Type: text/plain;\n"
604 >                        << "    name=\"disapprove.dat\"\n"
605 >                        << "Content-Transfer-Encoding: 7bit\n"
606 >                        << "Content-Disposition: attachment;\n"
607 >                        << "    filename=\"disapprove.dat\"\n\n";
608 >
609 >                if (find.disapprove.size() > 0)
610 >                {
611 >                        message << "_find_\n";
612 >                        extra++;
613 >                }
614 >
615 >                for (index = 0; index < find.disapprove.size(); index++, extra += 1)
616 >                {
617 >                        message << find.disapprove[index] << "\n";
618 >                }
619 >
620 >                if (improve.disapprove.size() > 0)
621 >                {
622 >                        message << "_improve_\n";
623 >                        extra++;
624 >                }
625 >
626 >                for (index = 0; index < improve.disapprove.size(); index++, extra += 1)
627 >                {
628 >                        message << improve.disapprove[index] << "\n";
629 >                }
630 >
631 >                message << "\n------=_NextPart_WinXPFAQPoll_0--\n";
632 >
633 >                ostringstream length;
634 >                length << (message.str().length() + 26 + extra);
635 >
636 >                session->append('\"' + account.getMailbox() + "\" {" + length.str() +
637 >                        '}', message.str());
638 >                
639 >                session->noop();
640 >
641 >                cout << "done.\n";
642 >        }
643   }
644  
645 < void Poller::approval(unsigned message)
645 > short Poller::approval(const string& type, const string& text)
646   {
647 <        //
647 >        short answer = -1;
648 >
649 >        istringstream search(session->search(string("ALL HEADER X-Mailer \"WinXPF")
650 >                + "AQPoll 1.0\" SUBJECT \"Windows XP FAQ | Poll Submit\" FROM \"Window"
651 >                + "s XP FAQ | Poll\" HEADER X-WinXPFAQPoll-Submit-Type \"" + type
652 >                + "\" HEADER X-WinXPFAQPoll-Submit-Text \"" + text + '\"'));
653 >
654 >        while (search.good())
655 >        {
656 >                char next = search.peek();
657 >
658 >                if (isdigit(next)) break;
659 >                
660 >                search.get();
661 >        }
662 >
663 >        if (search.good())
664 >        {
665 >                unsigned message;
666 >                search >> message;
667 >
668 >                if (debug) cerr << "message = " << message << "\n";
669 >
670 >                ostringstream number;
671 >                number << message;
672 >
673 >                if (session->fetch(number.str() + " FLAGS").find("\\Deleted") !=
674 >                        string::npos)
675 >                {
676 >                        answer = false;
677 >                }
678 >                else if (session->fetch(number.str() + " FLAGS").find("\\Flagged") !=
679 >                        string::npos)
680 >                {
681 >                        answer = true;
682 >
683 >                        session->store(number.str() + " +FLAGS (\\Deleted)");
684 >                }
685 >        }
686 >        else
687 >        {
688 >                answer = false;
689 >        }
690 >
691 >        switch (answer)
692 >        {
693 >        case true:
694 >                cout << "approved.\n";
695 >                break;
696 >        case false:
697 >                if (type == "find")
698 >                {
699 >                        find.disapprove.push_back(text);
700 >                }
701 >                else if (type == "improve")
702 >                {
703 >                        improve.disapprove.push_back(text);
704 >                }
705 >                cout << "disapproved.\n";
706 >                break;
707 >        default:
708 >                cout << "cancelled.\n";
709 >                break;
710 >        }
711 >
712 >        return answer;
713   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines