From 6a0efa6bc8d114775e4bfcaf00ecbba4322d91f3 Mon Sep 17 00:00:00 2001 From: Nick Bebout Date: Sun, 29 Dec 2013 20:03:13 -0600 Subject: [PATCH] 1.580 --- CREDITS | 19 +- ChangeLog | 56 +- FAQ | 125 +- INSTALL | 133 +- Makefile | 28 +- README | 6 +- TODO | 20 +- VERSION | 2 +- VERSION_EXE | 2 +- W/.BUILD_EXE_TIME | 5 + W/Mail-IMAPClient-3.34/Makefile | 874 - W/Mail-IMAPClient-3.34/blib/arch/.exists | 0 .../blib/arch/auto/Mail/IMAPClient/.exists | 0 W/Mail-IMAPClient-3.34/blib/bin/.exists | 0 W/Mail-IMAPClient-3.34/blib/lib/Mail/.exists | 0 .../blib/lib/auto/Mail/IMAPClient/.exists | 0 W/Mail-IMAPClient-3.34/blib/man1/.exists | 0 W/Mail-IMAPClient-3.34/blib/man3/.exists | 0 W/Mail-IMAPClient-3.34/blib/script/.exists | 0 W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient.pm | 3497 ---- .../lib/Mail/IMAPClient.pod | 3938 ---- .../lib/Mail/IMAPClient/BodyStructure.pm | 576 - .../IMAPClient/BodyStructure/Parse.grammar | 189 - .../Mail/IMAPClient/BodyStructure/Parse.pm | 16801 ---------------- .../Mail/IMAPClient/BodyStructure/Parse.pod | 15 - .../lib/Mail/IMAPClient/MessageSet.pm | 280 - .../lib/Mail/IMAPClient/Thread.grammar | 18 - .../lib/Mail/IMAPClient/Thread.pm | 1024 - .../lib/Mail/IMAPClient/Thread.pod | 14 - W/Mail-IMAPClient-3.34/pm_to_blib | 0 W/Mail-IMAPClient-3.35.tar.gz | Bin 0 -> 186010 bytes .../Changes | 15 + .../MANIFEST | 0 .../META.yml | 2 +- .../Makefile.PL | 0 .../README | 0 .../examples/build_dist.pl | 0 .../examples/build_ldif.pl | 0 .../examples/cleanTest.pl | 0 .../examples/copy_folder.pl | 0 .../examples/cyrus_expire.pl | 0 .../examples/cyrus_expunge.pl | 0 .../examples/find_dup_msgs.pl | 0 .../examples/idle.pl | 0 .../examples/imap_to_mbox.pl | 0 .../examples/imtestExample.pl | 0 .../examples/migrate_mail2.pl | 0 .../examples/migrate_mbox.pl | 0 .../examples/populate_mailbox.pl | 0 .../examples/sharedFolder.pl | 0 .../lib/Mail/IMAPClient.pm | 157 +- .../lib/Mail/IMAPClient.pod | 65 +- .../lib/Mail/IMAPClient/BodyStructure.pm | 4 +- .../IMAPClient/BodyStructure/Parse.grammar | 0 .../Mail/IMAPClient/BodyStructure/Parse.pm | 0 .../Mail/IMAPClient/BodyStructure/Parse.pod | 0 .../lib/Mail/IMAPClient/MessageSet.pm | 6 +- .../lib/Mail/IMAPClient/Thread.grammar | 0 .../lib/Mail/IMAPClient/Thread.pm | 0 .../lib/Mail/IMAPClient/Thread.pod | 0 .../prepare_dist | 0 .../t/basic.t | 0 .../t/body_string.t | 0 .../t/bodystructure.t | 0 .../t/fetch_hash.t | 0 .../t/messageset.t | 0 .../t/pod.t | 0 .../t/simple.t | 0 .../t/thread.t | 0 .../test_template.txt | 0 W/learn/copy | 41 + W/learn/hashes_set | 37 + W/memo | 20 +- W/patches/create_folder_erik.torgesta.com | 38 + W/paypal_reply/paypal_build_invoices | 29 +- W/paypal_reply/paypal_send_invoices | 4 +- W/pkgnames | 26 + W/test3.bat | 20 +- examples/install_modules_linux.sh | 14 + guestbook/guestbook_2013_11_05_01_19_28 | 9 + i3 | 4 +- imapsync | 329 +- index.shtml | 38 +- perlcritic_2.out | 1158 +- perlcritic_3.out | 61 +- tests.sh | 199 +- 86 files changed, 1747 insertions(+), 28151 deletions(-) delete mode 100644 W/Mail-IMAPClient-3.34/Makefile delete mode 100644 W/Mail-IMAPClient-3.34/blib/arch/.exists delete mode 100644 W/Mail-IMAPClient-3.34/blib/arch/auto/Mail/IMAPClient/.exists delete mode 100644 W/Mail-IMAPClient-3.34/blib/bin/.exists delete mode 100644 W/Mail-IMAPClient-3.34/blib/lib/Mail/.exists delete mode 100644 W/Mail-IMAPClient-3.34/blib/lib/auto/Mail/IMAPClient/.exists delete mode 100644 W/Mail-IMAPClient-3.34/blib/man1/.exists delete mode 100644 W/Mail-IMAPClient-3.34/blib/man3/.exists delete mode 100644 W/Mail-IMAPClient-3.34/blib/script/.exists delete mode 100644 W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient.pm delete mode 100644 W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient.pod delete mode 100644 W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/BodyStructure.pm delete mode 100644 W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/BodyStructure/Parse.grammar delete mode 100644 W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/BodyStructure/Parse.pm delete mode 100644 W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/BodyStructure/Parse.pod delete mode 100644 W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/MessageSet.pm delete mode 100644 W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/Thread.grammar delete mode 100644 W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/Thread.pm delete mode 100644 W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/Thread.pod delete mode 100644 W/Mail-IMAPClient-3.34/pm_to_blib create mode 100644 W/Mail-IMAPClient-3.35.tar.gz rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/Changes (99%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/MANIFEST (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/META.yml (98%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/Makefile.PL (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/README (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/examples/build_dist.pl (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/examples/build_ldif.pl (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/examples/cleanTest.pl (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/examples/copy_folder.pl (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/examples/cyrus_expire.pl (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/examples/cyrus_expunge.pl (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/examples/find_dup_msgs.pl (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/examples/idle.pl (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/examples/imap_to_mbox.pl (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/examples/imtestExample.pl (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/examples/migrate_mail2.pl (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/examples/migrate_mbox.pl (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/examples/populate_mailbox.pl (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/examples/sharedFolder.pl (100%) rename W/{Mail-IMAPClient-3.34/blib => Mail-IMAPClient-3.35}/lib/Mail/IMAPClient.pm (97%) rename W/{Mail-IMAPClient-3.34/blib => Mail-IMAPClient-3.35}/lib/Mail/IMAPClient.pod (98%) rename W/{Mail-IMAPClient-3.34/blib => Mail-IMAPClient-3.35}/lib/Mail/IMAPClient/BodyStructure.pm (99%) rename W/{Mail-IMAPClient-3.34/blib => Mail-IMAPClient-3.35}/lib/Mail/IMAPClient/BodyStructure/Parse.grammar (100%) rename W/{Mail-IMAPClient-3.34/blib => Mail-IMAPClient-3.35}/lib/Mail/IMAPClient/BodyStructure/Parse.pm (100%) rename W/{Mail-IMAPClient-3.34/blib => Mail-IMAPClient-3.35}/lib/Mail/IMAPClient/BodyStructure/Parse.pod (100%) rename W/{Mail-IMAPClient-3.34/blib => Mail-IMAPClient-3.35}/lib/Mail/IMAPClient/MessageSet.pm (97%) rename W/{Mail-IMAPClient-3.34/blib => Mail-IMAPClient-3.35}/lib/Mail/IMAPClient/Thread.grammar (100%) rename W/{Mail-IMAPClient-3.34/blib => Mail-IMAPClient-3.35}/lib/Mail/IMAPClient/Thread.pm (100%) rename W/{Mail-IMAPClient-3.34/blib => Mail-IMAPClient-3.35}/lib/Mail/IMAPClient/Thread.pod (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/prepare_dist (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/t/basic.t (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/t/body_string.t (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/t/bodystructure.t (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/t/fetch_hash.t (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/t/messageset.t (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/t/pod.t (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/t/simple.t (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/t/thread.t (100%) rename W/{Mail-IMAPClient-3.34 => Mail-IMAPClient-3.35}/test_template.txt (100%) create mode 100755 W/learn/copy create mode 100755 W/learn/hashes_set create mode 100644 W/patches/create_folder_erik.torgesta.com create mode 100644 W/pkgnames create mode 100644 examples/install_modules_linux.sh create mode 100644 guestbook/guestbook_2013_11_05_01_19_28 diff --git a/CREDITS b/CREDITS index b3f4a37..283ea46 100644 --- a/CREDITS +++ b/CREDITS @@ -1,5 +1,5 @@ #!/bin/cat -# $Id: CREDITS,v 1.177 2013/09/28 11:52:08 gilles Exp gilles $ +# $Id: CREDITS,v 1.180 2013/11/15 01:51:58 gilles Exp gilles $ If you want to make a donation to the author, Gilles LAMIRAL, use any of the following ways: @@ -30,6 +30,21 @@ I thank very much all of these people. I thank also very much all people who bought imapsync from the homepage but I don't cite them here. +David Karnowski. +Suggested --disarm_read_receipts for its regex. + +Erik Torsner. +Gave patch for create_folder() and nested folders. +http://erik.torgesta.com/2013/05/gmail-and-google-apps-mail-migration/ + +Ralf Hauber +Gave installation tips for Centos and a bug report about +final statistics for newly created folders. + +Dave Murray +Simon Savva +Found, reported and solved the "Flagged" flag Exchange bug. + Krul, Patrick Found bug about trailing blanc on Win32 cache dir. @@ -37,7 +52,6 @@ Jonathan Daley Contributed by giving the book 13.33 EUR "Cartoon Guide to Statistics" - Bowman Gillianne Contributed by giving the book 8.60 EUR "L'Épreuve de l'étranger: Culture et traduction dans l'Allemagne romantique" @@ -66,7 +80,6 @@ Peter Fuchs Contributed by giving the book 30.86 "Designed for Use: Create Usable Interfaces for Applications and the Web" - Pierre GUILLAUME // e-Lixir Fixed 2 bugs about [Gmail] folder names. one is about $cache_dir and bsd_globs() that needs escaped characters. diff --git a/ChangeLog b/ChangeLog index 305a232..c910d54 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,17 +1,65 @@ RCS file: RCS/imapsync,v Working file: imapsync -head: 1.569 +head: 1.580 branch: locks: strict - gilles: 1.569 + gilles: 1.580 access list: symbolic names: keyword substitution: kv -total revisions: 569; selected revisions: 569 +total revisions: 580; selected revisions: 580 description: ---------------------------- -revision 1.569 locked by: gilles; +revision 1.580 locked by: gilles; +date: 2013/12/25 02:52:36; author: gilles; state: Exp; lines: +51 -27 +Added --skipcrossduplicates to avoid copying messages that are already copied in another folder. +Added --debugcrossduplicates to print which messages (UIDs) are skipped with --skipcrossduplicates (and in what other folders they are). +---------------------------- +revision 1.579 +date: 2013/12/18 13:53:19; author: gilles; state: Exp; lines: +9 -8 +--maxmessagespersecond, value can be float like 3.2 +---------------------------- +revision 1.578 +date: 2013/12/17 02:14:09; author: gilles; state: Exp; lines: +73 -9 +Added --maxbytespersecond to limit byte transfer rate. +Added --maxmessagespersecond to limit messages tranfer rate (office365 throttle limitation). +---------------------------- +revision 1.577 +date: 2013/12/05 05:57:51; author: gilles; state: Exp; lines: +28 -10 +Added tests to play with win32 \\?\C:\TEMP syntax and try to solve long path bug. +---------------------------- +revision 1.576 +date: 2013/11/19 14:37:24; author: gilles; state: Exp; lines: +19 -14 +Added --debugmemory option that prints memory consumption after each message is copied. +---------------------------- +revision 1.575 +date: 2013/11/06 13:55:38; author: gilles; state: Exp; lines: +12 -7 +Do not append message if the fetch failed. +---------------------------- +revision 1.574 +date: 2013/10/28 16:22:04; author: gilles; state: Exp; lines: +16 -8 +Added --create_folder_old in case users want the old behavior of create_folder(). +---------------------------- +revision 1.573 +date: 2013/10/28 14:44:10; author: gilles; state: Exp; lines: +48 -7 +Bugfix. Applied patch for create_folder() and nested folders. Thanks to Erik Torsner. +---------------------------- +revision 1.572 +date: 2013/10/27 02:04:01; author: gilles; state: Exp; lines: +13 -8 +Bug fix. Final statistics were avoided for newly created folders. +---------------------------- +revision 1.571 +date: 2013/10/25 14:34:27; author: gilles; state: Exp; lines: +58 -20 +Added --folderfirst : Sync this folder first. --folderfirst "Work" +Added --folderlast : Sync this folder last. --folderlast "[Gmail]/All Mail" +--folderlast : then this one, etc. +---------------------------- +revision 1.570 +date: 2013/10/25 12:52:02; author: gilles; state: Exp; lines: +7 -7 +--delete2foldersonly Junk example. +---------------------------- +revision 1.569 date: 2013/10/16 21:58:17; author: gilles; state: Exp; lines: +125 -39 Fixed bug on Windows with --tmpdir "E:\TEMP". The colon was badly converted to _, ending with "E_\TEMP". The fix also automatically moves the old cache to the new one if the new does not exist yet. diff --git a/FAQ b/FAQ index 77870bf..74b5b58 100644 --- a/FAQ +++ b/FAQ @@ -1,5 +1,5 @@ #!/bin/cat -# $Id: FAQ,v 1.150 2013/10/17 00:55:53 gilles Exp gilles $ +# $Id: FAQ,v 1.161 2013/12/25 03:25:18 gilles Exp gilles $ +------------------+ | FAQ for imapsync | @@ -116,6 +116,7 @@ events via IMAP. In other words, messages synced by imapsync from Calendar or Contacts folders are not used by email servers to set or get the contacts or calendars. No way via IMAP, no way via imapsync. +See next question. ======================================================================= Q. How can I copy or synchronize Calendars or Contacts? @@ -361,14 +362,25 @@ Fixing the long path problem directly in imapsync is in the TODO file. ======================================================================= Q. How can I try imapsync with latest Mail::IMAPClient 3.xx perl module? -R. The answer R2 deals with any Perl module use. +Three solutions at least. -R1 - Look at the script named i3 in the tarball, it can be used to - run imapsync with included Mail-IMAPClient-3.33/ wherever you +R1 - Look at the script named "i3" in the tarball, it can be used to + run imapsync with the included Mail-IMAPClient-3.35/ wherever you unpacked the imapsync tarball -R2 - Download latest Mail::IMAPClient 3.xx at - http://search.cpan.org/dist/Mail-IMAPClient/ +R2 Run: + + perl -MCPAN -e "install Mail::IMAPClient" + + or + + cpan -i Mail::IMAPClient + +R3 If you want to install the Perl module locally in a directory + + - Download latest Mail::IMAPClient 3.xx at + http://search.cpan.org/dist/Mail-IMAPClient/ + - untar it anywhere: tar xzvf Mail-IMAPClient-3.xx.tar.gz @@ -377,10 +389,10 @@ R2 - Download latest Mail::IMAPClient 3.xx at - run imapsync with perl and -I option tailing to use the perl module Mail-IMAPClient-3.xx. Example: - perl -I./Mail-IMAPClient-3.33/lib ./imapsync ... + perl -I./Mail-IMAPClient-3.35/lib ./imapsync ... or if imapsync is in directory /path/ - perl -I./Mail-IMAPClient-3.33/lib /path/imapsync ... + perl -I./Mail-IMAPClient-3.35/lib /path/imapsync ... ======================================================================= @@ -388,6 +400,14 @@ Q. How can I use imapsync with Mail::IMAPClient 2.2.9 perl module? R. Mail::IMAPClient 2.2.9 is no longer supported. +======================================================================= +Q. I get "Out of memory" errors. How to fix that? + +R. Usually "Out of memory" errors are related to old days, +to old Mail::IMAPClient module releases, before 3.26. +Look at imapsync output first lines to get the Mail::IMAPClient release used. +Then upgrade Mail::IMAPClient Perl module. + ======================================================================= Q. Can I use imapsync to migrate emails from pop3 server to imap server? @@ -401,6 +421,13 @@ the same mailboxes. They serve the same INBOX (imap serves INBOX and several other folders, pop3 serves only INBOX) So have a try with imapsync on the same host1. +======================================================================= +Q. Folders are not created on host2. What happens? + +R. Do you use IMAP or POP3 with your client software? +It looks like you use POP3 instead of IMAP, POP3 has only INBOX. + + ======================================================================= Q. I am interested in creating a local clone of the IMAP on a LAN server for faster synchronisations, email will always be delivered @@ -586,6 +613,19 @@ Choose X as you wish: _ or SEP or any string (including the empty string). +======================================================================= +Q. Is it possible to sync also the UIDL of the POP3 server? + +R. imapsync does not POP3 but I think you mean UID in IMAP. + See next question. + +======================================================================= +Q. Is it possible to sync also the UIDs of the IMAP server? + +UIDs in IMAP are chosen and created by the servers, not by the clients, +imapsync is a client. So UIDs can not be synced by any method, +unless the server is duplicated as is. + ======================================================================= Q. The option --subscribe does not seem to work @@ -1515,6 +1555,44 @@ format issues. And now it works fine. (Thanks to Hansjoerg.Maurer) ======================================================================= +======================================================================= +Q. From XXX to Exchange 2013 or Office365 read receipts are all resent + again after a sync. Even for old messages. How can I fix that? + +R. imapsync can remove the header containing this read receipt request. + +On Unix, add: + + --regexmess 's{\A(.*?(?! ^$))(^Disposition-Notification-To:.*?\n)}{$1}gxms' + +On Windows, add: + + --regexmess "s{\A(.*?(?! ^$))(^Disposition-Notification-To:.*?\n)}{$1}gxms" + +Since those read receipts should be sent for unseen messages going +to a seen state after the migration, you could be strict and apply +the regex only to seen messages. +Selecting seen message can be done with: + + imapsync ... --search1 "SEEN" --regexmess "..." + +Of course a second run has to be run without the --regexmess for +unseen messages: + + imapsync ... --search1 "SEEN" + +If you want to keep the header content and still suppress read receipts +then use the following instead, it adds a prefix "X-" to "Disposition-Notification-To:" + + --regexmess 's{\A(.*?(?! ^$))^Disposition-Notification-To:(.*?)$}{$1X-Disposition-Notification-To:$2}igxms' + +The small regex remove the header Disposition-Notification-To, the long one +replace it so users can still see messages had a Disposition-Notification-To +header before. + +I will add an option to set this regex. +Thanks to David Karnowski for pointing and solving this issue. + ======================================================================= Q. From XXX to Exchange 2013 or Office365 I get this error message sometimes: "BAD Command Argument Error 11" @@ -1539,6 +1617,33 @@ R. This error message comes from Exchange IMAP server when it imapsync ... --maxlinelength 1000 +Have also in mind that Exchange closes the connection after 10 errors +encountered so you might also see "BYE Connection closed" errors from +Exchange, which means Exchange leaves the session and say goodbye, +come back later. Rerun a sync then. + +======================================================================= +Q. From XXX to Exchange 2010 or 2013 or Office365 the flag Flagged does + not seem to be well synced. + +R. Use the following trick. Run imapsync twice, one with --regexflag + and one without, like this: + +1) imapsync ... --regexflag "s/\\Flagged//g" +2) imapsync ... + +You can add --debugflags if you want to see what imapsync gets and +does in details with flags. + +The magic of this trick is on ignoring the \Flagged flag on the first +sync and setting it on the second sync, with STORE instead of APPEND. +This Exchange bug seems that Exchange gets and sets well the Flagged +flag with APPEND in IMAP but then it forgets it with other protocols; +With STORE it sets and gets the "\Flagged" flag everywhere. + +Thanks to Dave Murray and Simon Savva for reporting and solving +this issue. + ======================================================================= Q. From Zimbra to XXX @@ -1625,7 +1730,9 @@ See http://support.google.com/a/bin/answer.py?hl=en&answer=1071518 --regextrans2 "s/[ ]+/_/g" is there to convert blank characters not accepted by gmail to character _ underscore. In fact only leading -and trailing blank characters are problems with gmail. +and trailing blank characters are problems with gmail, and +also succesive blank ending whith the IMAP error +"NO [CANNOT] Folder contains excess whitespace (Failure)" --regextrans2 "s/[\^]/_/g" is mandatory. It converts, since not accepted by gmail, character ^ to character _ underscore. diff --git a/INSTALL b/INSTALL index bfd589b..c8883c9 100644 --- a/INSTALL +++ b/INSTALL @@ -1,7 +1,7 @@ -# $Id: INSTALL,v 1.31 2013/09/28 11:11:48 gilles Exp gilles $ +# $Id: INSTALL,v 1.33 2013/12/25 03:25:18 gilles Exp gilles $ # # INSTALL file for imapsync -# imapsync : IMAP sync or copy tool. +# imapsync : IMAP sync and migrate tool. INTRODUCTION ------------ @@ -31,16 +31,22 @@ a) Simplest way: - Buy imapsync.exe at http://imapsync.lamiral.info/ -- Run imapsync.exe in a command prompt (execute cmd.exe). +- Run imapsync.exe in a command prompt (execute cmd.exe) + but I suggest the next process, I use it myself. -- Or simpler, look at the batch file at - http://imapsync.lamiral.info/examples/imapsync_example.bat - and replace the parameters with your values - then run the batch file with a double-click. - It is simpler to edit a batch file with notepad than - the command line in dos mode. +- Since it is simpler to edit a batch file with notepad than + the command line in DOS mode: -b) Hard way: + a) Look at the batch file at + http://imapsync.lamiral.info/examples/imapsync_example.bat + b) Take it and put this batch file in the same directory as imapsync.exe + c) Edit this batch file with notepad and replace the parameters + with your own values + d) Run the batch file with a double-click. + + +b) Hard way. It is the hard way because it installs all software + dependencies. The way for changing imapsync if needed. - Get imapsync-x.xx.tgz - Install Perl if it isn't already installed. @@ -69,21 +75,28 @@ You need : Get Perl here: http://www.perl.org/ -- Some perl modules. To verify you have - all modules in one command, just run: +- Some perl modules. To verify in one command that you have + all needed modules, just run: perl -c imapsync The good answer is "imapsync syntax OK". + Any other output will list the missing modules in the + Perl paths (it then talks about @INC variable). Here is some individual module help: -- Perl Mail::IMAPClient module +- To check if your system has Perl Mail::IMAPClient module try : perl -mMail::IMAPClient -e '' - - Get the latest Mail::IMAPClient module here: + + It should print nothing, nothing printed means Mail::IMAPClient + is already installed on your system. + + If the module Mail::IMAPClient is not on the system, + you can use a copy included in the imapsync tarball + or get the latest Mail::IMAPClient module here: http://search.cpan.org/dist/Mail-IMAPClient/ I use always the latest Mail-IMAPClient-3.xx @@ -92,18 +105,15 @@ Here is some individual module help: perl -mMail::IMAPClient -e 'print $Mail::IMAPClient::VERSION, "\n"' New Mail-IMAPClient-3.xx works very well with imapsync, - Use at least Mail-IMAPClient-3.25 (previous may bug). - Don't hesitate to use latest Mail-IMAPClient-3.xx - (3.xx >= 3.34 at the time of this writing) + Use at least Mail-IMAPClient-3.25 (previous releases may bug). + Do not hesitate to use latest Mail-IMAPClient-3.xx + (3.xx >= 3.35 at the time of this writing) - Look at the script named "i3" in the tarball, it can be used to - run imapsync with included Mail-IMAPClient-3.34/ wherever you + Look at the shell script named "i3" in the tarball, it can be used to + run imapsync with included Mail-IMAPClient-3.35/ wherever you unpacked the imapsync tarball. - -- Perl Digest::MD5 module. - try: - +- Digest::MD5 perl -mDigest::MD5 -e "" http://search.cpan.org/ @@ -118,66 +128,87 @@ Here is some individual module help: - IO::Socket::SSL perl -mIO::Socket::SSL -e "" -- File::Spec - perl -mFile::Spec -e "" - -- File::Path - perl -mFile::Path -e "" - -- Perl Digest::HMAC_MD5 module +- Digest::HMAC_MD5 Good for non plain text password over network. perl -mDigest::HMAC_MD5 -e "" -- Perl Authen::NTLM +- Authen::NTLM perl -mAuthen::NTLM -e "" -- Perl Time::HiRes +- Time::HiRes perl -mTime::HiRes -e "" -- Perl Data::Uniqid +- Data::Uniqid perl -mData::Uniqid -e "" -- Perl URI::Escape +- URI::Escape perl -mURI::Escape -e "" +- File::Copy::Recursive + perl -mFile::Copy::Recursive -e "" Test everything in one command: perl -mMail::IMAPClient -mDigest::MD5 -mTerm::ReadKey -mIO::Socket::SSL \ - -mFile::Spec -mDigest::HMAC_MD5 -mAuthen::NTLM -e -mTime::HiRes \ + -mDigest::HMAC_MD5 -mAuthen::NTLM -e -mTime::HiRes \ -mData::Uniqid -mURI::Escape "" You can install easily those Perl modules in latest release via the following commands (with root permissions) perl -MCPAN -e "install Mail::IMAPClient" - perl -MCPAN -e "install Digest::MD5" perl -MCPAN -e "install Term::ReadKey" perl -MCPAN -e "install IO::Socket::SSL" - perl -MCPAN -e "install File::Spec" perl -MCPAN -e "install Digest::HMAC_MD5" - perl -MCPAN -e "install Authen::NTLM" - perl -MCPAN -e "install Time::HiRes" - perl -MCPAN -e "install Data::Uniqid" perl -MCPAN -e "install URI::Escape" + perl -MCPAN -e "install File::Copy::Recursive" + + perl -MCPAN -e "install Data::Uniqid" + perl -MCPAN -e "install Authen::NTLM" -You can install them easily too by using the standard install +You can also install them easily too by using the standard install command on your system if the packages have been made on it (so you may not have the latest but most of the time it doesn't care). -Modules Authen::NTLM, Data::Uniqid may be not available -this way since I haven't find them on Ubuntu. +Modules + Authen::NTLM + Data::Uniqid +may be not available this distribution way since I haven't find them +on Ubuntu nor on Mandriva. -Example on Debian/Ubuntu: +On Debian/Ubuntu: - aptitude install libmail-imapclient-perl # Mail::IMAPClient - aptitude install libdigest-md5-file-perl # Digest::MD5 - aptitude install libterm-readkey-perl # Term::ReadKey - aptitude install libio-socket-ssl-perl # IO::Socket::SSL - aptitude install libfile-spec-perl # File::Spec - aptitude install libdigest-hmac-perl # Digest::HMAC_MD5 Digest::HMAC_SHA1 + aptitude install libmail-imapclient-perl # Mail::IMAPClient + aptitude install libterm-readkey-perl # Term::ReadKey + aptitude install libio-socket-ssl-perl # IO::Socket::SSL + aptitude install libdigest-hmac-perl # Digest::HMAC_MD5 Digest::HMAC_SHA1 + aptitude install liburi-perl # URI::Escape + aptitude install libfile-copy-recursive-perl # File::Copy::Recursive + +On Mandriva: + + urpmi perl-Mail-IMAPClient # Mail::IMAPClient + urpmi perl-Term-ReadKey # Term::ReadKey + urpmi perl-IO-Socket-SSL # IO::Socket::SSL + urpmi perl-Digest-HMAC # Digest::HMAC_MD5 Digest::HMAC_SHA1 + urpmi perl-URI # URI::Escape + urpmi perl-File-Copy-Recursive # File::Copy::Recursive + +On CentOS (thanks to Ralf Hauber) + + Install RPM Repository: Fedora Epel + + See http://pkgs.org/centos-6-rhel-6/epel-i386/perl-Data-Uniqid-0.12-2.el6.noarch.rpm.html + wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm + rpm -Uvh epel-release*rpm + + yum install perl-Mail-IMAPClient + yum install "perl(Term::ReadKey)" + yum install "perl(Authen::NTLM)" + yum install perl-Data-Uniqid + yum install perl-File-Copy-Recursive INSTALLING on Unix diff --git a/Makefile b/Makefile index 9a3c96d..2740d1d 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ -# $Id: Makefile,v 1.132 2013/10/17 00:55:16 gilles Exp gilles $ +# $Id: Makefile,v 1.139 2013/12/25 11:36:53 gilles Exp gilles $ .PHONY: help usage all @@ -33,7 +33,7 @@ VERSION=$(shell perl -I$(IMAPClient) ./imapsync --version) VERSION_EXE=$(shell cat ./VERSION_EXE) HELLO=$(shell date;uname -a) -IMAPClient_3xx=./W/Mail-IMAPClient-3.34/lib +IMAPClient_3xx=./W/Mail-IMAPClient-3.35/lib IMAPClient=$(IMAPClient_3xx) hello: @@ -126,7 +126,7 @@ test_quick_3xx: imapsync tests.sh testv3: imapsync tests.sh CMD_PERL='perl -I./$(IMAPClient_3xx)' /usr/bin/time sh tests.sh - touch .test_3xx + ./i3 --version >> .test_3xx testv: testv3 @@ -136,7 +136,7 @@ tests: test .test_3xx: imapsync tests.sh CMD_PERL='perl -I./$(IMAPClient_3xx)' /usr/bin/time sh tests.sh 1>/dev/null - touch .test_3xx + ./i3 --version >> .test_3xx testf: clean_test test @@ -167,8 +167,6 @@ tests_win32_dev3: dosify_bat scp imapsync W/test3.bat Admin@c:'C:/msys/1.0/home/Admin/imapsync/' ssh Admin@c 'C:/msys/1.0/home/Admin/imapsync/test3.bat' - - test_imapsync_exe: dosify_bat scp W/test_exe.bat Admin@c:'C:/msys/1.0/home/Admin/imapsync/' time ssh Admin@c 'C:/msys/1.0/home/Admin/imapsync/test_exe.bat' @@ -259,8 +257,8 @@ tarball: .tarball touch .tarball -DO_IT := $(shell test -f ./dist/path_$(VERSION).txt || makepasswd --chars 4 > ./dist/path_$(VERSION).txt) -DIST_SECRET := $(shell cat ./dist/path_$(VERSION).txt) +DO_IT := $(shell test -d dist && { test -f ./dist/path_$(VERSION).txt || makepasswd --chars 4 > ./dist/path_$(VERSION).txt ; } ) +DIST_SECRET := $(shell test -d dist && cat ./dist/path_$(VERSION).txt) DIST_PATH := ./dist/$(DIST_SECRET) lalala: @@ -295,11 +293,11 @@ dist_prepa_exe: imapsync.exe ks: rsync -avHz --delete --exclude imapsync.exe \ - . imapsync@ks.lamiral.info:public_html/imapsync/ + . gilles@ks.lamiral.info:public_html/imapsync/ ksa: rsync -avHz --delete -P \ - . imapsync@ks.lamiral.info:public_html/imapsync/ + . gilles@ks.lamiral.info:public_html/imapsync/ upload_ks: ci tarball rsync -lptvHzP $(PUBLIC_FILES) \ @@ -345,10 +343,14 @@ upload_lfo: /home/gilles/public_html/www.linux-france.org/html/prj/imapsync/.htaccess sh ~/memo/lfo-rsync -upload_index: FAQ LICENSE CREDITS TUTORIAL.html GOOD_PRACTICES.html W/*.bat examples/*.bat examples/sync_loop_unix.sh index.shtml - rcsdiff index.shtml FAQ LICENSE CREDITS W/*.bat examples/*.bat index.shtml + +.valid.index.shtml: index.shtml validate --verbose index.shtml + touch .valid.index.shtml + +upload_index: .valid.index.shtml FAQ LICENSE CREDITS TUTORIAL.html GOOD_PRACTICES.html W/*.bat examples/*.bat examples/*.sh + rcsdiff index.shtml FAQ LICENSE CREDITS W/*.bat examples/*.bat index.shtml rsync -avH index.shtml FAQ NOLIMIT LICENSE CREDITS TUTORIAL.html GOOD_PRACTICES.html root@ks.lamiral.info:/var/www/imapsync/ rsync -avH W/*.bat root@ks.lamiral.info:/var/www/imapsync/W/ - rsync -avH examples/*.bat examples/sync_loop_unix.sh root@ks.lamiral.info:/var/www/imapsync/examples/ + rsync -avH examples/*.bat examples/*.sh root@ks.lamiral.info:/var/www/imapsync/examples/ diff --git a/README b/README index c7a06c7..60ba875 100644 --- a/README +++ b/README @@ -4,7 +4,7 @@ NAME More than 52 different IMAP server softwares supported with success, few failures. - $Revision: 1.569 $ + $Revision: 1.580 $ SYNOPSIS To synchronize imap account "foo" on "imap.truc.org" to imap account @@ -353,7 +353,7 @@ IMAP SERVERS - Gimap (Gmail imap) - GMX IMAP4 StreamProxy. - Groupwise IMAP (Novell) 6.x and 7.0. Buggy so see the FAQ. - - hMailServer 5.3.3 [host2], 4.4.1 [host1] (see FAQ) + - hMailServer 5.40-B1950 [host12], 5.3.3 [host2], 4.4.1 [host1] (see FAQ) - IceWarp Server 10.4.5 [host1] (http://www.icewarp.com/) - iPlanet Messaging server 4.15, 5.1, 5.2 - IMail 7.15 (Ipswitch/Win2003), 8.12, 11.03 [host1] @@ -471,5 +471,5 @@ SIMILAR SOFTWARES Feedback (good or bad) will often be welcome. - $Id: imapsync,v 1.569 2013/10/16 21:58:17 gilles Exp gilles $ + $Id: imapsync,v 1.580 2013/12/25 02:52:36 gilles Exp gilles $ diff --git a/TODO b/TODO index 9475bd2..7b138e9 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,5 @@ #!/bin/cat -# $Id: TODO,v 1.123 2013/08/16 00:49:52 gilles Exp gilles $ +# $Id: TODO,v 1.124 2013/12/25 03:04:53 gilles Exp gilles $ TODO file for imapsync ---------------------- @@ -17,15 +17,17 @@ http://www.yippiemove.com/ http://www.migrationwiz.com/ http://www.microsoft.com/download/en/details.aspx?id=1329 "Microsoft Transporter Suite" +Write --disarm_read_receipts that does: + --regexmess 's{\A(.*?(?! ^$))^Disposition-Notification-To:(.*?)$}{$1X-Disposition-Notification-To:$2}igxms' +May be apply it only to UNSEEN messages. + +Write --max_messages_per_second and --max_bytes_per_second for staying under Microsoft's throttling policies. + + Convert folder names to utf-8 and print them next to the uft-7 ones. Look at imapsync/W/learn/ ./imap_utf7 data_utf7 -DONE. Inform about --addheader when the problem occurs "(no wanted headers so we ignore this message)" - -DONE. Print the timeout value. -DONE. Inform --timeout is is seconds. - Add an exit value when exiting because of --exitwhenover The goal is to know easily why to restart later. @@ -165,6 +167,12 @@ http://asg.web.cmu.edu/cyrus/download/imapd/altnamespace.html =========================================================================== + +DONE. Inform about --addheader when the problem occurs "(no wanted headers so we ignore this message)" + +DONE. Print the timeout value. +DONE. Inform --timeout is is seconds. + DONE. Add an entry to http://lsm.qqx.org/lsm/ See lsm.imapsync diff --git a/VERSION b/VERSION index d01ef83..ef68d40 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.569 +1.580 diff --git a/VERSION_EXE b/VERSION_EXE index d01ef83..ef68d40 100644 --- a/VERSION_EXE +++ b/VERSION_EXE @@ -1 +1 @@ -1.569 +1.580 diff --git a/W/.BUILD_EXE_TIME b/W/.BUILD_EXE_TIME index 22d4e3a..ec754ed 100644 --- a/W/.BUILD_EXE_TIME +++ b/W/.BUILD_EXE_TIME @@ -258,3 +258,8 @@ 1381970545 END 1.569 : jeudi 17 octobre 2013, 02:42:25 (UTC+0200) 1381974866 BEGIN 1.569 : jeudi 17 octobre 2013, 03:54:26 (UTC+0200) 1381975685 END 1.569 : jeudi 17 octobre 2013, 04:08:05 (UTC+0200) +1383010060 BEGIN 1.574 : mardi 29 octobre 2013, 02:27:40 (UTC+0100) +1383012576 END 1.574 : mardi 29 octobre 2013, 03:09:36 (UTC+0100) +1387941690 BEGIN 1.580 : mercredi 25 décembre 2013, 04:21:30 (UTC+0100) +1387967067 BEGIN 1.580 : mercredi 25 décembre 2013, 11:24:28 (UTC+0100) +1387967901 END 1.580 : mercredi 25 décembre 2013, 11:38:21 (UTC+0100) diff --git a/W/Mail-IMAPClient-3.34/Makefile b/W/Mail-IMAPClient-3.34/Makefile deleted file mode 100644 index 7a7f626..0000000 --- a/W/Mail-IMAPClient-3.34/Makefile +++ /dev/null @@ -1,874 +0,0 @@ -# This Makefile is for the Mail::IMAPClient extension to perl. -# -# It was generated automatically by MakeMaker version -# 6.55_02 (Revision: 65502) from the contents of -# Makefile.PL. Don't edit this file, edit Makefile.PL instead. -# -# ANY CHANGES MADE HERE WILL BE LOST! -# -# MakeMaker ARGV: () -# - -# MakeMaker Parameters: - -# ABSTRACT => q[IMAP4 client library] -# AUTHOR => q[Phil Pearl (Lobbes) ] -# BUILD_REQUIRES => { } -# LICENSE => q[perl] -# META_MERGE => { resources=>{ repository=>{ web=>q[http://sourceforge.net/p/mail-imapclient/git/], url=>q[git://git.code.sf.net/p/mail-imapclient/git], type=>q[git] }, homepage=>q[http://sourceforge.net/projects/mail-imapclient/], bugtracker=>{ web=>q[http://rt.cpan.org/Public/Dist/Display.html?Name=Mail-IMAPClient], mailto=>q[bug-Mail-IMAPClient@rt.cpan.org] } } } -# MIN_PERL_VERSION => q[5.008] -# NAME => q[Mail::IMAPClient] -# PREREQ_PM => { IO::File=>q[0], Fcntl=>q[0], IO::Socket::INET=>q[1.26], Carp=>q[0], Parse::RecDescent=>q[1.94], List::Util=>q[0], Test::More=>q[0], MIME::Base64=>q[0], IO::Socket=>q[0], IO::Select=>q[0], File::Temp=>q[0], Errno=>q[0] } -# VERSION_FROM => q[lib/Mail/IMAPClient.pm] -# clean => { FILES=>q[test.txt] } - -# --- MakeMaker post_initialize section: - - -# --- MakeMaker const_config section: - -# These definitions are from config.sh (via /usr/lib/perl/5.10/Config.pm). -# They may have been overridden via Makefile.PL or on the command line. -AR = ar -CC = cc -CCCDLFLAGS = -fPIC -CCDLFLAGS = -Wl,-E -DLEXT = so -DLSRC = dl_dlopen.xs -EXE_EXT = -FULL_AR = /usr/bin/ar -LD = cc -LDDLFLAGS = -shared -O2 -g -L/usr/local/lib -fstack-protector -LDFLAGS = -fstack-protector -L/usr/local/lib -LIBC = /lib/libc-2.11.1.so -LIB_EXT = .a -OBJ_EXT = .o -OSNAME = linux -OSVERS = 2.6.42-37-generic -RANLIB = : -SITELIBEXP = /usr/local/share/perl/5.10.1 -SITEARCHEXP = /usr/local/lib/perl/5.10.1 -SO = so -VENDORARCHEXP = /usr/lib/perl5 -VENDORLIBEXP = /usr/share/perl5 - - -# --- MakeMaker constants section: -AR_STATIC_ARGS = cr -DIRFILESEP = / -DFSEP = $(DIRFILESEP) -NAME = Mail::IMAPClient -NAME_SYM = Mail_IMAPClient -VERSION = 3.34 -VERSION_MACRO = VERSION -VERSION_SYM = 3_34 -DEFINE_VERSION = -D$(VERSION_MACRO)=\"$(VERSION)\" -XS_VERSION = 3.34 -XS_VERSION_MACRO = XS_VERSION -XS_DEFINE_VERSION = -D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\" -INST_ARCHLIB = blib/arch -INST_SCRIPT = blib/script -INST_BIN = blib/bin -INST_LIB = blib/lib -INST_MAN1DIR = blib/man1 -INST_MAN3DIR = blib/man3 -MAN1EXT = 1p -MAN3EXT = 3pm -INSTALLDIRS = site -DESTDIR = -PREFIX = /usr -PERLPREFIX = $(PREFIX) -SITEPREFIX = $(PREFIX)/local -VENDORPREFIX = $(PREFIX) -INSTALLPRIVLIB = $(PERLPREFIX)/share/perl/5.10 -DESTINSTALLPRIVLIB = $(DESTDIR)$(INSTALLPRIVLIB) -INSTALLSITELIB = $(SITEPREFIX)/share/perl/5.10.1 -DESTINSTALLSITELIB = $(DESTDIR)$(INSTALLSITELIB) -INSTALLVENDORLIB = $(VENDORPREFIX)/share/perl5 -DESTINSTALLVENDORLIB = $(DESTDIR)$(INSTALLVENDORLIB) -INSTALLARCHLIB = $(PERLPREFIX)/lib/perl/5.10 -DESTINSTALLARCHLIB = $(DESTDIR)$(INSTALLARCHLIB) -INSTALLSITEARCH = $(SITEPREFIX)/lib/perl/5.10.1 -DESTINSTALLSITEARCH = $(DESTDIR)$(INSTALLSITEARCH) -INSTALLVENDORARCH = $(VENDORPREFIX)/lib/perl5 -DESTINSTALLVENDORARCH = $(DESTDIR)$(INSTALLVENDORARCH) -INSTALLBIN = $(PERLPREFIX)/bin -DESTINSTALLBIN = $(DESTDIR)$(INSTALLBIN) -INSTALLSITEBIN = $(SITEPREFIX)/bin -DESTINSTALLSITEBIN = $(DESTDIR)$(INSTALLSITEBIN) -INSTALLVENDORBIN = $(VENDORPREFIX)/bin -DESTINSTALLVENDORBIN = $(DESTDIR)$(INSTALLVENDORBIN) -INSTALLSCRIPT = $(PERLPREFIX)/bin -DESTINSTALLSCRIPT = $(DESTDIR)$(INSTALLSCRIPT) -INSTALLSITESCRIPT = $(SITEPREFIX)/bin -DESTINSTALLSITESCRIPT = $(DESTDIR)$(INSTALLSITESCRIPT) -INSTALLVENDORSCRIPT = $(VENDORPREFIX)/bin -DESTINSTALLVENDORSCRIPT = $(DESTDIR)$(INSTALLVENDORSCRIPT) -INSTALLMAN1DIR = $(PERLPREFIX)/share/man/man1 -DESTINSTALLMAN1DIR = $(DESTDIR)$(INSTALLMAN1DIR) -INSTALLSITEMAN1DIR = $(SITEPREFIX)/man/man1 -DESTINSTALLSITEMAN1DIR = $(DESTDIR)$(INSTALLSITEMAN1DIR) -INSTALLVENDORMAN1DIR = $(VENDORPREFIX)/share/man/man1 -DESTINSTALLVENDORMAN1DIR = $(DESTDIR)$(INSTALLVENDORMAN1DIR) -INSTALLMAN3DIR = $(PERLPREFIX)/share/man/man3 -DESTINSTALLMAN3DIR = $(DESTDIR)$(INSTALLMAN3DIR) -INSTALLSITEMAN3DIR = $(SITEPREFIX)/man/man3 -DESTINSTALLSITEMAN3DIR = $(DESTDIR)$(INSTALLSITEMAN3DIR) -INSTALLVENDORMAN3DIR = $(VENDORPREFIX)/share/man/man3 -DESTINSTALLVENDORMAN3DIR = $(DESTDIR)$(INSTALLVENDORMAN3DIR) -PERL_LIB = /usr/share/perl/5.10 -PERL_ARCHLIB = /usr/lib/perl/5.10 -LIBPERL_A = libperl.a -FIRST_MAKEFILE = Makefile -MAKEFILE_OLD = Makefile.old -MAKE_APERL_FILE = Makefile.aperl -PERLMAINCC = $(CC) -PERL_INC = /usr/lib/perl/5.10/CORE -PERL = /usr/bin/perl -FULLPERL = /usr/bin/perl -ABSPERL = $(PERL) -PERLRUN = $(PERL) -FULLPERLRUN = $(FULLPERL) -ABSPERLRUN = $(ABSPERL) -PERLRUNINST = $(PERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" -FULLPERLRUNINST = $(FULLPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" -ABSPERLRUNINST = $(ABSPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" -PERL_CORE = 0 -PERM_DIR = 755 -PERM_RW = 644 -PERM_RWX = 755 - -MAKEMAKER = /usr/share/perl/5.10/ExtUtils/MakeMaker.pm -MM_VERSION = 6.55_02 -MM_REVISION = 65502 - -# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle). -# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle) -# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar) -# DLBASE = Basename part of dynamic library. May be just equal BASEEXT. -MAKE = make -FULLEXT = Mail/IMAPClient -BASEEXT = IMAPClient -PARENT_NAME = Mail -DLBASE = $(BASEEXT) -VERSION_FROM = lib/Mail/IMAPClient.pm -OBJECT = -LDFROM = $(OBJECT) -LINKTYPE = dynamic -BOOTDEP = - -# Handy lists of source code files: -XS_FILES = -C_FILES = -O_FILES = -H_FILES = -MAN1PODS = -MAN3PODS = lib/Mail/IMAPClient.pod \ - lib/Mail/IMAPClient/BodyStructure.pm \ - lib/Mail/IMAPClient/BodyStructure/Parse.pod \ - lib/Mail/IMAPClient/MessageSet.pm \ - lib/Mail/IMAPClient/Thread.pod - -# Where is the Config information that we are using/depend on -CONFIGDEP = $(PERL_ARCHLIB)$(DFSEP)Config.pm $(PERL_INC)$(DFSEP)config.h - -# Where to build things -INST_LIBDIR = $(INST_LIB)/Mail -INST_ARCHLIBDIR = $(INST_ARCHLIB)/Mail - -INST_AUTODIR = $(INST_LIB)/auto/$(FULLEXT) -INST_ARCHAUTODIR = $(INST_ARCHLIB)/auto/$(FULLEXT) - -INST_STATIC = -INST_DYNAMIC = -INST_BOOT = - -# Extra linker info -EXPORT_LIST = -PERL_ARCHIVE = -PERL_ARCHIVE_AFTER = - - -TO_INST_PM = lib/Mail/IMAPClient.pm \ - lib/Mail/IMAPClient.pod \ - lib/Mail/IMAPClient/BodyStructure.pm \ - lib/Mail/IMAPClient/BodyStructure/Parse.grammar \ - lib/Mail/IMAPClient/BodyStructure/Parse.pm \ - lib/Mail/IMAPClient/BodyStructure/Parse.pod \ - lib/Mail/IMAPClient/MessageSet.pm \ - lib/Mail/IMAPClient/Thread.grammar \ - lib/Mail/IMAPClient/Thread.pm \ - lib/Mail/IMAPClient/Thread.pod - -PM_TO_BLIB = lib/Mail/IMAPClient/BodyStructure/Parse.pm \ - blib/lib/Mail/IMAPClient/BodyStructure/Parse.pm \ - lib/Mail/IMAPClient/Thread.pm \ - blib/lib/Mail/IMAPClient/Thread.pm \ - lib/Mail/IMAPClient/BodyStructure/Parse.grammar \ - blib/lib/Mail/IMAPClient/BodyStructure/Parse.grammar \ - lib/Mail/IMAPClient.pod \ - blib/lib/Mail/IMAPClient.pod \ - lib/Mail/IMAPClient/Thread.pod \ - blib/lib/Mail/IMAPClient/Thread.pod \ - lib/Mail/IMAPClient/MessageSet.pm \ - blib/lib/Mail/IMAPClient/MessageSet.pm \ - lib/Mail/IMAPClient/Thread.grammar \ - blib/lib/Mail/IMAPClient/Thread.grammar \ - lib/Mail/IMAPClient/BodyStructure.pm \ - blib/lib/Mail/IMAPClient/BodyStructure.pm \ - lib/Mail/IMAPClient/BodyStructure/Parse.pod \ - blib/lib/Mail/IMAPClient/BodyStructure/Parse.pod \ - lib/Mail/IMAPClient.pm \ - blib/lib/Mail/IMAPClient.pm - - -# --- MakeMaker platform_constants section: -MM_Unix_VERSION = 6.55_02 -PERL_MALLOC_DEF = -DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc -Dfree=Perl_mfree -Drealloc=Perl_realloc -Dcalloc=Perl_calloc - - -# --- MakeMaker tool_autosplit section: -# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto -AUTOSPLITFILE = $(ABSPERLRUN) -e 'use AutoSplit; autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)' -- - - - -# --- MakeMaker tool_xsubpp section: - - -# --- MakeMaker tools_other section: -SHELL = /bin/sh -CHMOD = chmod -CP = cp -MV = mv -NOOP = $(TRUE) -NOECHO = @ -RM_F = rm -f -RM_RF = rm -rf -TEST_F = test -f -TOUCH = touch -UMASK_NULL = umask 0 -DEV_NULL = > /dev/null 2>&1 -MKPATH = $(ABSPERLRUN) -MExtUtils::Command -e 'mkpath' -- -EQUALIZE_TIMESTAMP = $(ABSPERLRUN) -MExtUtils::Command -e 'eqtime' -- -FALSE = false -TRUE = true -ECHO = echo -ECHO_N = echo -n -UNINST = 0 -VERBINST = 0 -MOD_INSTALL = $(ABSPERLRUN) -MExtUtils::Install -e 'install([ from_to => {@ARGV}, verbose => '\''$(VERBINST)'\'', uninstall_shadows => '\''$(UNINST)'\'', dir_mode => '\''$(PERM_DIR)'\'' ]);' -- -DOC_INSTALL = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'perllocal_install' -- -UNINSTALL = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'uninstall' -- -WARN_IF_OLD_PACKLIST = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'warn_if_old_packlist' -- -MACROSTART = -MACROEND = -USEMAKEFILE = -f -FIXIN = $(ABSPERLRUN) -MExtUtils::MY -e 'MY->fixin(shift)' -- - - -# --- MakeMaker makemakerdflt section: -makemakerdflt : all - $(NOECHO) $(NOOP) - - -# --- MakeMaker dist section: -TAR = tar -TARFLAGS = cvf -ZIP = zip -ZIPFLAGS = -r -COMPRESS = gzip --best -SUFFIX = .gz -SHAR = shar -PREOP = $(NOECHO) $(NOOP) -POSTOP = $(NOECHO) $(NOOP) -TO_UNIX = $(NOECHO) $(NOOP) -CI = ci -u -RCS_LABEL = rcs -Nv$(VERSION_SYM): -q -DIST_CP = best -DIST_DEFAULT = tardist -DISTNAME = Mail-IMAPClient -DISTVNAME = Mail-IMAPClient-3.34 - - -# --- MakeMaker macro section: - - -# --- MakeMaker depend section: - - -# --- MakeMaker cflags section: - - -# --- MakeMaker const_loadlibs section: - - -# --- MakeMaker const_cccmd section: - - -# --- MakeMaker post_constants section: - - -# --- MakeMaker pasthru section: - -PASTHRU = LIBPERL_A="$(LIBPERL_A)"\ - LINKTYPE="$(LINKTYPE)"\ - PREFIX="$(PREFIX)" - - -# --- MakeMaker special_targets section: -.SUFFIXES : .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT) - -.PHONY: all config static dynamic test linkext manifest blibdirs clean realclean disttest distdir - - - -# --- MakeMaker c_o section: - - -# --- MakeMaker xs_c section: - - -# --- MakeMaker xs_o section: - - -# --- MakeMaker top_targets section: -all :: pure_all manifypods - $(NOECHO) $(NOOP) - - -pure_all :: config pm_to_blib subdirs linkext - $(NOECHO) $(NOOP) - -subdirs :: $(MYEXTLIB) - $(NOECHO) $(NOOP) - -config :: $(FIRST_MAKEFILE) blibdirs - $(NOECHO) $(NOOP) - -help : - perldoc ExtUtils::MakeMaker - - -# --- MakeMaker blibdirs section: -blibdirs : $(INST_LIBDIR)$(DFSEP).exists $(INST_ARCHLIB)$(DFSEP).exists $(INST_AUTODIR)$(DFSEP).exists $(INST_ARCHAUTODIR)$(DFSEP).exists $(INST_BIN)$(DFSEP).exists $(INST_SCRIPT)$(DFSEP).exists $(INST_MAN1DIR)$(DFSEP).exists $(INST_MAN3DIR)$(DFSEP).exists - $(NOECHO) $(NOOP) - -# Backwards compat with 6.18 through 6.25 -blibdirs.ts : blibdirs - $(NOECHO) $(NOOP) - -$(INST_LIBDIR)$(DFSEP).exists :: Makefile.PL - $(NOECHO) $(MKPATH) $(INST_LIBDIR) - $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_LIBDIR) - $(NOECHO) $(TOUCH) $(INST_LIBDIR)$(DFSEP).exists - -$(INST_ARCHLIB)$(DFSEP).exists :: Makefile.PL - $(NOECHO) $(MKPATH) $(INST_ARCHLIB) - $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_ARCHLIB) - $(NOECHO) $(TOUCH) $(INST_ARCHLIB)$(DFSEP).exists - -$(INST_AUTODIR)$(DFSEP).exists :: Makefile.PL - $(NOECHO) $(MKPATH) $(INST_AUTODIR) - $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_AUTODIR) - $(NOECHO) $(TOUCH) $(INST_AUTODIR)$(DFSEP).exists - -$(INST_ARCHAUTODIR)$(DFSEP).exists :: Makefile.PL - $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR) - $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_ARCHAUTODIR) - $(NOECHO) $(TOUCH) $(INST_ARCHAUTODIR)$(DFSEP).exists - -$(INST_BIN)$(DFSEP).exists :: Makefile.PL - $(NOECHO) $(MKPATH) $(INST_BIN) - $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_BIN) - $(NOECHO) $(TOUCH) $(INST_BIN)$(DFSEP).exists - -$(INST_SCRIPT)$(DFSEP).exists :: Makefile.PL - $(NOECHO) $(MKPATH) $(INST_SCRIPT) - $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_SCRIPT) - $(NOECHO) $(TOUCH) $(INST_SCRIPT)$(DFSEP).exists - -$(INST_MAN1DIR)$(DFSEP).exists :: Makefile.PL - $(NOECHO) $(MKPATH) $(INST_MAN1DIR) - $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_MAN1DIR) - $(NOECHO) $(TOUCH) $(INST_MAN1DIR)$(DFSEP).exists - -$(INST_MAN3DIR)$(DFSEP).exists :: Makefile.PL - $(NOECHO) $(MKPATH) $(INST_MAN3DIR) - $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_MAN3DIR) - $(NOECHO) $(TOUCH) $(INST_MAN3DIR)$(DFSEP).exists - - - -# --- MakeMaker linkext section: - -linkext :: $(LINKTYPE) - $(NOECHO) $(NOOP) - - -# --- MakeMaker dlsyms section: - - -# --- MakeMaker dynamic section: - -dynamic :: $(FIRST_MAKEFILE) $(INST_DYNAMIC) $(INST_BOOT) - $(NOECHO) $(NOOP) - - -# --- MakeMaker dynamic_bs section: - -BOOTSTRAP = - - -# --- MakeMaker dynamic_lib section: - - -# --- MakeMaker static section: - -## $(INST_PM) has been moved to the all: target. -## It remains here for awhile to allow for old usage: "make static" -static :: $(FIRST_MAKEFILE) $(INST_STATIC) - $(NOECHO) $(NOOP) - - -# --- MakeMaker static_lib section: - - -# --- MakeMaker manifypods section: - -POD2MAN_EXE = $(PERLRUN) "-MExtUtils::Command::MM" -e pod2man "--" -POD2MAN = $(POD2MAN_EXE) - - -manifypods : pure_all \ - lib/Mail/IMAPClient/Thread.pod \ - lib/Mail/IMAPClient/MessageSet.pm \ - lib/Mail/IMAPClient/BodyStructure.pm \ - lib/Mail/IMAPClient/BodyStructure/Parse.pod \ - lib/Mail/IMAPClient.pod - $(NOECHO) $(POD2MAN) --section=$(MAN3EXT) --perm_rw=$(PERM_RW) \ - lib/Mail/IMAPClient/Thread.pod $(INST_MAN3DIR)/Mail::IMAPClient::Thread.$(MAN3EXT) \ - lib/Mail/IMAPClient/MessageSet.pm $(INST_MAN3DIR)/Mail::IMAPClient::MessageSet.$(MAN3EXT) \ - lib/Mail/IMAPClient/BodyStructure.pm $(INST_MAN3DIR)/Mail::IMAPClient::BodyStructure.$(MAN3EXT) \ - lib/Mail/IMAPClient/BodyStructure/Parse.pod $(INST_MAN3DIR)/Mail::IMAPClient::BodyStructure::Parse.$(MAN3EXT) \ - lib/Mail/IMAPClient.pod $(INST_MAN3DIR)/Mail::IMAPClient.$(MAN3EXT) - - - - -# --- MakeMaker processPL section: - - -# --- MakeMaker installbin section: - - -# --- MakeMaker subdirs section: - -# none - -# --- MakeMaker clean_subdirs section: -clean_subdirs : - $(NOECHO) $(NOOP) - - -# --- MakeMaker clean section: - -# Delete temporary files but do not touch installed files. We don't delete -# the Makefile here so a later make realclean still has a makefile to use. - -clean :: clean_subdirs - - $(RM_F) \ - *$(LIB_EXT) core \ - core.[0-9] $(INST_ARCHAUTODIR)/extralibs.all \ - core.[0-9][0-9] $(BASEEXT).bso \ - pm_to_blib.ts core.[0-9][0-9][0-9][0-9] \ - $(BASEEXT).x $(BOOTSTRAP) \ - perl$(EXE_EXT) tmon.out \ - *$(OBJ_EXT) pm_to_blib \ - $(INST_ARCHAUTODIR)/extralibs.ld blibdirs.ts \ - core.[0-9][0-9][0-9][0-9][0-9] *perl.core \ - core.*perl.*.? $(MAKE_APERL_FILE) \ - perl $(BASEEXT).def \ - core.[0-9][0-9][0-9] mon.out \ - lib$(BASEEXT).def perlmain.c \ - perl.exe so_locations \ - $(BASEEXT).exp - - $(RM_RF) \ - test.txt blib - - $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL) - - -# --- MakeMaker realclean_subdirs section: -realclean_subdirs : - $(NOECHO) $(NOOP) - - -# --- MakeMaker realclean section: -# Delete temporary files (via clean) and also delete dist files -realclean purge :: clean realclean_subdirs - - $(RM_F) \ - $(MAKEFILE_OLD) $(FIRST_MAKEFILE) - - $(RM_RF) \ - $(DISTVNAME) - - -# --- MakeMaker metafile section: -metafile : create_distdir - $(NOECHO) $(ECHO) Generating META.yml - $(NOECHO) $(ECHO) '--- #YAML:1.0' > META_new.yml - $(NOECHO) $(ECHO) 'name: Mail-IMAPClient' >> META_new.yml - $(NOECHO) $(ECHO) 'version: 3.34' >> META_new.yml - $(NOECHO) $(ECHO) 'abstract: IMAP4 client library' >> META_new.yml - $(NOECHO) $(ECHO) 'author:' >> META_new.yml - $(NOECHO) $(ECHO) ' - Phil Pearl (Lobbes) ' >> META_new.yml - $(NOECHO) $(ECHO) 'license: perl' >> META_new.yml - $(NOECHO) $(ECHO) 'distribution_type: module' >> META_new.yml - $(NOECHO) $(ECHO) 'configure_requires:' >> META_new.yml - $(NOECHO) $(ECHO) ' ExtUtils::MakeMaker: 0' >> META_new.yml - $(NOECHO) $(ECHO) 'build_requires:' >> META_new.yml - $(NOECHO) $(ECHO) ' ExtUtils::MakeMaker: 0' >> META_new.yml - $(NOECHO) $(ECHO) 'requires:' >> META_new.yml - $(NOECHO) $(ECHO) ' Carp: 0' >> META_new.yml - $(NOECHO) $(ECHO) ' Errno: 0' >> META_new.yml - $(NOECHO) $(ECHO) ' Fcntl: 0' >> META_new.yml - $(NOECHO) $(ECHO) ' File::Temp: 0' >> META_new.yml - $(NOECHO) $(ECHO) ' IO::File: 0' >> META_new.yml - $(NOECHO) $(ECHO) ' IO::Select: 0' >> META_new.yml - $(NOECHO) $(ECHO) ' IO::Socket: 0' >> META_new.yml - $(NOECHO) $(ECHO) ' IO::Socket::INET: 1.26' >> META_new.yml - $(NOECHO) $(ECHO) ' List::Util: 0' >> META_new.yml - $(NOECHO) $(ECHO) ' MIME::Base64: 0' >> META_new.yml - $(NOECHO) $(ECHO) ' Parse::RecDescent: 1.94' >> META_new.yml - $(NOECHO) $(ECHO) ' perl: 5.008' >> META_new.yml - $(NOECHO) $(ECHO) ' Test::More: 0' >> META_new.yml - $(NOECHO) $(ECHO) 'resources:' >> META_new.yml - $(NOECHO) $(ECHO) ' bugtracker:' >> META_new.yml - $(NOECHO) $(ECHO) ' mailto: bug-Mail-IMAPClient@rt.cpan.org' >> META_new.yml - $(NOECHO) $(ECHO) ' web: http://rt.cpan.org/Public/Dist/Display.html?Name=Mail-IMAPClient' >> META_new.yml - $(NOECHO) $(ECHO) ' homepage: http://sourceforge.net/projects/mail-imapclient/' >> META_new.yml - $(NOECHO) $(ECHO) ' repository:' >> META_new.yml - $(NOECHO) $(ECHO) ' type: git' >> META_new.yml - $(NOECHO) $(ECHO) ' url: git://git.code.sf.net/p/mail-imapclient/git' >> META_new.yml - $(NOECHO) $(ECHO) ' web: http://sourceforge.net/p/mail-imapclient/git/' >> META_new.yml - $(NOECHO) $(ECHO) 'no_index:' >> META_new.yml - $(NOECHO) $(ECHO) ' directory:' >> META_new.yml - $(NOECHO) $(ECHO) ' - t' >> META_new.yml - $(NOECHO) $(ECHO) ' - inc' >> META_new.yml - $(NOECHO) $(ECHO) 'generated_by: ExtUtils::MakeMaker version 6.55_02' >> META_new.yml - $(NOECHO) $(ECHO) 'meta-spec:' >> META_new.yml - $(NOECHO) $(ECHO) ' url: http://module-build.sourceforge.net/META-spec-v1.4.html' >> META_new.yml - $(NOECHO) $(ECHO) ' version: 1.4' >> META_new.yml - -$(NOECHO) $(MV) META_new.yml $(DISTVNAME)/META.yml - - -# --- MakeMaker signature section: -signature : - cpansign -s - - -# --- MakeMaker dist_basics section: -distclean :: realclean distcheck - $(NOECHO) $(NOOP) - -distcheck : - $(PERLRUN) "-MExtUtils::Manifest=fullcheck" -e fullcheck - -skipcheck : - $(PERLRUN) "-MExtUtils::Manifest=skipcheck" -e skipcheck - -manifest : - $(PERLRUN) "-MExtUtils::Manifest=mkmanifest" -e mkmanifest - -veryclean : realclean - $(RM_F) *~ */*~ *.orig */*.orig *.bak */*.bak *.old */*.old - - - -# --- MakeMaker dist_core section: - -dist : $(DIST_DEFAULT) $(FIRST_MAKEFILE) - $(NOECHO) $(ABSPERLRUN) -l -e 'print '\''Warning: Makefile possibly out of date with $(VERSION_FROM)'\''' \ - -e ' if -e '\''$(VERSION_FROM)'\'' and -M '\''$(VERSION_FROM)'\'' < -M '\''$(FIRST_MAKEFILE)'\'';' -- - -tardist : $(DISTVNAME).tar$(SUFFIX) - $(NOECHO) $(NOOP) - -uutardist : $(DISTVNAME).tar$(SUFFIX) - uuencode $(DISTVNAME).tar$(SUFFIX) $(DISTVNAME).tar$(SUFFIX) > $(DISTVNAME).tar$(SUFFIX)_uu - -$(DISTVNAME).tar$(SUFFIX) : distdir - $(PREOP) - $(TO_UNIX) - $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME) - $(RM_RF) $(DISTVNAME) - $(COMPRESS) $(DISTVNAME).tar - $(POSTOP) - -zipdist : $(DISTVNAME).zip - $(NOECHO) $(NOOP) - -$(DISTVNAME).zip : distdir - $(PREOP) - $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME) - $(RM_RF) $(DISTVNAME) - $(POSTOP) - -shdist : distdir - $(PREOP) - $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar - $(RM_RF) $(DISTVNAME) - $(POSTOP) - - -# --- MakeMaker distdir section: -create_distdir : - $(RM_RF) $(DISTVNAME) - $(PERLRUN) "-MExtUtils::Manifest=manicopy,maniread" \ - -e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');" - -distdir : create_distdir distmeta - $(NOECHO) $(NOOP) - - - -# --- MakeMaker dist_test section: -disttest : distdir - cd $(DISTVNAME) && $(ABSPERLRUN) Makefile.PL - cd $(DISTVNAME) && $(MAKE) $(PASTHRU) - cd $(DISTVNAME) && $(MAKE) test $(PASTHRU) - - - -# --- MakeMaker dist_ci section: - -ci : - $(PERLRUN) "-MExtUtils::Manifest=maniread" \ - -e "@all = keys %{ maniread() };" \ - -e "print(qq{Executing $(CI) @all\n}); system(qq{$(CI) @all});" \ - -e "print(qq{Executing $(RCS_LABEL) ...\n}); system(qq{$(RCS_LABEL) @all});" - - -# --- MakeMaker distmeta section: -distmeta : create_distdir metafile - $(NOECHO) cd $(DISTVNAME) && $(ABSPERLRUN) -MExtUtils::Manifest=maniadd -e 'eval { maniadd({q{META.yml} => q{Module meta-data (added by MakeMaker)}}) } ' \ - -e ' or print "Could not add META.yml to MANIFEST: $${'\''@'\''}\n"' -- - - - -# --- MakeMaker distsignature section: -distsignature : create_distdir - $(NOECHO) cd $(DISTVNAME) && $(ABSPERLRUN) -MExtUtils::Manifest=maniadd -e 'eval { maniadd({q{SIGNATURE} => q{Public-key signature (added by MakeMaker)}}) } ' \ - -e ' or print "Could not add SIGNATURE to MANIFEST: $${'\''@'\''}\n"' -- - $(NOECHO) cd $(DISTVNAME) && $(TOUCH) SIGNATURE - cd $(DISTVNAME) && cpansign -s - - - -# --- MakeMaker install section: - -install :: pure_install doc_install - $(NOECHO) $(NOOP) - -install_perl :: pure_perl_install doc_perl_install - $(NOECHO) $(NOOP) - -install_site :: pure_site_install doc_site_install - $(NOECHO) $(NOOP) - -install_vendor :: pure_vendor_install doc_vendor_install - $(NOECHO) $(NOOP) - -pure_install :: pure_$(INSTALLDIRS)_install - $(NOECHO) $(NOOP) - -doc_install :: doc_$(INSTALLDIRS)_install - $(NOECHO) $(NOOP) - -pure__install : pure_site_install - $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site - -doc__install : doc_site_install - $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site - -pure_perl_install :: all - $(NOECHO) umask 022; $(MOD_INSTALL) \ - $(INST_LIB) $(DESTINSTALLPRIVLIB) \ - $(INST_ARCHLIB) $(DESTINSTALLARCHLIB) \ - $(INST_BIN) $(DESTINSTALLBIN) \ - $(INST_SCRIPT) $(DESTINSTALLSCRIPT) \ - $(INST_MAN1DIR) $(DESTINSTALLMAN1DIR) \ - $(INST_MAN3DIR) $(DESTINSTALLMAN3DIR) - $(NOECHO) $(WARN_IF_OLD_PACKLIST) \ - $(SITEARCHEXP)/auto/$(FULLEXT) - - -pure_site_install :: all - $(NOECHO) umask 02; $(MOD_INSTALL) \ - read $(SITEARCHEXP)/auto/$(FULLEXT)/.packlist \ - write $(DESTINSTALLSITEARCH)/auto/$(FULLEXT)/.packlist \ - $(INST_LIB) $(DESTINSTALLSITELIB) \ - $(INST_ARCHLIB) $(DESTINSTALLSITEARCH) \ - $(INST_BIN) $(DESTINSTALLSITEBIN) \ - $(INST_SCRIPT) $(DESTINSTALLSITESCRIPT) \ - $(INST_MAN1DIR) $(DESTINSTALLSITEMAN1DIR) \ - $(INST_MAN3DIR) $(DESTINSTALLSITEMAN3DIR) - $(NOECHO) $(WARN_IF_OLD_PACKLIST) \ - $(PERL_ARCHLIB)/auto/$(FULLEXT) - -pure_vendor_install :: all - $(NOECHO) umask 022; $(MOD_INSTALL) \ - $(INST_LIB) $(DESTINSTALLVENDORLIB) \ - $(INST_ARCHLIB) $(DESTINSTALLVENDORARCH) \ - $(INST_BIN) $(DESTINSTALLVENDORBIN) \ - $(INST_SCRIPT) $(DESTINSTALLVENDORSCRIPT) \ - $(INST_MAN1DIR) $(DESTINSTALLVENDORMAN1DIR) \ - $(INST_MAN3DIR) $(DESTINSTALLVENDORMAN3DIR) - -doc_perl_install :: all - -doc_site_install :: all - $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLSITEARCH)/perllocal.pod - -$(NOECHO) umask 02; $(MKPATH) $(DESTINSTALLSITEARCH) - -$(NOECHO) umask 02; $(DOC_INSTALL) \ - "Module" "$(NAME)" \ - "installed into" "$(INSTALLSITELIB)" \ - LINKTYPE "$(LINKTYPE)" \ - VERSION "$(VERSION)" \ - EXE_FILES "$(EXE_FILES)" \ - >> $(DESTINSTALLSITEARCH)/perllocal.pod - -doc_vendor_install :: all - - -uninstall :: uninstall_from_$(INSTALLDIRS)dirs - $(NOECHO) $(NOOP) - -uninstall_from_perldirs :: - -uninstall_from_sitedirs :: - $(NOECHO) $(UNINSTALL) $(SITEARCHEXP)/auto/$(FULLEXT)/.packlist - -uninstall_from_vendordirs :: - - - -# --- MakeMaker force section: -# Phony target to force checking subdirectories. -FORCE : - $(NOECHO) $(NOOP) - - -# --- MakeMaker perldepend section: - - -# --- MakeMaker makefile section: -# We take a very conservative approach here, but it's worth it. -# We move Makefile to Makefile.old here to avoid gnu make looping. -$(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP) - $(NOECHO) $(ECHO) "Makefile out-of-date with respect to $?" - $(NOECHO) $(ECHO) "Cleaning current config before rebuilding Makefile..." - -$(NOECHO) $(RM_F) $(MAKEFILE_OLD) - -$(NOECHO) $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) - - $(MAKE) $(USEMAKEFILE) $(MAKEFILE_OLD) clean $(DEV_NULL) - $(PERLRUN) Makefile.PL - $(NOECHO) $(ECHO) "==> Your Makefile has been rebuilt. <==" - $(NOECHO) $(ECHO) "==> Please rerun the $(MAKE) command. <==" - $(FALSE) - - - -# --- MakeMaker staticmake section: - -# --- MakeMaker makeaperl section --- -MAP_TARGET = perl -FULLPERL = /usr/bin/perl - -$(MAP_TARGET) :: static $(MAKE_APERL_FILE) - $(MAKE) $(USEMAKEFILE) $(MAKE_APERL_FILE) $@ - -$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE) pm_to_blib - $(NOECHO) $(ECHO) Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET) - $(NOECHO) $(PERLRUNINST) \ - Makefile.PL DIR= \ - MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \ - MAKEAPERL=1 NORECURS=1 CCCDLFLAGS= - - -# --- MakeMaker test section: - -TEST_VERBOSE=0 -TEST_TYPE=test_$(LINKTYPE) -TEST_FILE = test.pl -TEST_FILES = t/*.t -TESTDB_SW = -d - -testdb :: testdb_$(LINKTYPE) - -test :: $(TEST_TYPE) subdirs-test - -subdirs-test :: - $(NOECHO) $(NOOP) - - -test_dynamic :: pure_all - PERL_DL_NONLAZY=1 $(FULLPERLRUN) "-MExtUtils::Command::MM" "-e" "test_harness($(TEST_VERBOSE), '$(INST_LIB)', '$(INST_ARCHLIB)')" $(TEST_FILES) - -testdb_dynamic :: pure_all - PERL_DL_NONLAZY=1 $(FULLPERLRUN) $(TESTDB_SW) "-I$(INST_LIB)" "-I$(INST_ARCHLIB)" $(TEST_FILE) - -test_ : test_dynamic - -test_static :: test_dynamic -testdb_static :: testdb_dynamic - - -# --- MakeMaker ppd section: -# Creates a PPD (Perl Package Description) for a binary distribution. -ppd : - $(NOECHO) $(ECHO) '' > $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' IMAP4 client library' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' Phil Pearl (Lobbes) <phil@zimbra.com>' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) '' >> $(DISTNAME).ppd - - -# --- MakeMaker pm_to_blib section: - -pm_to_blib : $(FIRST_MAKEFILE) $(TO_INST_PM) - $(NOECHO) $(ABSPERLRUN) -MExtUtils::Install -e 'pm_to_blib({@ARGV}, '\''$(INST_LIB)/auto'\'', q[$(PM_FILTER)], '\''$(PERM_DIR)'\'')' -- \ - lib/Mail/IMAPClient/BodyStructure/Parse.pm blib/lib/Mail/IMAPClient/BodyStructure/Parse.pm \ - lib/Mail/IMAPClient/Thread.pm blib/lib/Mail/IMAPClient/Thread.pm \ - lib/Mail/IMAPClient/BodyStructure/Parse.grammar blib/lib/Mail/IMAPClient/BodyStructure/Parse.grammar \ - lib/Mail/IMAPClient.pod blib/lib/Mail/IMAPClient.pod \ - lib/Mail/IMAPClient/Thread.pod blib/lib/Mail/IMAPClient/Thread.pod \ - lib/Mail/IMAPClient/MessageSet.pm blib/lib/Mail/IMAPClient/MessageSet.pm \ - lib/Mail/IMAPClient/Thread.grammar blib/lib/Mail/IMAPClient/Thread.grammar \ - lib/Mail/IMAPClient/BodyStructure.pm blib/lib/Mail/IMAPClient/BodyStructure.pm \ - lib/Mail/IMAPClient/BodyStructure/Parse.pod blib/lib/Mail/IMAPClient/BodyStructure/Parse.pod \ - lib/Mail/IMAPClient.pm blib/lib/Mail/IMAPClient.pm - $(NOECHO) $(TOUCH) pm_to_blib - - -# --- MakeMaker selfdocument section: - - -# --- MakeMaker postamble section: - - -# End. diff --git a/W/Mail-IMAPClient-3.34/blib/arch/.exists b/W/Mail-IMAPClient-3.34/blib/arch/.exists deleted file mode 100644 index e69de29..0000000 diff --git a/W/Mail-IMAPClient-3.34/blib/arch/auto/Mail/IMAPClient/.exists b/W/Mail-IMAPClient-3.34/blib/arch/auto/Mail/IMAPClient/.exists deleted file mode 100644 index e69de29..0000000 diff --git a/W/Mail-IMAPClient-3.34/blib/bin/.exists b/W/Mail-IMAPClient-3.34/blib/bin/.exists deleted file mode 100644 index e69de29..0000000 diff --git a/W/Mail-IMAPClient-3.34/blib/lib/Mail/.exists b/W/Mail-IMAPClient-3.34/blib/lib/Mail/.exists deleted file mode 100644 index e69de29..0000000 diff --git a/W/Mail-IMAPClient-3.34/blib/lib/auto/Mail/IMAPClient/.exists b/W/Mail-IMAPClient-3.34/blib/lib/auto/Mail/IMAPClient/.exists deleted file mode 100644 index e69de29..0000000 diff --git a/W/Mail-IMAPClient-3.34/blib/man1/.exists b/W/Mail-IMAPClient-3.34/blib/man1/.exists deleted file mode 100644 index e69de29..0000000 diff --git a/W/Mail-IMAPClient-3.34/blib/man3/.exists b/W/Mail-IMAPClient-3.34/blib/man3/.exists deleted file mode 100644 index e69de29..0000000 diff --git a/W/Mail-IMAPClient-3.34/blib/script/.exists b/W/Mail-IMAPClient-3.34/blib/script/.exists deleted file mode 100644 index e69de29..0000000 diff --git a/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient.pm b/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient.pm deleted file mode 100644 index 7a568b0..0000000 --- a/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient.pm +++ /dev/null @@ -1,3497 +0,0 @@ - -# _{name} methods are undocumented and meant to be private. - -require 5.008_001; - -use strict; -use warnings; - -package Mail::IMAPClient; -our $VERSION = '3.34'; - -use Mail::IMAPClient::MessageSet; - -use IO::Socket qw(:crlf SOL_SOCKET SO_KEEPALIVE); -use IO::Select (); -use Carp qw(carp); #local $SIG{__WARN__} = \&Carp::cluck; #DEBUG - -use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK); -use Errno qw(EAGAIN EBADF ECONNRESET EPIPE); -use List::Util qw(first min max sum); -use MIME::Base64 qw(encode_base64 decode_base64); -use File::Spec (); - -use constant APPEND_BUFFER_SIZE => 1024 * 1024; - -use constant { - Unconnected => 0, - Connected => 1, # connected; not logged in - Authenticated => 2, # logged in; no mailbox selected - Selected => 3, # mailbox selected -}; - -use constant { - INDEX => 0, # Array index for output line number - TYPE => 1, # Array index for line type (OUTPUT, INPUT, or LITERAL) - DATA => 2, # Array index for output line data -}; - -use constant NonFolderArg => 1; # for Massage indicating non-folder arguments - -my %SEARCH_KEYS = map { ( $_ => 1 ) } qw( - ALL ANSWERED BCC BEFORE BODY CC DELETED DRAFT FLAGGED - FROM HEADER KEYWORD LARGER NEW NOT OLD ON OR RECENT - SEEN SENTBEFORE SENTON SENTSINCE SINCE SMALLER SUBJECT - TEXT TO UID UNANSWERED UNDELETED UNDRAFT UNFLAGGED - UNKEYWORD UNSEEN); - -# modules require(d) during runtime when applicable -my %Load_Module = ( - "Compress-Zlib" => "Compress::Zlib", - "INET" => "IO::Socket::INET", - "SSL" => "IO::Socket::SSL", - "UNIX" => "IO::Socket::UNIX", - "BodyStructure" => "Mail::IMAPClient::BodyStructure", - "Envelope" => "Mail::IMAPClient::BodyStructure::Envelope", - "Thread" => "Mail::IMAPClient::Thread", -); - -sub _load_module { - my $self = shift; - my $modkey = shift; - my $module = $Load_Module{$modkey} || $modkey; - - my $err = do { - local ($@); - eval "require $module"; - $@; - }; - if ($err) { - $self->LastError("Unable to load '$module': $err"); - return undef; - } - return $module; -} - -sub _debug { - my $self = shift; - return unless $self->Debug; - - my $text = join '', @_; - $text =~ s/$CRLF/\n /og; - $text =~ s/\s*$/\n/; - - #use POSIX (); $text = POSIX::strftime("%F %T ", localtime).$text; #DEBUG - my $fh = $self->{Debug_fh} || \*STDERR; - print $fh $text; -} - -BEGIN { - - # set-up accessors - foreach my $datum ( - qw(Authcallback Authmechanism Authuser Buffer Count Compress - Debug Debug_fh Domain Folder Ignoresizeerrors Keepalive - Maxappendstringlength Maxcommandlength Maxtemperrors - Password Peek Port Prewritemethod Proxy Ranges Readmethod - Readmoremethod Reconnectretry Server Showcredentials - Socketargs Ssl Starttls Supportedflags Timeout Uid User) - ) - { - no strict 'refs'; - *$datum = sub { - @_ > 1 ? ( $_[0]->{$datum} = $_[1] ) : $_[0]->{$datum}; - }; - } -} - -sub LastError { - my $self = shift; - @_ or return $self->{LastError}; - my $err = shift; - - # allow LastError to be reset with undef - if ( defined $err ) { - $err =~ s/$CRLF$//og; - local ($!); # old versions of Carp could reset $! - $self->_debug( Carp::longmess("ERROR: $err") ); - - # hopefully this is rare... - if ( $err eq "NO not connected" ) { - my $lerr = $self->{LastError} || ""; - my $emsg = "Trying command when NOT connected!"; - $emsg .= " LastError was: $lerr" if $lerr; - Carp::cluck($emsg); - } - } - - # 2.x API support requires setting $@ - $@ = $self->{LastError} = $err; -} - -sub Fast_io(;$) { - my ( $self, $use ) = @_; - defined $use - or return $self->{Fast_io}; - - my $socket = $self->{Socket} - or return undef; - - local ( $@, $! ); # avoid stomping on globals - unless ($use) { - eval { fcntl( $socket, F_SETFL, delete $self->{_fcntl} ) } - if exists $self->{_fcntl}; - $self->{Fast_io} = 0; - return undef; - } - - my $fcntl = eval { fcntl( $socket, F_GETFL, 0 ) }; - if ($@) { - $self->{Fast_io} = 0; - $self->_debug("not using Fast_IO; not available on this platform") - unless $self->{_fastio_warning_}++; - return undef; - } - - $self->{Fast_io} = 1; - my $newflags = $self->{_fcntl} = $fcntl; - $newflags |= O_NONBLOCK; - fcntl( $socket, F_SETFL, $newflags ); -} - -# removed -sub EnableServerResponseInLiteral { undef } - -sub Wrap { shift->Clear(@_) } - -# The following class method is for creating valid dates in appended msgs: -my @dow = qw(Sun Mon Tue Wed Thu Fri Sat); -my @mnt = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); - -sub Rfc822_date { - my $class = shift; - my $date = $class =~ /^\d+$/ ? $class : shift; # method or function? - my @date = gmtime($date); - - #Date: Fri, 09 Jul 1999 13:10:55 -0000 - sprintf( - "%s, %02d %s %04d %02d:%02d:%02d -%04d", - $dow[ $date[6] ], - $date[3], - $mnt[ $date[4] ], - $date[5] + 1900, - $date[2], $date[1], $date[0], $date[8] - ); -} - -# The following methods create valid dates for use in IMAP search strings -# - provide Rfc2060* methods/functions for backwards compatibility -sub Rfc2060_date { - $_[0] =~ /^\d+$/ ? Rfc3501_date(@_) : shift->Rfc3501_date(@_); -} - -sub Rfc3501_date { - my $class = shift; - my $stamp = $class =~ /^\d+$/ ? $class : shift; - my @date = gmtime($stamp); - - # 11-Jan-2000 - sprintf( "%02d-%s-%04d", $date[3], $mnt[ $date[4] ], $date[5] + 1900 ); -} - -sub Rfc2060_datetime($;$) { - $_[0] =~ /^\d+$/ ? Rfc3501_datetime(@_) : shift->Rfc3501_datetime(@_); -} - -sub Rfc3501_datetime($;$) { - my $class = shift; - my $stamp = $class =~ /^\d+$/ ? $class : shift; - my $zone = shift || '+0000'; - my @date = gmtime($stamp); - - # 11-Jan-2000 04:04:04 +0000 - sprintf( - "%02d-%s-%04d %02d:%02d:%02d %s", - $date[3], - $mnt[ $date[4] ], - $date[5] + 1900, - $date[2], $date[1], $date[0], $zone - ); -} - -# Change CRLF into \n -sub Strip_cr { - my $class = shift; - if ( !ref $_[0] && @_ == 1 ) { - ( my $string = $_[0] ) =~ s/$CRLF/\n/og; - return $string; - } - - return wantarray - ? map { s/$CRLF/\n/og; $_ } ( ref $_[0] ? @{ $_[0] } : @_ ) - : [ map { s/$CRLF/\n/og; $_ } ( ref $_[0] ? @{ $_[0] } : @_ ) ]; -} - -# The following defines a special method to deal with the Clear parameter: -sub Clear { - my ( $self, $clear ) = @_; - defined $clear or return $self->{Clear}; - - my $oldclear = $self->{Clear}; - $self->{Clear} = $clear; - - my @keys = reverse $self->_trans_index; - - for ( my $i = $clear ; $i < @keys ; $i++ ) { - delete $self->{History}{ $keys[$i] }; - } - - return $oldclear; -} - -# read-only access to the transaction number -sub Transaction { shift->Count } - -# remove doubles from list -sub _remove_doubles(@) { - my %seen; - grep { !$seen{ $_->{name} }++ } @_; -} - -# the constructor: -sub new { - my $class = shift; - my $self = { - LastError => "", - Uid => 1, - Count => 0, - Clear => 2, - Keepalive => 0, - Maxappendstringlength => 1024**2, - Maxcommandlength => 1000, - Maxtemperrors => undef, - State => Unconnected, - Authmechanism => 'LOGIN', - Timeout => 600, - History => {}, - }; - while (@_) { - my $k = ucfirst lc shift; - my $v = shift; - $self->{$k} = $v if defined $v; - } - bless $self, ref($class) || $class; - - # Fast_io is enabled by default when not given a socket - unless ( exists $self->{Fast_io} || $self->{Socket} || $self->{Rawsocket} ) - { - $self->{Fast_io} = 1; - } - - if ( my $sup = $self->{Supportedflags} ) { # unpack into case-less HASH - my %sup = map { m/^\\?(\S+)/ ? lc $1 : () } @$sup; - $self->{Supportedflags} = \%sup; - } - - $self->{Debug_fh} ||= \*STDERR; - CORE::select( ( select( $self->{Debug_fh} ), $|++ )[0] ); - - if ( $self->Debug ) { - $self->_debug( "Started at " . localtime() ); - $self->_debug("Using Mail::IMAPClient version $VERSION on perl $]"); - } - - # BUG? return undef on Socket() failure? - $self->Socket( $self->{Socket} ) - if $self->{Socket}; - - if ( $self->{Rawsocket} ) { - my $sock = delete $self->{Rawsocket}; - - # Ignore Rawsocket if Socket is set. BUG? should we carp/croak? - $self->RawSocket($sock) unless $self->{Socket}; - } - - if ( !$self->{Socket} && $self->{Server} ) { - $self->connect or return undef; - } - return $self; -} - -sub connect(@) { - my $self = shift; - - # BUG? We should restrict which keys can be passed/set here. - %$self = ( %$self, @_ ) if @_; - - my @sockargs = $self->Timeout ? ( Timeout => $self->Timeout ) : (); - push( @sockargs, $self->Debug ? ( Debug => $self->Debug ) : () ); - - # give caller control of IO::Socket::... args to new if desired - if ( $self->Socketargs and ref $self->Socketargs eq "ARRAY" ) { - push( @sockargs, @{ $self->Socketargs } ); - } - - my $server = $self->Server; - my $port = $self->Port || $self->Port( $self->Ssl ? "993" : "143" ); - my ( $ioclass, $sock ); - - if ( File::Spec->file_name_is_absolute($server) ) { - $ioclass = $self->_load_module("UNIX"); - unshift( @sockargs, Peer => $server ); - } - else { - unshift( - @sockargs, - PeerAddr => $server, - PeerPort => $port, - Proto => "tcp", - ); - - # extra control of SSL args is supported - if ( $self->Ssl ) { - $ioclass = $self->_load_module("SSL"); - push( @sockargs, @{ $self->Ssl } ) if ref $self->Ssl eq "ARRAY"; - } - else { - $ioclass = $self->_load_module("INET"); - } - } - - if ($ioclass) { - $self->_debug("Connecting with $ioclass @sockargs"); - $sock = $ioclass->new(@sockargs); - } - - if ($sock) { - $self->_debug( "Connected to $server" . ( $! ? " errno($!)" : "" ) ); - return $self->Socket($sock); - } - else { - my $lasterr = $self->LastError || ""; - $self->LastError("Unable to connect to $server: $lasterr"); - return undef; - } -} - -sub RawSocket(;$) { - my ( $self, $sock ) = @_; - defined $sock - or return $self->{Socket}; - - $self->{Socket} = $sock; - $self->{_select} = IO::Select->new($sock); - - delete $self->{_fcntl}; - $self->Fast_io( $self->Fast_io ); - - return $sock; -} - -sub Socket($) { - my ( $self, $sock ) = @_; - defined $sock - or return $self->{Socket}; - - $self->RawSocket($sock); - $self->State(Connected); - - setsockopt( $sock, SOL_SOCKET, SO_KEEPALIVE, 1 ) if $self->Keepalive; - - # LastError may be set by _read_line via _get_response - # look for "* (OK|BAD|NO|PREAUTH)" - my $code = $self->_get_response( '*', 'PREAUTH' ) or return undef; - - if ( $code eq 'BYE' || $code eq 'NO' ) { - $self->State(Unconnected); - return undef; - } - elsif ( $code eq 'PREAUTH' ) { - $self->State(Authenticated); - return $self; - } - - if ( $self->Starttls ) { - $self->starttls or return undef; - } - - if ( defined $self->User && defined $self->Password ) { - $self->login or return undef; - } - - return $self->{Socket}; -} - -# RFC2595 section 3.1 -sub starttls { - my ($self) = @_; - - # BUG? RFC requirement checks commented out for now... - #if ( $self->IsUnconnected or $self->IsAuthenticated ) { - # $self->LastError("NO must be connected but not authenticated"); - # return undef; - #} - - # BUG? strict check on capability commented out for now... - #return undef unless $self->has_capability("STARTTLS"); - - $self->_imap_command("STARTTLS") or return undef; - - # MUST discard cached capability info; should re-issue capability command - delete $self->{CAPABILITY}; - - my $ioclass = $self->_load_module("SSL") or return undef; - my $sock = $self->RawSocket; - my $blocking = $sock->blocking; - - # BUG: force blocking for now - $sock->blocking(1); - - # give caller control of args to start_SSL if desired - my @sslargs = - ( $self->Starttls and ref( $self->Starttls ) eq "ARRAY" ) - ? ( @{ $self->Starttls } ) - : ( Timeout => 30 ); - - unless ( $ioclass->start_SSL( $sock, @sslargs ) ) { - $self->LastError( "Unable to start TLS: " . $ioclass->errstr ); - return undef; - } - - # return blocking to previous setting - $sock->blocking($blocking); - - return $self; -} - -# RFC4978 COMPRESS -sub compress { - my ($self) = @_; - - # BUG? strict check on capability commented out for now... - #my $can = $self->has_capability("COMPRESS") - #return undef unless $can and $can eq "DEFLATE"; - - $self->_imap_command("COMPRESS DEFLATE") or return undef; - - my $zcl = $self->_load_module("Compress-Zlib") or return undef; - - # give caller control of args if desired - $self->Compress( - [ - -WindowBits => -$zcl->MAX_WBITS(), - -Level => $zcl->Z_BEST_SPEED() - ] - ) unless ( $self->Compress and ref( $self->Compress ) eq "ARRAY" ); - - my ( $rc, $do, $io ); - - ( $do, $rc ) = Compress::Zlib::deflateInit( @{ $self->Compress } ); - unless ( $rc == $zcl->Z_OK ) { - $self->LastError("deflateInit failed (rc=$rc)"); - return undef; - } - - ( $io, $rc ) = - Compress::Zlib::inflateInit( -WindowBits => -$zcl->MAX_WBITS() ); - unless ( $rc == $zcl->Z_OK ) { - $self->LastError("inflateInit failed (rc=$rc)"); - return undef; - } - - $self->{Prewritemethod} = sub { - my ( $imap, $string ) = @_; - - my ( $rc, $out1, $out2 ); - ( $out1, $rc ) = $do->deflate($string); - ( $out2, $rc ) = $do->flush( $zcl->Z_PARTIAL_FLUSH() ) - unless ( $rc != $zcl->Z_OK ); - - unless ( $rc == $zcl->Z_OK ) { - $self->LastError("deflate/flush failed (rc=$rc)"); - return undef; - } - - return $out1 . $out2; - }; - - # need to retain some state for Readmoremethod/Readmethod calls - my ( $Zbuf, $Ibuf ) = ( "", "" ); - - $self->{Readmoremethod} = sub { - my $self = shift; - return 1 if ( length($Zbuf) || length($Ibuf) ); - $self->__read_more(@_); - }; - - $self->{Readmethod} = sub { - my ( $imap, $fh, $buf, $len, $off ) = @_; - - # get more data, but empty $Ibuf first if any data is left - my ( $lz, $li ) = ( length $Zbuf, length $Ibuf ); - if ( $lz || !$li ) { - my $ret = sysread( $fh, $Zbuf, $len, length $Zbuf ); - $lz = length $Zbuf; - return $ret if ( !$ret && !$lz ); # $ret is undef or 0 - } - - # accummulate inflated data in $Ibuf - if ($lz) { - my ( $tbuf, $rc ) = $io->inflate( \$Zbuf ); - unless ( $rc == $zcl->Z_OK ) { - $self->LastError("inflate failed (rc=$rc)"); - return undef; - } - $Ibuf .= $tbuf; - } - - # pull desired length of data from $Ibuf - my $tbuf = substr( $Ibuf, 0, $len ); - substr( $Ibuf, 0, $len ) = ""; - substr( $$buf, $off ) = $tbuf; - - return length $tbuf; - }; - - return $self; -} - -sub login { - my $self = shift; - my $auth = $self->Authmechanism; - - if ( $auth && $auth ne 'LOGIN' ) { - $self->authenticate( $auth, $self->Authcallback ) - or return undef; - } - else { - my $user = $self->User; - my $passwd = $self->Password; - - return undef unless ( defined($passwd) and defined($user) ); - - $user = ( $user eq "" ) ? qq("") : $self->Quote($user); - $passwd = ( $passwd eq "" ) ? qq("") : $self->Quote($passwd); - - $self->_imap_command("LOGIN $user $passwd") - or return undef; - } - - $self->State(Authenticated); - if ( $self->Compress ) { - $self->compress or return undef; - } - return $self; -} - -sub noop { - my ($self) = @_; - $self->_imap_command("NOOP") ? $self->Results : undef; -} - -sub proxyauth { - my ( $self, $user ) = @_; - $user = ( $user eq "" ) ? qq("") : $self->Quote($user); - $self->_imap_command("PROXYAUTH $user") ? $self->Results : undef; -} - -sub separator { - my ( $self, $target ) = @_; - unless ( defined $target ) { - - # separator is namespace's 1st thing's 1st thing's 2nd thing: - my $ns = $self->namespace or return undef; - if ($ns) { - my $sep = $ns->[0][0][1]; - return $sep if $sep; - } - $target = ''; - } - - return $self->{separators}{$target} - if exists $self->{separators}{$target}; - - my $list = $self->list( undef, $target ) or return undef; - - foreach my $line (@$list) { - my $rec = $self->_list_or_lsub_response_parse($line); - next unless defined $rec->{name}; - $self->{separators}{ $rec->{name} } = $rec->{delim}; - } - return $self->{separators}{$target}; -} - -# BUG? caller gets empty list even if Error -# - returning an array with a single undef value seems even worse though -sub sort { - my ( $self, $crit, @a ) = @_; - - $crit =~ /^\(.*\)$/ # wrap criteria in parens - or $crit = "($crit)"; - - my @hits; - if ( $self->_imap_uid_command( SORT => $crit, @a ) ) { - my @results = $self->History; - foreach (@results) { - chomp; - s/$CR$//; - s/^\*\s+SORT\s+// or next; - push @hits, grep /\d/, split; - } - } - return wantarray ? @hits : \@hits; -} - -sub _list_or_lsub { - my ( $self, $cmd, $reference, $target ) = @_; - defined $reference or $reference = ''; - defined $target or $target = '*'; - length $target or $target = '""'; - - $target eq '*' || $target eq '""' - or $target = $self->Massage($target); - - $self->_imap_command(qq($cmd "$reference" $target)) - or return undef; - - # cleanup any literal data that may be returned - my $ret = wantarray ? [ $self->History ] : $self->Results; - if ($ret) { - my $cmd = wantarray ? undef : shift @$ret; - $self->_list_response_preprocess($ret); - unshift( @$ret, $cmd ) if defined($cmd); - } - - #return wantarray ? $self->History : $self->Results; - return wantarray ? @$ret : $ret; -} - -sub list { shift->_list_or_lsub( "LIST", @_ ) } -sub lsub { shift->_list_or_lsub( "LSUB", @_ ) } - -# deprecated 3.34 -sub xlist { - my ($self) = @_; - return undef unless $self->has_capability("XLIST"); - shift->_list_or_lsub( "XLIST", @_ ); -} - -sub _folders_or_subscribed { - my ( $self, $method, $what ) = @_; - my @folders; - - # do BLOCK allowing use of "last if undef/error" and avoiding dup code - do { - { - my @list; - if ($what) { - my $sep = $self->separator($what) || $self->separator(undef); - last unless defined $sep; - - my $whatsub = $what =~ m/\Q${sep}\E$/ ? "$what*" : "$what$sep*"; - - my $tref = $self->$method( undef, $whatsub ) or last; - shift @$tref; # remove command - push @list, @$tref; - - # BUG?: this behavior has been around since 2.x, why? - my $cansel = $self->selectable($what); - last unless defined $cansel; - if ($cansel) { - $tref = $self->$method( undef, $what ) or last; - shift @$tref; # remove command - push @list, @$tref; - } - } - else { - my $tref = $self->$method( undef, undef ) or last; - shift @$tref; # remove command - push @list, @$tref; - } - - foreach my $resp (@list) { - my $rec = $self->_list_or_lsub_response_parse($resp); - next unless defined $rec->{name}; - push @folders, $rec; - } - } - }; - - my @clean = _remove_doubles @folders; - return wantarray ? @clean : \@clean; -} - -sub folders { - my ( $self, $what ) = @_; - - my @folders = - map( $_->{name}, $self->_folders_or_subscribed( "list", $what ) ); - return wantarray ? @folders : \@folders; -} - -sub folders_hash { - my ( $self, $what ) = @_; - - my @folders_hash = $self->_folders_or_subscribed( "list", $what ); - return wantarray ? @folders_hash : \@folders_hash; -} - -# deprecated 3.34 -sub xlist_folders { - my ($self) = @_; - my $xlist = $self->xlist; - return undef unless defined $xlist; - - my %xlist; - my $xlist_re = qr/\A\\(Inbox|AllMail|Trash|Drafts|Sent|Spam|Starred)\Z/; - - for my $resp (@$xlist) { - my $rec = $self->_list_or_lsub_response_parse($resp); - next unless defined $rec->{name}; - for my $attr ( @{ $rec->{attrs} } ) { - $xlist{$1} = $rec->{name} if ( $attr =~ $xlist_re ); - } - } - - return wantarray ? %xlist : \%xlist; -} - -sub subscribed { - my ( $self, $what ) = @_; - my @folders = - map( $_->{name}, $self->_folders_or_subscribed( "lsub", $what ) ); - return wantarray ? @folders : \@folders; -} - -sub deleteacl { - my ( $self, $target, $user ) = @_; - $target = $self->Massage($target); - $user = ( $user eq "" ) ? qq("") : $self->Quote($user); - - $self->_imap_command(qq(DELETEACL $target $user)) - or return undef; - - return wantarray ? $self->History : $self->Results; -} - -sub setacl { - my ( $self, $target, $user, $acl ) = @_; - $target ||= $self->Folder; - $target = $self->Massage($target); - - $user ||= $self->User; - $user = ( $user eq "" ) ? qq("") : $self->Quote($user); - $acl = ( $acl eq "" ) ? qq("") : $self->Quote($acl); - - $self->_imap_command(qq(SETACL $target $user $acl)) - or return undef; - - return wantarray ? $self->History : $self->Results; -} - -sub getacl { - my ( $self, $target ) = @_; - defined $target or $target = $self->Folder; - my $mtarget = $self->Massage($target); - $self->_imap_command(qq(GETACL $mtarget)) - or return undef; - - my @history = $self->History; - my $hash; - for ( my $x = 0 ; $x < @history ; $x++ ) { - next if $history[$x] !~ /^\* ACL/; - - my $perm = - $history[$x] =~ /^\* ACL $/ - ? $history[ ++$x ] . $history[ ++$x ] - : $history[$x]; - - $perm =~ s/\s?$CRLF$//o; - until ( $perm =~ /\Q$target\E"?$/ || !$perm ) { - $perm =~ s/\s([^\s]+)\s?$// or last; - my $p = $1; - $perm =~ s/\s([^\s]+)\s?$// or last; - my $u = $1; - $hash->{$u} = $p; - $self->_debug("Permissions: $u => $p"); - } - } - return $hash; -} - -sub listrights { - my ( $self, $target, $user ) = @_; - $target ||= $self->Folder; - $target = $self->Massage($target); - - $user ||= $self->User; - $user = ( $user eq "" ) ? qq("") : $self->Quote($user); - - $self->_imap_command(qq(LISTRIGHTS $target $user)) - or return undef; - - my $resp = first { /^\* LISTRIGHTS/ } $self->History; - my @rights = split /\s/, $resp; - my $rights = join '', @rights[ 4 .. $#rights ]; - $rights =~ s/"//g; - return wantarray ? split( //, $rights ) : $rights; -} - -sub select { - my ( $self, $target ) = @_; - defined $target or return undef; - - my $qqtarget = $self->Massage($target); - my $old = $self->Folder; - - $self->_imap_command("SELECT $qqtarget") - or return undef; - - $self->State(Selected); - $self->Folder($target); - return $old || $self; # ??$self?? -} - -sub message_string { - my ( $self, $msg ) = @_; - - return undef unless defined $self->imap4rev1; - my $peek = $self->Peek ? '.PEEK' : ''; - my $cmd = $self->imap4rev1 ? "BODY$peek\[]" : "RFC822$peek"; - - my $string; - $self->message_to_file( \$string, $msg ); - - unless ( $self->Ignoresizeerrors ) { # Check size with expected size - my $expected_size = $self->size($msg); - return undef unless defined $expected_size; - - # RFC822.SIZE may be wrong, see RFC2683 3.4.5 "RFC822.SIZE" - if ( length($string) != $expected_size ) { - $self->LastError( "message_string() " - . "expected $expected_size bytes but received " - . length($string) - . " you may need the IgnoreSizeErrors option" ); - return undef; - } - } - - return $string; -} - -sub bodypart_string { - my ( $self, $msg, $partno, $bytes, $offset ) = @_; - - unless ( $self->imap4rev1 ) { - $self->LastError( "Unable to get body part; server " - . $self->Server - . " does not support IMAP4REV1" ) - unless $self->LastError; - return undef; - } - - $offset ||= 0; - my $cmd = "BODY" - . ( $self->Peek ? '.PEEK' : '' ) - . "[$partno]" - . ( $bytes ? "<$offset.$bytes>" : '' ); - - $self->fetch( $msg, $cmd ) - or return undef; - - $self->_transaction_literals; -} - -# message_to_file( $self, $file, @msgs ) -sub message_to_file { - my ( $self, $file, @msgs ) = @_; - - # $file can be a name or a scalar reference (for in memory file) - # avoid IO::File bug handling scalar refs in perl <= 5.8.8? - # - buggy: $fh = IO::File->new( $file, 'r' ) - my $fh; - if ( ref $file and ref $file ne "SCALAR" ) { - $fh = $file; - } - else { - $$file = "" if ( ref $file eq "SCALAR" and !defined $$file ); - local ($!); - open( $fh, ">>", $file ); - unless ( defined($fh) ) { - $self->LastError("Unable to open file '$file': $!"); - return undef; - } - } - - binmode($fh); - - unless (@msgs) { - $self->LastError("message_to_file: NO messages specified!"); - return undef; - } - - my $peek = $self->Peek ? '.PEEK' : ''; - $peek = sprintf( $self->imap4rev1 ? "BODY%s\[]" : "RFC822%s", $peek ); - - my @args = ( join( ",", @msgs ), $peek ); - - return $self->_imap_uid_command( { outref => $fh }, "FETCH" => @args ) - ? $self - : undef; -} - -sub message_uid { - my ( $self, $msg ) = @_; - - my $ref = $self->fetch( $msg, "UID" ) or return undef; - foreach (@$ref) { - return $1 if m/\(UID\s+(\d+)\s*\)$CR?$/o; - } - return undef; -} - -# cleaned up and simplified but see TODO in code... -sub migrate { - my ( $self, $peer, $msgs, $folder ) = @_; - - unless ( $peer and $peer->IsConnected ) { - $self->LastError( ( $peer ? "Invalid" : "Unconnected" ) - . " target " - . ref($self) - . " object in migrate()" - . ( $peer ? ( ": " . $peer->LastError ) : "" ) ); - return undef; - } - - # sanity check to see if $self is same object as $peer - if ( $self eq $peer ) { - $self->LastError("dest must not be the same object as self"); - return undef; - } - - $folder = $self->Folder unless ( defined $folder ); - unless ($folder) { - $self->LastError("No folder selected on source mailbox."); - return undef; - } - - unless ( $peer->exists($folder) or $peer->create($folder) ) { - $self->LastError( "Create folder '$folder' on target host failed: " - . $peer->LastError ); - return undef; - } - - if ( !defined $msgs or uc($msgs) eq "ALL" ) { - $msgs = $self->search("ALL") or return undef; - } - - # message size and (internal) date - my @headers = qw(RFC822.SIZE INTERNALDATE FLAGS); - my $range = $self->Range($msgs); - - $self->_debug("Messages to migrate from '$folder': $range"); - - foreach my $mid ( $range->unfold ) { - - # fetch size internaldate and flags of original message - # - TODO: add flags here... - my $minfo = $self->fetch_hash( $mid, @headers ) - or return undef; - - my ( $size, $date ) = @{ $minfo->{$mid} }{@headers}; - return undef unless ( defined $size and defined $date ); - - $self->_debug("Copy message $mid (sz=$size,dt=$date) from '$folder'"); - - my @flags = grep !/\\Recent/i, $self->flags($mid); - my $flags = join ' ', $peer->supported_flags(@flags); - - # TODO: - use File::Temp tempfile if $msg > bufferSize? - # read message to $msg - my $msg; - $self->message_to_file( \$msg, $mid ) - or return undef; - - my $newid = $peer->append_file( $folder, \$msg, undef, $flags, $date ); - - unless ( defined $newid ) { - $self->LastError( - "Append to '$folder' on target failed: " . $peer->LastError ); - return undef; - } - - $self->_debug("Copied UID $mid in '$folder' to target UID $newid"); - } - - return $self; -} - -# Optimization of wait time between syswrite calls only runs if syscalls -# run too fast and fill the buffer causing "EAGAIN: Resource Temp. Unavail" -# errors. The premise is that $maxwrite will be approx. the same as the -# smallest buffer between the sending and receiving side. Waiting time -# between syscalls should ideally be exactly as long as it takes the -# receiving side to empty that buffer, minus a little bit to prevent it -# from emptying completely and wasting time in the select call. - -sub _optimal_sleep($$$) { - my ( $self, $maxwrite, $waittime, $last5writes ) = @_; - - push @$last5writes, $waittime; - shift @$last5writes if @$last5writes > 5; - - my $bufferavail = ( sum @$last5writes ) / @$last5writes; - - if ( $bufferavail < .4 * $maxwrite ) { - - # Buffer is staying pretty full; we should increase the wait - # period to reduce transmission overhead/number of packets sent - $waittime *= 1.3; - } - elsif ( $bufferavail > .9 * $maxwrite ) { - - # Buffer is nearly or totally empty; we're wasting time in select - # call that could be used to send data, so reduce the wait period - $waittime *= .5; - } - - CORE::select( undef, undef, undef, $waittime ); - $waittime; -} - -sub body_string { - my ( $self, $msg ) = @_; - my $ref = - $self->fetch( $msg, "BODY" . ( $self->Peek ? ".PEEK" : "" ) . "[TEXT]" ) - or return undef; - - my $string = join '', map { $_->[DATA] } - grep { $self->_is_literal($_) } @$ref; - - return $string - if $string; - - my $head; - while ( $head = shift @$ref ) { - $self->_debug("body_string: head = '$head'"); - - last - if $head =~ - /(?:.*FETCH .*\(.*BODY\[TEXT\])|(?:^\d+ BAD )|(?:^\d NO )/i; - } - - unless (@$ref) { - $self->LastError( - "Unable to parse server response from " . $self->LastIMAPCommand ); - return undef; - } - - my $popped; - $popped = pop @$ref - until ( $popped && $popped =~ /^\)$CRLF$/o ) - || !grep /^\)$CRLF$/o, @$ref; - - if ( $head =~ /BODY\[TEXT\]\s*$/i ) { # Next line is a literal - $string .= shift @$ref while @$ref; - $self->_debug("String is now $string") - if $self->Debug; - } - - $string; -} - -sub examine { - my ( $self, $target ) = @_; - defined $target or return undef; - - $self->_imap_command( 'EXAMINE ' . $self->Massage($target) ) - or return undef; - - my $old = $self->Folder; - $self->Folder($target); - $self->State(Selected); - $old || $self; -} - -sub idle { - my $self = shift; - my $good = '+'; - my $count = $self->Count + 1; - $self->_imap_command( "IDLE", $good ) ? $count : undef; -} - -sub idle_data { - my $self = shift; - my $timeout = scalar(@_) ? shift : 0; - my $socket = $self->Socket; - - # current index in Results array - my $trans_c1 = $self->_next_index; - - # look for all untagged responses - my ( $rc, $ret ); - - do { - $ret = - $self->_read_more( { error_on_timeout => 0 }, $socket, $timeout ); - - # set rc on first pass or on errors - $rc = $ret if ( !defined($rc) or $ret < 0 ); - - # not using /\S+/ because that can match 0 in "* 0 RECENT" - # leading the library to act as if things failed - if ( $ret > 0 ) { - $self->_get_response( '*', qr/(?!BAD|BYE|NO)(?:\d+\s+\w+|\S+)/ ) - or return undef; - $timeout = 0; # check for more data without blocking! - } - } while $ret > 0; - - # select returns -1 on errors - return undef if $rc < 0; - - my $trans_c2 = $self->_next_index; - - # if current index in Results array has changed return data - my @res; - if ( $trans_c1 < $trans_c2 ) { - @res = $self->Results; - @res = @res[ $trans_c1 .. ( $trans_c2 - 1 ) ]; - } - return wantarray ? @res : \@res; -} - -sub done { - my $self = shift; - my $count = shift || $self->Count; - $self->_imap_command( { addtag => 0, tag => $count }, "DONE" ) - or return undef; - return $self->Results; -} - -# tag_and_run( $self, $string, $good ) -sub tag_and_run { - my $self = shift; - $self->_imap_command(@_) or return undef; - return $self->Results; -} - -sub reconnect { - my $self = shift; - - if ( $self->IsAuthenticated ) { - $self->_debug("reconnect called but already authenticated"); - return 1; - } - - # safeguard from deep recursion via connect - if ( $self->{_doing_reconnect} ) { - $self->_debug("recursive call to reconnect, returning 0\n"); - $self->LastError("unexpected reconnect recursion") - unless $self->LastError; - return 0; - } - - my $einfo = $self->LastError || ""; - $self->_debug( "reconnecting to ", $self->Server, ", last error: $einfo" ); - $self->{_doing_reconnect} = 1; - - # reconnect and select appropriate folder - my $ret; - if ( $self->connect ) { - $ret = 1; - if ( defined $self->Folder ) { - $ret = defined( $self->select( $self->Folder ) ) ? 1 : undef; - } - } - - delete $self->{_doing_reconnect}; - return $ret ? 1 : $ret; -} - -# wrapper for _imap_command_do to enable retrying on lost connections -sub _imap_command { - my $self = shift; - - my $tries = 0; - my $retry = $self->Reconnectretry || 0; - my ( $rc, @err ); - - # LastError (if set) will be overwritten masking any earlier errors - while ( $tries++ <= $retry ) { - - # do command on the first try or if Connected (reconnect ongoing) - if ( $tries == 1 or $self->IsConnected ) { - $rc = $self->_imap_command_do(@_); - push( @err, $self->LastError ) if $self->LastError; - } - - if ( !defined($rc) and $retry and $self->IsUnconnected ) { - last - unless ( - $! == EPIPE - or $! == ECONNRESET - or $self->LastError =~ /(?:error\(.*?\)|timeout) waiting\b/ - or $self->LastError =~ /(?:socket closed|\* BYE)\b/ - - # BUG? reconnect if caller ignored/missed earlier errors? - # or $self->LastError =~ /NO not connected/ - ); - my $ret = $self->reconnect; - if ($ret) { - $self->_debug("reconnect success($ret) on try #$tries/$retry"); - } - elsif ( defined $ret and $ret == 0 ) { # escaping recursion - return undef; - } - else { - $self->_debug("reconnect failure on try #$tries/$retry"); - push( @err, $self->LastError ) if $self->LastError; - } - } - else { - last; - } - } - - unless ($rc) { - my ( %seen, @keep, @info ); - - foreach my $str (@err) { - my ( $sz, $len ) = ( 96, length($str) ); - $str =~ s/$CR?$LF$/\\n/omg; - if ( !$self->Debug and $len > $sz * 2 ) { - my $beg = substr( $str, 0, $sz ); - my $end = substr( $str, -$sz, $sz ); - $str = $beg . "..." . $end; - } - next if $seen{$str}++; - push( @keep, $str ); - } - foreach my $msg (@keep) { - push( @info, $msg . ( $seen{$msg} > 1 ? " ($seen{$msg}x)" : "" ) ); - } - $self->LastError( join( "; ", @info ) ); - } - - return $rc; -} - -# _imap_command_do runs a command, inserting a tag and CRLF as requested -# options: -# addcrlf => 0|1 - suppress adding CRLF to $string -# addtag => 0|1 - suppress adding $tag to $string -# tag => $tag - use this $tag instead of incrementing $self->Count -# outref => ... - see _get_response() -sub _imap_command_do { - my $self = shift; - my $opt = ref( $_[0] ) eq "HASH" ? shift : {}; - my $string = shift or return undef; - my $good = shift; - - my @gropt = ( $opt->{outref} ? { outref => $opt->{outref} } : () ); - - $opt->{addcrlf} = 1 unless exists $opt->{addcrlf}; - $opt->{addtag} = 1 unless exists $opt->{addtag}; - - # reset error in case the last error was non-fatal but never cleared - if ( $self->LastError ) { - - #DEBUG $self->_debug( "Reset LastError: " . $self->LastError ); - $self->LastError(undef); - } - - my $clear = $self->Clear; - $self->Clear($clear) - if $self->Count >= $clear && $clear > 0; - - my $count = $self->Count( $self->Count + 1 ); - my $tag = $opt->{tag} || $count; - $string = "$tag $string" if $opt->{addtag}; - - # for APPEND (append_string) only log first line of command - my $logstr = ( $string =~ /^($tag\s+APPEND\s+.*?)$CR?$LF/ ) ? $1 : $string; - - # BUG? use $self->_next_index($tag) ? or 0 ??? - # $self->_record($tag, [$self->_next_index($tag), "INPUT", $logstr] ); - $self->_record( $count, [ 0, "INPUT", $logstr ] ); - - # $suppress (adding CRLF) set to 0 if $opt->{addcrlf} is TRUE - unless ( $self->_send_line( $string, $opt->{addcrlf} ? 0 : 1 ) ) { - $self->LastError( "Error sending '$logstr': " . $self->LastError ); - return undef; - } - - # look for " (OK|BAD|NO|$good)" (or "+..." if $good is '+') - my $code = $self->_get_response( @gropt, $tag, $good ) or return undef; - - if ( $code eq 'OK' ) { - return $self; - } - elsif ( $good and $code eq $good ) { - return $self; - } - else { - return undef; - } -} - -sub _response_code_sub { - my ( $self, $tag, $good ) = @_; - - # tag/good can be a ref (compiled regex) otherwise quote it - my $qtag = ref($tag) ? $tag : defined($tag) ? quotemeta($tag) : undef; - my $qgood = ref($good) ? $good : defined($good) ? quotemeta($good) : undef; - - # using closure, a variable alias, and sub returns on first match - # - $_[0] is $o->[DATA] - # - returns list ( $code, $byemsg ) - my $getcodesub = sub { - if ( defined $qgood ) { - if ( $good eq '+' and $_[0] =~ /^$qgood/ ) { - return ($good); - } - if ( defined $qtag and $_[0] =~ /^$qtag\s+($qgood)/i ) { - return ( ref($qgood) ? $1 : uc($1) ); - } - } - if ( defined $qtag ) { - if ( $tag eq '+' and $_[0] =~ /^$qtag/ ) { - return ($tag); - } - if ( $_[0] =~ /^$qtag\s+(OK|BAD|NO)\b/i ) { - my $code = uc($1); - $self->LastError( $_[0] ) unless ( $code eq 'OK' ); - return ($code); - } - } - if ( $_[0] =~ /^\*\s+(BYE)\b/i ) { - return ( uc($1), $_[0] ); # ( 'BYE', $byemsg ) - } - return (undef); - }; - - return $getcodesub; -} - -# _get_response get IMAP response optionally send data somewhere -# options: -# outref => GLOB|CODE - reference to send output to (see _read_line) -sub _get_response { - my $self = shift; - my $opt = ref( $_[0] ) eq "HASH" ? shift : {}; - my $tag = shift; - my $good = shift; - - my $outref = $opt->{outref}; - my @readopt = defined($outref) ? ($outref) : (); - my $getcode = $self->_response_code_sub( $tag, $good ); - - my ( $count, $out, $code, $byemsg ) = ( $self->Count, [], undef, undef ); - until ( defined $code ) { - my $output = $self->_read_line(@readopt) or return undef; - $out = $output; # keep last response just in case - - # not using last on first match? paranoia or right thing? - # only uc() when match is not on case where $tag|$good is a ref() - foreach my $o (@$output) { - $self->_record( $count, $o ); - $self->_is_output($o) or next; - my ( $tcode, $tbyemsg ) = $getcode->( $o->[DATA] ); - $code = $tcode if ( defined $tcode ); - $byemsg = $tbyemsg if ( defined $tbyemsg ); - } - } - - if ( defined $code ) { - $code =~ s/$CR?$LF?$//o; - $code = uc($code) unless ( $good and $code eq $good ); - - # RFC 3501 7.1.5: $code on successful LOGOUT is OK not BYE - # sometimes we may fail to wait long enough to read a tagged - # OK so don't be strict about setting an error on LOGOUT! - if ( $code eq 'BYE' ) { - $self->State(Unconnected); - if ($byemsg) { - $self->LastError($byemsg) - unless ( $good and $code eq $good ); - } - } - } - elsif ( !$self->LastError ) { - my $info = "unexpected response: " . join( " ", @$out ); - $self->LastError($info); - } - - return $code; -} - -sub _imap_uid_command { - my $self = shift; - my @opt = ref( $_[0] ) eq "HASH" ? (shift) : (); - my $cmd = shift; - - my $args = @_ ? join( " ", '', @_ ) : ''; - my $uid = $self->Uid ? 'UID ' : ''; - $self->_imap_command( @opt, "$uid$cmd$args" ); -} - -sub run { - my $self = shift; - my $string = shift or return undef; - - my $tag = $string =~ /^(\S+) / ? $1 : undef; - unless ($tag) { - $self->LastError("No tag found in string passed to run(): $string"); - return undef; - } - - $self->_imap_command( { addtag => 0, addcrlf => 0, tag => $tag }, $string ) - or return undef; - - $self->{History}{$tag} = $self->{History}{ $self->Count } - unless $tag eq $self->Count; - - return $self->Results; -} - -# _record saves the conversation into the History structure: -sub _record { - my ( $self, $count, $array ) = @_; - if ( $array->[DATA] =~ /^\d+ LOGIN/i && !$self->Showcredentials ) { - $array->[DATA] =~ s/LOGIN.*/LOGIN XXXXXXXX XXXXXXXX/i; - } - - push @{ $self->{History}{$count} }, $array; -} - -# _send_line handles literal data and supports the Prewritemethod -sub _send_line { - my ( $self, $string, $suppress ) = @_; - - $string =~ s/$CR?$LF?$/$CRLF/o - unless $suppress; - - # handle case where string contains a literal - if ( $string =~ s/^([^$LF\{]*\{\d+\}$CRLF)(?=.)//o ) { - my $first = $1; - $self->_debug("Sending literal: $first\tthen: $string"); - $self->_send_line($first) or return undef; - - # look for "+..." - my $code = $self->_get_response('+') or return undef; - return undef unless $code eq '+'; - } - - # non-literal part continues... - unless ( $self->IsConnected ) { - $self->LastError("NO not connected"); - return undef; - } - - if ( my $prew = $self->Prewritemethod ) { - $string = $prew->( $self, $string ); - } - - $self->_debug("Sending: $string"); - $self->_send_bytes( \$string ); -} - -sub _send_bytes($) { - my ( $self, $byteref ) = @_; - my ( $total, $temperrs, $maxwrite ) = ( 0, 0, 0 ); - my $waittime = .02; - my @previous_writes; - - my $maxagain = $self->Maxtemperrors; - undef $maxagain if $maxagain and lc($maxagain) eq 'unlimited'; - - local $SIG{PIPE} = 'IGNORE'; # handle SIGPIPE as normal error - - my $socket = $self->Socket; - while ( $total < length $$byteref ) { - my $written = - syswrite( $socket, $$byteref, length($$byteref) - $total, $total ); - - if ( defined $written ) { - $temperrs = 0; - $total += $written; - next; - } - - if ( $! == EAGAIN ) { - if ( defined $maxagain && $temperrs++ > $maxagain ) { - $self->LastError("Persistent error '$!'"); - return undef; - } - - $waittime = - $self->_optimal_sleep( $maxwrite, $waittime, \@previous_writes ); - next; - } - - # Unconnected might be apropos for more than just these? - my $emsg = $! ? "$!" : "no error caught"; - $self->State(Unconnected) - if ( $! == EPIPE or $! == ECONNRESET or $! == EBADF ); - $self->LastError("Write failed '$emsg'"); - - return undef; # no luck - } - - $self->_debug("Sent $total bytes"); - return $total; -} - -# _read_line: read one line from the socket -# -# $output = $self->_read_line($literal_callback) -# literal_callback is optional, but if supplied it must be either -# be a filehandle, coderef, or undef. -# -# Returns a reference to an array of arrays, i.e.: -# $output = [ -# [ $index, 'OUTPUT|LITERAL', $output_line ], -# [ $index, 'OUTPUT|LITERAL', $output_line ], -# ... -# \]; - -# BUG?: make memory more efficient -sub _read_line { - my ( $self, $literal_callback ) = @_; - - my $socket = $self->Socket; - unless ( $self->IsConnected && $socket ) { - $self->LastError("NO not connected"); - return undef; - } - - my $iBuffer = ""; - my $oBuffer = []; - my $index = $self->_next_index; - my $timeout = $self->Timeout; - my $readlen = $self->Buffer || 4096; - my $transno = $self->Transaction; - - my $literal_cbtype = ""; - if ($literal_callback) { - if ( UNIVERSAL::isa( $literal_callback, "GLOB" ) ) { - $literal_cbtype = "GLOB"; - } - elsif ( UNIVERSAL::isa( $literal_callback, "CODE" ) ) { - $literal_cbtype = "CODE"; - } - else { - $self->LastError( "'$literal_callback' is an " - . "invalid callback; must be a filehandle or CODE" ); - return undef; - } - } - - my $temperrs = 0; - my $maxagain = $self->Maxtemperrors; - undef $maxagain if $maxagain and lc($maxagain) eq 'unlimited'; - - until ( - @$oBuffer # there's stuff in output buffer: - && $oBuffer->[-1][TYPE] eq 'OUTPUT' # that thing is an output line: - && $oBuffer->[-1][DATA] =~ - /$CR?$LF$/o # the last thing there has cr-lf: - && !length $iBuffer # and the input buffer has been MT'ed: - ) - { - - if ($timeout) { - my $rc = $self->_read_more( $socket, $timeout ); - return undef unless ( $rc > 0 ); - } - - my $emsg; - my $ret = - $self->_sysread( $socket, \$iBuffer, $readlen, length $iBuffer ); - - if ($timeout) { - if ( defined $ret ) { - $temperrs = 0; - } - else { - $emsg = "error while reading data from server: $!"; - if ( $! == ECONNRESET ) { - $self->State(Unconnected); - } - elsif ( $! == EAGAIN ) { - if ( defined $maxagain && $temperrs++ >= $maxagain ) { - $emsg .= " ($temperrs)"; - } - else { - next; # try again - } - } - } - } - - if ( defined $ret && $ret == 0 ) { # Caught EOF... - $emsg = "socket closed while reading data from server"; - $self->State(Unconnected); - } - - # save errors and return - if ($emsg) { - $self->LastError($emsg); - $self->_record( - $transno, - [ - $self->_next_index($transno), "ERROR", "$transno * NO $emsg" - ] - ); - return undef; - } - - while ( $iBuffer =~ s/^(.*?$CR?$LF)//o ) # consume line - { - my $current_line = $1; - if ( $current_line !~ s/\s*\{(\d+)\}$CR?$LF$//o ) { - push @$oBuffer, [ $index++, 'OUTPUT', $current_line ]; - next; - } - - push @$oBuffer, [ $index++, 'OUTPUT', $current_line ]; - - ## handle LITERAL - # BLAH BLAH {nnn}$CRLF - # [nnn bytes of literally transmitted stuff] - # [part of line that follows literal data]$CRLF - - my $expected_size = $1; - - $self->_debug( "LITERAL: received literal in line " - . "$current_line of length $expected_size; attempting to " - . "retrieve from the " - . length($iBuffer) - . " bytes in: $iBuffer" ); - - my $litstring; - if ( length $iBuffer >= $expected_size ) { - - # already received all data - $litstring = substr $iBuffer, 0, $expected_size, ''; - } - else { # literal data still to arrive - $litstring = $iBuffer; - $iBuffer = ''; - - my $litreadb = length($litstring); - my $temperrs = 0; - my $maxagain = $self->Maxtemperrors; - undef $maxagain if $maxagain and lc($maxagain) eq 'unlimited'; - - while ( $expected_size > $litreadb ) { - if ($timeout) { - my $rc = $self->_read_more( $socket, $timeout ); - return undef unless ( $rc > 0 ); - } - else { # 25 ms before retry - CORE::select( undef, undef, undef, 0.025 ); - } - - # $litstring is emptied when $literal_cbtype is GLOB - my $ret = - $self->_sysread( $socket, \$litstring, - $expected_size - $litreadb, - length($litstring) ); - - if ($timeout) { - if ( defined $ret ) { - $temperrs = 0; - } - else { - $emsg = "error while reading data from server: $!"; - if ( $! == ECONNRESET ) { - $self->State(Unconnected); - } - elsif ( $! == EAGAIN ) { - if ( defined $maxagain - && $temperrs++ >= $maxagain ) - { - $emsg .= " ($temperrs)"; - } - else { - undef $emsg; - next; # try again - } - } - } - } - - # EOF: note IO::Socket::SSL does not support eof() - if ( defined $ret and $ret == 0 ) { - $emsg = "socket closed while reading data from server"; - $self->State(Unconnected); - } - elsif ( defined $ret and $ret > 0 ) { - $litreadb += $ret; - - # conserve memory when using literal_callback GLOB - if ( $literal_cbtype eq "GLOB" ) { - print $literal_callback $litstring; - $litstring = "" unless ($emsg); - } - } - - $self->_debug( "Received ret=" - . ( defined($ret) ? $ret : "" ) - . " $litreadb of $expected_size" ); - - # save errors and return - if ($emsg) { - $self->LastError($emsg); - $self->_record( - $transno, - [ - $self->_next_index($transno), "ERROR", - "$transno * NO $emsg" - ] - ); - $litstring = "" unless defined $litstring; - $self->_debug( "ERROR while processing LITERAL, " - . " buffer=\n" - . $litstring - . "\n" ); - return undef; - } - } - } - - if ( defined $litstring ) { - if ( $literal_cbtype eq "GLOB" ) { - print $literal_callback $litstring; - } - elsif ( $literal_cbtype eq "CODE" ) { - $literal_callback->($litstring); - } - } - - push @$oBuffer, [ $index++, 'LITERAL', $litstring ] - if ( $literal_cbtype ne "GLOB" ); - } - } - - $self->_debug( "Read: " . join "", map { "\t" . $_->[DATA] } @$oBuffer ) - if ( $self->Debug ); - - @$oBuffer ? $oBuffer : undef; -} - -sub _sysread { - my ( $self, $fh, $buf, $len, $off ) = @_; - my $rm = $self->Readmethod; - $rm ? $rm->(@_) : sysread( $fh, $$buf, $len, $off ); -} - -sub _read_more { - my $self = shift; - my $rm = $self->Readmoremethod; - $rm ? $rm->( $self, @_ ) : $self->__read_more(@_); -} - -sub __read_more { - my $self = shift; - my $opt = ref( $_[0] ) eq "HASH" ? shift : {}; - my ( $socket, $timeout ) = @_; - - # IO::Socket::SSL buffers some data internally, so there might be some - # data available from the previous sysread of which the file-handle - # (used by select()) doesn't know of. - return 1 if $socket->isa("IO::Socket::SSL") && $socket->pending; - - my $rvec = ''; - vec( $rvec, fileno($socket), 1 ) = 1; - - my $rc = CORE::select( $rvec, undef, $rvec, $timeout ); - - # fast track success - return $rc if $rc > 0; - - # by default set an error on timeout - my $err_on_timeout = - exists $opt->{error_on_timeout} ? $opt->{error_on_timeout} : 1; - - # $rc is 0 then we timed out - return $rc if !$rc and !$err_on_timeout; - - # set the appropriate error and return - my $transno = $self->Transaction; - my $msg = - ( $rc ? "error($rc)" : "timeout" ) - . " waiting ${timeout}s for data from server" - . ( $! ? ": $!" : "" ); - $self->LastError($msg); - $self->_record( $transno, - [ $self->_next_index($transno), "ERROR", "$transno * NO $msg" ] ); - $self->_disconnect; # BUG: can not handle timeouts gracefully - return $rc; -} - -sub _trans_index() { - sort { $a <=> $b } keys %{ $_[0]->{History} }; -} - -# all default to last transaction -sub _transaction(;$) { - @{ $_[0]->{History}{ $_[1] || $_[0]->Transaction } || [] }; -} - -sub _trans_data(;$) { - map { $_->[DATA] } $_[0]->_transaction( $_[1] ); -} - -sub Report { - my $self = shift; - map { $self->_trans_data($_) } $self->_trans_index; -} - -sub LastIMAPCommand(;$) { - my ( $self, $trans ) = @_; - my $msg = ( $self->_transaction($trans) )[0]; - $msg ? $msg->[DATA] : undef; -} - -sub History(;$) { - my ( $self, $trans ) = @_; - my ( $cmd, @a ) = $self->_trans_data($trans); - return wantarray ? @a : \@a; -} - -sub Results(;$) { - my ( $self, $trans ) = @_; - my @a = $self->_trans_data($trans); - return wantarray ? @a : \@a; -} - -sub _transaction_literals() { - my $self = shift; - join '', map { $_->[DATA] } - grep { $self->_is_literal($_) } $self->_transaction; -} - -sub Escaped_results { - my ( $self, $trans ) = @_; - my @a; - my $prevwasliteral = 0; - foreach my $line ( grep defined, $self->_transaction($trans) ) { - my $data = $line->[DATA]; - - # literal is appended to previous data - if ( $self->_is_literal($line) ) { - $data = $self->Escape($data); - $a[-1] .= qq( "$data"); - $prevwasliteral = 1; - } - else { - if ($prevwasliteral) { - $a[-1] .= $data; - } - else { - push( @a, $data ); - } - $prevwasliteral = 0; - } - } - - return wantarray ? @a : \@a; -} - -sub Escape { - my $data = $_[1]; - $data =~ s/([\\\"])/\\$1/og; - return $data; -} - -sub Unescape { - my $data = $_[1]; - $data =~ s/\\([\\\"])/$1/og; - return $data; -} - -sub logout { - my $self = shift; - my $rc = $self->_imap_command( "LOGOUT", "BYE" ); - $self->_disconnect; - return $rc; -} - -sub _disconnect { - my $self = shift; - - delete $self->{CAPABILITY}; - delete $self->{_IMAP4REV1}; - $self->State(Unconnected); - if ( my $sock = delete $self->{Socket} ) { - local ($@); - eval { $sock->close }; - } - return $self; -} - -# LIST/XLIST/LSUB Response -# Contents: name attributes, hierarchy delimiter, name -# Example: * LIST (\Noselect) "/" ~/Mail/foo -# NOTE: in _list_response_preprocess we append literal data so we need -# to be liberal about our matching of folder name data -sub _list_or_lsub_response_parse { - my ( $self, $resp ) = @_; - - return undef unless defined $resp; - my %info; - - $resp =~ s/\015?\012$//; - if ( - $resp =~ / ^\* \s+ (?:LIST|XLIST|LSUB) \s+ # * LIST|XLIST|LSUB - \( ([^\)]*) \) \s+ # (attrs) - (?: \" ([^"]*) \" | NIL ) \s # "delimiter" or NIL - (?:\s*\" (.*) \" | (.*) ) # "name" or name - /ix - ) - { - @info{qw(attrs delim name)} = - ( [ split( / /, $1 ) ], $2, defined($3) ? $self->Unescape($3) : $4 ); - } - return wantarray ? %info : \%info; -} - -# handle listeral data returned in list/lsub responses -# some example responses: -# * LIST () "/" "My Folder" # nothing to do here... -# * LIST () "/" {9} # the {9} is already removed by _read_line() -# Special % # we append this to the previous line -sub _list_response_preprocess { - my ( $self, $data ) = @_; - return undef unless defined $data; - - for ( my $m = 0 ; $m < @$data ; $m++ ) { - if ( $data->[$m] && $data->[$m] !~ /$CR?$LF$/o ) { - $self->_debug("concatenating '$data->[$m]' and '$data->[$m+1]'"); - $data->[$m] .= " " . $data->[ $m + 1 ]; - splice @$data, $m + 1, 1; - } - } - return $data; -} - -sub exists { - my ( $self, $folder ) = @_; - $self->status($folder) ? $self : undef; -} - -# Updated to handle embedded literal strings -sub get_bodystructure { - my ( $self, $msg ) = @_; - - my $class = $self->_load_module("BodyStructure") or return undef; - - my $out = $self->fetch( $msg, "BODYSTRUCTURE" ) or return undef; - - my $bs = ""; - my $output = first { /BODYSTRUCTURE\s+\(/i } @$out; - - unless ( $output =~ /$CRLF$/o ) { - $output = ''; - $self->_debug("get_bodystructure: reassembling original response"); - my $started = 0; - foreach my $o ( $self->_transaction ) { - next unless $self->_is_output_or_literal($o); - $started++ if $o->[DATA] =~ /BODYSTRUCTURE \(/i; - $started or next; - - if ( length($output) && $self->_is_literal($o) ) { - my $data = $o->[DATA]; - $data =~ s/"/\\"/g; - $data =~ s/\(/\\\(/g; - $data =~ s/\)/\\\)/g; - $output .= qq("$data"); - } - else { - $output .= $o->[DATA]; - } - } - $self->_debug("get_bodystructure: reassembled output=$output"); - } - - { - local ($@); - $bs = eval { $class->new($output) }; - } - - $self->_debug( - "get_bodystructure: msg $msg returns: " . ( $bs || "UNDEF" ) ); - $bs; -} - -# Updated to handle embedded literal strings -sub get_envelope { - my ( $self, $msg ) = @_; - - # Envelope class is defined within BodyStructure - my $class = $self->_load_module("BodyStructure") or return undef; - $class .= "::Envelope"; - - my $out = $self->fetch( $msg, 'ENVELOPE' ) or return undef; - - my $bs = ""; - my $output = first { /ENVELOPE \(/i } @$out; - - unless ( $output =~ /$CRLF$/o ) { - $output = ''; - $self->_debug("get_envelope: reassembling original response"); - my $started = 0; - foreach my $o ( $self->_transaction ) { - next unless $self->_is_output_or_literal($o); - $started++ if $o->[DATA] =~ /ENVELOPE \(/i; - $started or next; - - if ( length($output) && $self->_is_literal($o) ) { - my $data = $o->[DATA]; - $data =~ s/"/\\"/g; - $data =~ s/\(/\\\(/g; - $data =~ s/\)/\\\)/g; - $output .= qq("$data"); - } - else { - $output .= $o->[DATA]; - } - } - $self->_debug("get_envelope: reassembled output=$output"); - } - - { - local ($@); - $bs = eval { $class->new($output) }; - } - - $self->_debug( "get_envelope: msg $msg returns: " . ( $bs || "UNDEF" ) ); - $bs; -} - -# fetch( [{option},] [$seq_set|ALL], @msg_data_items ) -# options: -# escaped => 0|1 # return Results or Escaped_results -sub fetch { - my $self = shift; - my $opt = ref( $_[0] ) eq "HASH" ? shift : {}; - my $what = shift || "ALL"; - - my $take = $what; - if ( $what eq 'ALL' ) { - my $msgs = $self->messages or return undef; - $take = $self->Range($msgs); - } - elsif ( ref $what || $what =~ /^[,:\d]+\w*$/ ) { - $take = $self->Range($what); - } - - my ( @data, $cmd ); - my ( $seq_set, @fetch_att ) = $self->_split_sequence( $take, "FETCH", @_ ); - - for ( my $x = 0 ; $x <= $#$seq_set ; $x++ ) { - my $seq = $seq_set->[$x]; - $self->_imap_uid_command( FETCH => $seq, @fetch_att, @_ ) - or return undef; - my $res = $opt->{escaped} ? $self->Escaped_results : $self->Results; - - # only keep last command and last response (* OK ...) - $cmd = shift(@$res); - pop(@$res) if ( $x != $#{$seq_set} ); - push( @data, @$res ); - } - - if ( $cmd and !wantarray ) { - $cmd =~ s/^(\d+\s+.*?FETCH\s+)\S+(\s*)/$1$take$2/; - unshift( @data, $cmd ); - } - - #wantarray ? $self->History : $self->Results; - return wantarray ? @data : \@data; -} - -# Some servers have a maximum command length. If Maxcommandlength is -# set, split a sequence to fit within the length restriction. -sub _split_sequence { - my ( $self, $take, @args ) = @_; - - # split take => sequence-set and (optional) fetch-att - my ( $seq, @att ) = split( / /, $take, 2 ); - - # use the entire sequence unless Maxcommandlength is set - my @seqs; - my $maxl = $self->Maxcommandlength; - if ($maxl) { - - # estimate command length, the sum of the lengths of: - # tag, command, fetch-att + $CRLF - push @args, $self->Transaction, $self->Uid ? "UID" : (), "\015\012"; - - # do not split on anything smaller than 64 chars - my $clen = length join( " ", @att, @args ); - my $diff = $maxl - $clen; - my $most = $diff > 64 ? $diff : 64; - - @seqs = ( $seq =~ m/(.{1,$most})(?:,|$)/g ) if defined $seq; - $self->_debug( "split_sequence: length($maxl-$clen) parts: ", - $#seqs + 1 ) - if ( $#seqs != 0 ); - } - else { - push( @seqs, $seq ) if defined $seq; - } - return \@seqs, @att; -} - -# fetch_hash( [$seq_set|ALL], @msg_data_items, [\%msg_by_ids] ) -# - TODO: make more efficient use of memory on large fetch results -sub fetch_hash { - my $self = shift; - my $uids = ref $_[-1] ? pop @_ : {}; - my @words = @_; - - # take an optional leading list of messages argument or default to - # ALL let fetch turn that list of messages into a msgref as needed - # fetch has similar logic for dealing with message list - my $msgs = 'ALL'; - if ( $words[0] ) { - if ( ref $words[0] ) { - $msgs = shift @words; - } - elsif ( $#words > 0 ) { - if ( $words[0] eq 'ALL' ) { - $msgs = shift @words; - } - elsif ( $words[0] =~ s/^([,:\d]+)\s*// ) { - $msgs = $1; - shift @words if $words[0] eq ""; - } - } - } - - # message list (if any) is now removed from @words - my $what = join( " ", @words ); - - # RFC 3501: - # fetch = "FETCH" SP sequence-set SP ("ALL" / "FULL" / "FAST" / - # fetch-att / "(" fetch-att *(SP fetch-att) ")") - my %macro = ( - "ALL" => [qw(FLAGS INTERNALDATE RFC822.SIZE ENVELOPE)], - "FULL" => [qw(FLAGS INTERNALDATE RFC822.SIZE ENVELOPE BODY)], - "FAST" => [qw(FLAGS INTERNALDATE RFC822.SIZE)], - ); - - if ( $macro{$what} ) { - @words = @{ $macro{$what} }; - } - else { - $what = "($what)"; - my @twords; - foreach my $word (@words) { - $word = uc($word); - - # server response to BODY[]<10.20> is a field named BODY[]<10> - if ( $word =~ /^BODY/ ) { - $word =~ s/<(\d+)\.\d+>$/<$1>/; - - # server response to BODY.PEEK[] is a field named BODY[] - # BUG? allow for BODY.PEEK in response (historical behavior) - if ( $word =~ /^BODY\.PEEK/ ) { - push( @twords, $word ); - $word =~ s/^BODY\.PEEK/BODY/; - } - } - unshift( @twords, $word ); - } - @words = @twords; - } - - my %words = map { $_ => 1 } @words; - - my $output = $self->fetch( $msgs, $what ) - or return undef; - - while ( my $l = shift @$output ) { - next if $l !~ m/^\*\s(\d+)\sFETCH\s\(/g; - my ( $mid, $entry ) = ( $1, {} ); - my ( $key, $value ); - ATTR: - while ( $l and $l !~ m/\G\s*\)\s*$/gc ) { - if ( $l =~ m/\G\s*([^\s\[]+(?:\[[^\]]*\])?(?:<[^>]*>)?)\s*/gc ) { - $key = uc($1); - } - elsif ( !defined $key ) { - - # some kind of malformed response - $self->LastError("Invalid item name in FETCH response: $l"); - return undef; - } - if ( $l =~ m/\G\s*$/gc ) { - $value = shift @$output; - $entry->{$key} = $value; - $l = shift @$output; - next ATTR; - } - elsif ( $l =~ m/\G(?:"(.*?)(?:(?{$key} = $value; - next ATTR; - } - elsif ( $l =~ m/\G\(/gc ) { - my $depth = 1; - $value = ""; - while ( $l =~ m/\G(\(|\)|[^()]+)/gc ) { - my $stuff = $1; - if ( $stuff eq "(" ) { - $depth++; - $value .= "("; - } - elsif ( $stuff eq ")" ) { - $depth--; - if ( $depth == 0 ) { - $entry->{$key} = $value; - next ATTR; - } - $value .= ")"; - } - else { - $value .= $stuff; - } - - # consume literal data if any - if ( $l =~ m/\G\s*$/gc and scalar(@$output) ) { - my $elit = $self->Escape( shift @$output ); - $l = shift @$output; - $value .= ( length($value) ? " " : "" ) . qq{"$elit"}; - } - } - $l =~ m/\G\s*/gc; - } - else { - $self->LastError("Invalid item value in FETCH response: $l"); - return undef; - } - } - - if ( $self->Uid ) { - $uids->{ $entry->{UID} } = $entry; - } - else { - $uids->{$mid} = $entry; - } - - # remove things not asked for (i.e. UID/$mid) - for my $word ( keys %$entry ) { - next if ( exists $words{$word} ); - delete $entry->{$word}; - } - } - - return wantarray ? %$uids : $uids; -} - -sub store { - my ( $self, @a ) = @_; - $self->_imap_uid_command( STORE => @a ) - or return undef; - return wantarray ? $self->History : $self->Results; -} - -sub _imap_folder_command($$@) { - my ( $self, $command ) = ( shift, shift ); - my $folder = $self->Massage(shift); - - $self->_imap_command( join ' ', $command, $folder, @_ ) - or return undef; - - return wantarray ? $self->History : $self->Results; -} - -sub subscribe($) { shift->_imap_folder_command( SUBSCRIBE => @_ ) } -sub unsubscribe($) { shift->_imap_folder_command( UNSUBSCRIBE => @_ ) } -sub create($) { shift->_imap_folder_command( CREATE => @_ ) } - -sub delete($) { - my $self = shift; - $self->_imap_folder_command( DELETE => @_ ) or return undef; - $self->Folder(undef); - return wantarray ? $self->History : $self->Results; -} - -# rfc2086 -sub myrights($) { $_[0]->_imap_folder_command( MYRIGHTS => $_[1] ) } - -sub close { - my $self = shift; - $self->_imap_command('CLOSE') - or return undef; - return wantarray ? $self->History : $self->Results; -} - -sub expunge { - my ( $self, $folder ) = @_; - - return undef unless ( defined $folder or defined $self->Folder ); - - my $old = defined $self->Folder ? $self->Folder : ''; - - if ( !defined($folder) || $folder eq $old ) { - $self->_imap_command('EXPUNGE') - or return undef; - } - else { - $self->select($folder) or return undef; - my $succ = $self->_imap_command('EXPUNGE'); - - # if $old eq '' IMAP4 select should close $folder without EXPUNGE - return undef unless ( $self->select($old) and $succ ); - } - - return wantarray ? $self->History : $self->Results; -} - -sub uidexpunge { - my ( $self, $msgspec ) = ( shift, shift ); - - return undef unless $self->has_capability("UIDPLUS"); - - my $msg = - UNIVERSAL::isa( $msgspec, 'Mail::IMAPClient::MessageSet' ) - ? $msgspec - : $self->Range($msgspec); - - $msg->cat(@_) if @_; - - if ( $self->Uid ) { - $self->_imap_command("UID EXPUNGE $msg") - or return undef; - } - else { - $self->LastError("Uid must be enabled for uidexpunge"); - return undef; - } - - return wantarray ? $self->History : $self->Results; -} - -sub rename { - my ( $self, $from, $to ) = @_; - - $from = ( $from eq "" ) ? qq("") : $self->Massage($from); - $to = ( $to eq "" ) ? qq("") : $self->Massage($to); - - $self->_imap_command(qq(RENAME $from $to)) ? $self : undef; -} - -sub status { - my ( $self, $folder ) = ( shift, shift ); - defined $folder or return undef; - - my $which = @_ ? join( " ", @_ ) : 'MESSAGES'; - - my $box = $self->Massage($folder); - $self->_imap_command("STATUS $box ($which)") - or return undef; - - return wantarray ? $self->History : $self->Results; -} - -sub flags { - my ( $self, $msgspec ) = ( shift, shift ); - my $msg = - UNIVERSAL::isa( $msgspec, 'Mail::IMAPClient::MessageSet' ) - ? $msgspec - : $self->Range($msgspec); - - $msg->cat(@_) if @_; - - # Send command - my $ref = $self->fetch( $msg, "FLAGS" ) or return undef; - - my $u_f = $self->Uid; - my $flagset = {}; - - # Parse results, setting entry in result hash for each line - foreach my $line (@$ref) { - $self->_debug("flags: line = '$line'"); - if ( - $line =~ /\* \s+ (\d+) \s+ FETCH \s+ # * nnn FETCH - \( - (?:\s* UID \s+ (\d+) \s* )? # optional: UID nnn - FLAGS \s* \( (.*?) \) \s* # FLAGS (\Flag1 \Flag2) - (?:\s* UID \s+ (\d+) \s* )? # optional: UID nnn - \) - /x - ) - { - my $mailid = $u_f ? ( $2 || $4 ) : $1; - $flagset->{$mailid} = [ split " ", $3 ]; - } - } - - # Or did he want a hash from msgid to flag array? - return $flagset - if ref $msgspec; - - # or did the guy want just one response? Return it if so - my $flagsref = $flagset->{$msgspec}; - return wantarray ? @$flagsref : $flagsref; -} - -# reduce a list, stripping undeclared flags. Flags with or without -# leading backslash. -sub supported_flags(@) { - my $self = shift; - my $sup = $self->Supportedflags - or return @_; - - return map { $sup->($_) } @_ - if ref $sup eq 'CODE'; - - grep { $sup->{ /^\\(\S+)/ ? lc $1 : () } } @_; -} - -sub parse_headers { - my ( $self, $msgspec, @fields ) = @_; - my $fields = join ' ', @fields; - my $msg = ref $msgspec eq 'ARRAY' ? $self->Range($msgspec) : $msgspec; - my $peek = !defined $self->Peek || $self->Peek ? '.PEEK' : ''; - - my $string = "$msg BODY$peek" - . ( $fields eq 'ALL' ? '[HEADER]' : "[HEADER.FIELDS ($fields)]" ); - - my $raw = $self->fetch($string) or return undef; - my $cmd = shift @$raw; - - my %headers; # message ids to headers - my $h; # fields for current msgid - my $field; # previous field name, for unfolding - my %fieldmap = map { ( lc($_) => $_ ) } @fields; - my $msgid; - - # BUG: parsing this way is prone to be buggy but works most of the time - # some example responses: - # * OK Message 1 no longer exists - # * 1 FETCH (UID 26535 BODY[HEADER] "") - # * 5 FETCH (UID 30699 BODY[HEADER] {1711} - # header: value... - foreach my $header ( map { split /$CR?$LF/o } @$raw ) { - - # Windows2003/Maillennium/others? have UID after headers - if ( - $header =~ s/^\* \s+ (\d+) \s+ FETCH \s+ - \( (.*?) BODY\[HEADER (?:\.FIELDS)? .*? \]\s*//ix - ) - { # start new message header - ( $msgid, my $msgattrs ) = ( $1, $2 ); - $h = {}; - if ( $self->Uid ) # undef when win2003 - { - $msgid = $msgattrs =~ m/\b UID \s+ (\d+)/x ? $1 : undef; - } - $headers{$msgid} = $h if $msgid; - } - $header =~ /\S/ or next; # skip empty lines. - - # ( for vi - if ( $header =~ /^\)/ ) { # end of this message - undef $h; # inbetween headers - next; - } - elsif ( !$msgid && $header =~ /^\s*UID\s+(\d+).*\)$/ ) { - $headers{$1} = $h; # found UID win2003/Maillennium - - undef $h; - next; - } - - unless ( defined $h ) { - $self->_debug("found data between fetch headers: $header"); - next; - } - - if ( $header and $header =~ s/^(\S+)\:\s*// ) { - $field = $fieldmap{ lc $1 } || $1; - push @{ $h->{$field} }, $header; - } - elsif ( $field and ref $h->{$field} eq 'ARRAY' ) { # folded header - $h->{$field}[-1] .= $header; - } - else { - - # show data if it is not like '"")' or '{123}' - $self->_debug("non-header data between fetch headers: $header") - if ( $header !~ /^(?:\s*\"\"\)|\{\d+\})$CR?$LF$/o ); - } - } - - # if we asked for one message, just return its hash, - # otherwise, return hash of numbers => header hash - ref $msgspec eq 'ARRAY' ? \%headers : $headers{$msgspec}; -} - -sub subject { $_[0]->get_header( $_[1], "Subject" ) } -sub date { $_[0]->get_header( $_[1], "Date" ) } -sub rfc822_header { shift->get_header(@_) } - -sub get_header { - my ( $self, $msg, $field ) = @_; - my $headers = $self->parse_headers( $msg, $field ); - $headers ? $headers->{$field}[0] : undef; -} - -sub recent_count { - my ( $self, $folder ) = ( shift, shift ); - - $self->status( $folder, 'RECENT' ) - or return undef; - - my $r = - first { s/\*\s+STATUS\s+.*\(RECENT\s+(\d+)\s*\)/$1/ } $self->History; - chomp $r; - $r; -} - -sub message_count { - my $self = shift; - my $folder = shift || $self->Folder; - - $self->status( $folder, 'MESSAGES' ) - or return undef; - - foreach my $result ( $self->Results ) { - return $1 if $result =~ /\(MESSAGES\s+(\d+)\s*\)/i; - } - - undef; -} - -sub recent() { shift->search('recent') } -sub seen() { shift->search('seen') } -sub unseen() { shift->search('unseen') } -sub messages() { shift->search('ALL') } - -sub sentbefore($$) { shift->_search_date( sentbefore => @_ ) } -sub sentsince($$) { shift->_search_date( sentsince => @_ ) } -sub senton($$) { shift->_search_date( senton => @_ ) } -sub since($$) { shift->_search_date( since => @_ ) } -sub before($$) { shift->_search_date( before => @_ ) } -sub on($$) { shift->_search_date( on => @_ ) } - -sub _search_date($$$) { - my ( $self, $how, $time ) = @_; - my $imapdate; - - if ( $time =~ /\d\d-\D\D\D-\d\d\d\d/ ) { - $imapdate = $time; - } - elsif ( $time =~ /^\d+$/ ) { - my @ltime = localtime $time; - $imapdate = sprintf( "%2.2d-%s-%4.4d", - $ltime[3], - $mnt[ $ltime[4] ], - $ltime[5] + 1900 ); - } - else { - $self->LastError("Invalid date format supplied for '$how': $time"); - return undef; - } - - $self->_imap_uid_command( SEARCH => $how, $imapdate ) - or return undef; - - my @hits; - foreach ( $self->History ) { - chomp; - s/$CR?$LF$//o; - s/^\*\s+SEARCH\s+//i or next; - push @hits, grep /\d/, split; - } - $self->_debug("Hits are: @hits"); - return wantarray ? @hits : \@hits; -} - -sub or { - my ( $self, @what ) = @_; - if ( @what < 2 ) { - $self->LastError("Invalid number of arguments passed to or()"); - return undef; - } - - my $or = "OR " - . $self->Massage( shift @what ) . " " - . $self->Massage( shift @what ); - - $or = "OR $or " . $self->Massage($_) for @what; - - $self->_imap_uid_command( SEARCH => $or ) - or return undef; - - my @hits; - foreach ( $self->History ) { - chomp; - s/$CR?$LF$//o; - s/^\*\s+SEARCH\s+//i or next; - push @hits, grep /\d/, split; - } - $self->_debug("Hits are now: @hits"); - - return wantarray ? @hits : \@hits; -} - -sub disconnect { shift->logout } - -sub _quote_search { - my ( $self, @args ) = @_; - my @ret; - foreach my $v (@args) { - if ( ref($v) eq "SCALAR" ) { - push( @ret, $$v ); - } - elsif ( exists $SEARCH_KEYS{ uc($v) } ) { - push( @ret, $v ); - } - elsif ( @args == 1 ) { - push( @ret, $v ); # <3.17 compat: caller responsible for quoting - } - else { - push( @ret, $self->Quote($v) ); - } - } - return @ret; -} - -sub search { - my ( $self, @args ) = @_; - - @args = $self->_quote_search(@args); - - $self->_imap_uid_command( SEARCH => @args ) - or return undef; - - my @hits; - foreach ( $self->History ) { - chomp; - s/$CR?$LF$//o; - s/^\*\s+SEARCH\s+(?=.*?\d)// or next; - push @hits, grep /^\d+$/, split; - } - - @hits - or $self->_debug("Search successful but found no matching messages"); - - # return empty list - return - wantarray ? @hits - : !@hits ? \@hits - : $self->Ranges ? $self->Range( \@hits ) - : \@hits; -} - -# returns a Thread data structure -my $thread_parser; - -sub thread { - my $self = shift; - - return undef unless defined $self->has_capability("THREAD=REFERENCES"); - my $algorythm = shift - || ( - $self->has_capability("THREAD=REFERENCES") - ? 'REFERENCES' - : 'ORDEREDSUBJECT' - ); - - my $charset = shift || 'UTF-8'; - my @a = @_ ? @_ : 'ALL'; - - $a[-1] = $self->Massage( $a[-1], 1 ) - if @a > 1 && !exists $SEARCH_KEYS{ uc $a[-1] }; - - $self->_imap_uid_command( THREAD => $algorythm, $charset, @a ) - or return undef; - - unless ($thread_parser) { - return if ( defined($thread_parser) and $thread_parser == 0 ); - - my $class = $self->_load_module("Thread"); - unless ($class) { - $thread_parser = 0; - return undef; - } - $thread_parser = $class->new; - } - - my $thread; - foreach ( $self->History ) { - /^\*\s+THREAD\s+/ or next; - s/$CR?$LF|$LF+/ /og; - $thread = $thread_parser->start($_); - } - - unless ($thread) { - $self->LastError( -"Thread search completed successfully but found no matching messages" - ); - return undef; - } - - $thread; -} - -sub delete_message { - my $self = shift; - my @msgs = map { ref $_ eq 'ARRAY' ? @$_ : split /\,/ } @_; - - $self->store( join( ',', @msgs ), '+FLAGS.SILENT', '(\Deleted)' ) - ? scalar @msgs - : undef; -} - -sub restore_message { - my $self = shift; - my $msgs = join ',', map { ref $_ eq 'ARRAY' ? @$_ : split /\,/ } @_; - - $self->store( $msgs, '-FLAGS', '(\Deleted)' ) or return undef; - scalar grep /^\*\s\d+\sFETCH\s\(.*FLAGS.*(?!\\Deleted)/, $self->Results; -} - -sub uidvalidity { - my ( $self, $folder ) = @_; - $self->status( $folder, "UIDVALIDITY" ) or return undef; - my $line = first { /UIDVALIDITY/i } $self->History; - defined $line && $line =~ /\(UIDVALIDITY\s+([^\)]+)/ ? $1 : undef; -} - -sub uidnext { - my ( $self, $folder ) = @_; - $self->status( $folder, "UIDNEXT" ) or return undef; - my $line = first { /UIDNEXT/i } $self->History; - defined $line && $line =~ /\(UIDNEXT\s+([^\)]+)/ ? $1 : undef; -} - -sub capability { - my $self = shift; - - if ( $self->{CAPABILITY} ) { - my @caps = keys %{ $self->{CAPABILITY} }; - return wantarray ? @caps : \@caps; - } - - $self->_imap_command('CAPABILITY') - or return undef; - - my @caps = map { split } grep s/^\*\s+CAPABILITY\s+//, $self->History; - foreach (@caps) { - $self->{CAPABILITY}{ uc $_ }++; - $self->{ uc $1 } = uc $2 if /(.*?)\=(.*)/; - } - - return wantarray ? @caps : \@caps; -} - -# use "" not undef when lookup fails to differentiate imap command -# failure vs lack of capability -sub has_capability { - my ( $self, $which ) = @_; - $self->capability or return undef; - $which ? $self->{CAPABILITY}{ uc $which } : ""; -} - -sub imap4rev1 { - my $self = shift; - return $self->{_IMAP4REV1} if exists $self->{_IMAP4REV1}; - $self->{_IMAP4REV1} = $self->has_capability('IMAP4REV1'); -} - -#??? what a horror! -sub namespace { - - # Returns a nested list as follows: - # [ - # [ - # [ $user_prefix, $user_delim ] (,[$user_prefix2 ,$user_delim ],...), - # ], - # [ - # [ $shared_prefix,$shared_delim] (,[$shared_prefix2,$shared_delim],... ), - # ], - # [ - # [$public_prefix, $public_delim] (,[$public_prefix2,$public_delim],...), - # ], - # ]; - - my $self = shift; - unless ( $self->has_capability("NAMESPACE") ) { - $self->LastError( "NO NAMESPACE not supported by " . $self->Server ) - unless $self->LastError; - return undef; - } - - my $got = $self->_imap_command("NAMESPACE") or return undef; - my @namespaces = map { /^\* NAMESPACE (.*)/ ? $1 : () } $got->Results; - - my $namespace = shift @namespaces; - $namespace =~ s/$CR?$LF$//o; - - my ( $personal, $shared, $public ) = $namespace =~ m# - (NIL|\((?:\([^\)]+\)\s*)+\))\s - (NIL|\((?:\([^\)]+\)\s*)+\))\s - (NIL|\((?:\([^\)]+\)\s*)+\)) - #xi; - - my @ns; - $self->_debug("NAMESPACE: pers=$personal, shared=$shared, pub=$public"); - foreach ( $personal, $shared, $public ) { - uc $_ ne 'NIL' or next; - s/^\((.*)\)$/$1/; - - my @pieces = m#\(([^\)]*)\)#g; - $self->_debug("NAMESPACE pieces: @pieces"); - - push @ns, [ map { [m#"([^"]*)"\s*#g] } @pieces ]; - } - - return wantarray ? @ns : \@ns; -} - -sub internaldate { - my ( $self, $msg ) = @_; - $self->_imap_uid_command( FETCH => $msg, 'INTERNALDATE' ) - or return undef; - my $hist = join '', $self->History; - return $hist =~ /\bINTERNALDATE "([^"]*)"/i ? $1 : undef; -} - -sub is_parent { - my ( $self, $folder ) = ( shift, shift ); - my $list = $self->list( undef, $folder ) or return undef; - - my $attrs; - foreach my $resp (@$list) { - my $rec = $self->_list_or_lsub_response_parse($resp); - next unless defined $rec->{attrs}; - return 0 if $rec->{attrs} =~ /\bNoInferior\b/i; - $attrs = $rec->{attrs}; - } - - if ($attrs) { - return 1 if $attrs =~ /HasChildren/i; - return 0 if $attrs =~ /HasNoChildren/i; - } - else { - $self->_debug( join( "\n\t", "no attrs for '$folder' in:", @$list ) ); - } - - # BUG? This may be overkill for normal use cases... - # flag not supported or not returned for some reason, try via folders() - my $sep = $self->separator($folder) || $self->separator(undef); - return undef unless defined $sep; - - my $lead = $folder . $sep; - my $len = length $lead; - scalar grep { $lead eq substr( $_, 0, $len ) } $self->folders; -} - -sub selectable { - my ( $self, $f ) = @_; - my $info = $self->list( "", $f ) or return undef; - return not( grep /\b\\Noselect\b/i, @$info ); -} - -# append( $self, $folder, $text [, $optmsg] ) -# - conserve memory and use $_[0] to avoid copying $text (it may be huge!) -# - BUG?: should deprecate this method in favor of append_string -sub append { - my $self = shift; - my $folder = shift; - - # $message_string is whatever is left in @_ - $self->append_string( $folder, ( @_ > 1 ? join( $CRLF, @_ ) : $_[0] ) ); -} - -sub _clean_flags { - my ( $self, $flags ) = @_; - $flags =~ s/^\s+//; - $flags =~ s/\s+$//; - $flags = "($flags)" if $flags !~ /^\(.*\)$/; - return $flags; -} - -# RFC 3501: date-day-fixed = (SP DIGIT) / 2DIGIT -sub _clean_date { - my ( $self, $date ) = @_; - $date =~ s/^\s+// if $date !~ /^\s\d/; - $date =~ s/\s+$//; - $date = qq("$date") if $date !~ /^"/; - return $date; -} - -sub _append_command { - my ( $self, $folder, $flags, $date, $length ) = @_; - return join( " ", - "APPEND $folder", - ( $flags ? $flags : () ), - ( $date ? $date : () ), - "{" . $length . "}", - ); -} - -# append_string( $self, $folder, $text, $flags, $date ) -# - conserve memory and use $_[2] to avoid copying $text (it may be huge!) -sub append_string($$$;$$) { - my ( $self, $folder, $flags, $date ) = @_[ 0, 1, 3, 4 ]; - - #my $text = $_[2]; # conserve memory and use $_[2] instead! - my $maxl = $self->Maxappendstringlength; - - # on "large" strings use append_file to conserve memory - if ( $_[2] and $maxl and length( $_[2] ) > $maxl ) { - $self->_debug("append_string: using in memory file"); - return $self->append_file( $folder, \( $_[2] ), undef, $flags, $date ); - } - - my $text = defined( $_[2] ) ? $_[2] : ''; - - $folder = $self->Massage($folder); - $flags = $self->_clean_flags($flags) if ( defined $flags ); - $date = $self->_clean_date($date) if ( defined $date ); - $text =~ s/\r?\n/$CRLF/og; - - my $cmd = $self->_append_command( $folder, $flags, $date, length($text) ); - $cmd .= $CRLF . $text . $CRLF; - - $self->_imap_command( { addcrlf => 0 }, $cmd ) or return undef; - - my $data = join '', $self->Results; - - # look for something like return size or self if no size found: - # OK [APPENDUID ] APPEND completed - my $ret = $data =~ m#\s+(\d+)\]# ? $1 : $self; - - return $ret; -} - -# BUG?: not much/any savings on cygwin perl 5.10 when using in memory file -# BUG?: we do not retry if sending data fails after getting the OK to send -sub append_file { - my ( $self, $folder, $file, $control, $flags, $date ) = @_; - - my @err; - push( @err, "folder not specified" ) - unless ( defined($folder) and $folder ne "" ); - - my $fh; - if ( !defined($file) ) { - push( @err, "file not specified" ); - } - elsif ( ref($file) and ref($file) ne "SCALAR" ) { - $fh = $file; # let the caller pass in their own file handle directly - } - elsif ( !ref($file) and !-f $file ) { - push( @err, "file '$file' not found" ); - } - else { - - # $file can be a name or a scalar reference (for in memory file) - # avoid IO::File bug handling scalar refs in perl <= 5.8.8? - # - buggy: $fh = IO::File->new( $file, 'r' ) - local ($!); - open( $fh, "<", $file ) - or push( @err, "Unable to open file '$file': $!" ); - } - - if (@err) { - $self->LastError( join( ", ", @err ) ); - return undef; - } - - binmode($fh); - - $folder = $self->Massage($folder) if ( defined $folder ); - $flags = $self->_clean_flags($flags) if ( defined $flags ); - - # allow the date to be specified or even use mtime on file - if ($date) { - $date = $self->Rfc3501_datetime( ( stat($fh) )[9] ) if ( $date eq "1" ); - $date = $self->_clean_date($date); - } - - # BUG? seems wasteful to do this always, provide a "fast path" option? - my $length = 0; - { - local $/ = "\n"; # just in case global is not default - while ( my $line = <$fh> ) { # do no read the whole file at once! - $line =~ s/\r?\n$/$CRLF/; - $length += length($line); - } - seek( $fh, 0, 0 ); - } - - my $cmd = $self->_append_command( $folder, $flags, $date, $length ); - my $rc = $self->_imap_command( $cmd, '+' ); - unless ($rc) { - $self->LastError( "Error sending '$cmd': " . $self->LastError ); - return undef; - } - - # Now send the message itself - my ( $buffer, $buflen ) = ( "", 0 ); - until ( !$buflen and eof($fh) ) { - - if ( $buflen < APPEND_BUFFER_SIZE ) { - FILLBUFF: - while ( my $line = <$fh> ) { - $line =~ s/\r?\n$/$CRLF/; - $buffer .= $line; - $buflen = length($buffer); - last FILLBUFF if ( $buflen >= APPEND_BUFFER_SIZE ); - } - } - - # exit loop entirely if we are out of data - last unless $buflen; - - # save anything over desired buffer size for next iteration - my $savebuff = - ( $buflen > APPEND_BUFFER_SIZE ) - ? substr( $buffer, APPEND_BUFFER_SIZE ) - : undef; - - # reduce buffer to desired size - $buffer = substr( $buffer, 0, APPEND_BUFFER_SIZE ); - - my $bytes_written = $self->_send_bytes( \$buffer ); - unless ($bytes_written) { - $self->LastError( "Error appending message: " . $self->LastError ); - return undef; - } - - # retain any saved data and continue loop - $buffer = defined($savebuff) ? $savebuff : ""; - $buflen = length($buffer); - } - - # finish off append - unless ( $self->_send_bytes( \$CRLF ) ) { - $self->LastError( "Error appending CRLF: " . $self->LastError ); - return undef; - } - - # Now for the crucial test: Did the append work or not? - # look for " (OK|BAD|NO)" - my $code = $self->_get_response( $self->Count ) or return undef; - - if ( $code eq 'OK' ) { - my $data = join '', $self->Results; - - # look for something like return size or self if no size found: - # OK [APPENDUID ] APPEND completed - my $ret = $data =~ m#\s+(\d+)\]# ? $1 : $self; - - return $ret; - } - else { - return undef; - } -} - -# BUG? we should retry if "socket closed while..." but do not currently -sub authenticate { - my ( $self, $scheme, $response ) = @_; - $scheme ||= $self->Authmechanism; - $response ||= $self->Authcallback; - my $clear = $self->Clear; - $self->Clear($clear) - if $self->Count >= $clear && $clear > 0; - - if ( !$scheme ) { - $self->LastError("Authmechanism not set"); - return undef; - } - elsif ( $scheme eq 'LOGIN' ) { - $self->LastError("Authmechanism LOGIN is invalid, use login()"); - return undef; - } - - my $string = "AUTHENTICATE $scheme"; - - # use _imap_command for retry mechanism... - $self->_imap_command( $string, '+' ) or return undef; - - my $count = $self->Count; - my $code; - - # look for "+ " or just "+" - foreach my $line ( $self->Results ) { - if ( $line =~ /^\+\s*(.*?)\s*$/ ) { - $code = $1; - last; - } - } - - # BUG? use _load_module for these too? - if ( $scheme eq 'CRAM-MD5' ) { - $response ||= sub { - my ( $code, $client ) = @_; - require Digest::HMAC_MD5; - my $hmac = - Digest::HMAC_MD5::hmac_md5_hex( decode_base64($code), - $client->Password ); - encode_base64( $client->User . " " . $hmac, '' ); - }; - } - elsif ( $scheme eq 'DIGEST-MD5' ) { - $response ||= sub { - my ( $code, $client ) = @_; - require Authen::SASL; - require Digest::MD5; - - my $authname = - defined $client->Authuser ? $client->Authuser : $client->User; - - my $sasl = Authen::SASL->new( - mechanism => 'DIGEST-MD5', - callback => { - user => $client->User, - pass => $client->Password, - authname => $authname - } - ); - - # client_new is an empty function for DIGEST-MD5 - my $conn = $sasl->client_new( 'imap', 'localhost', '' ); - my $answer = $conn->client_step( decode_base64 $code); - - encode_base64( $answer, '' ) - if defined $answer; - }; - } - elsif ( $scheme eq 'PLAIN' ) { # PLAIN SASL - $response ||= sub { - my ( $code, $client ) = @_; - encode_base64( # [authname] user password - join( - chr(0), - defined $client->Proxy - ? ( $client->User, $client->Proxy ) - : ( "", $client->User ), - defined $client->Password ? $client->Password : "", - ), - '' - ); - }; - } - elsif ( $scheme eq 'NTLM' ) { - $response ||= sub { - my ( $code, $client ) = @_; - - require Authen::NTLM; - Authen::NTLM::ntlm_user( $client->User ); - Authen::NTLM::ntlm_password( $client->Password ); - Authen::NTLM::ntlm_domain( $client->Domain ) if $client->Domain; - Authen::NTLM::ntlm($code); - }; - } - - my $resp = $response->( $code, $self ); - unless ( defined($resp) ) { - $self->LastError( "Error getting $scheme data: " . $self->LastError ); - return undef; - } - unless ( $self->_send_line($resp) ) { - $self->LastError( "Error sending $scheme data: " . $self->LastError ); - return undef; - } - - # this code may be a little too custom to try and use _get_response() - # look for "+ " (not just "+") otherwise " (OK|BAD|NO)" - undef $code; - until ($code) { - my $output = $self->_read_line or return undef; - foreach my $o (@$output) { - $self->_record( $count, $o ); - $code = $o->[DATA] =~ /^\+\s+(.*?)\s*$/ ? $1 : undef; - - if ($code) { - unless ( $self->_send_line( $response->( $code, $self ) ) ) { - $self->LastError( - "Error sending $scheme data: " . $self->LastError ); - return undef; - } - undef $code; # clear code as we are not finished yet - } - - if ( $o->[DATA] =~ /^$count\s+(OK|NO|BAD)\b/i ) { - $code = uc($1); - $self->LastError( $o->[DATA] ) unless ( $code eq 'OK' ); - } - elsif ( $o->[DATA] =~ /^\*\s+BYE/ ) { - $self->State(Unconnected); - $self->LastError( $o->[DATA] ); - return undef; - } - } - } - - return undef unless $code eq 'OK'; - - Authen::NTLM::ntlm_reset() - if $scheme eq 'NTLM'; - - $self->State(Authenticated); - return $self; -} - -# UIDPLUS response from a copy: [COPYUID (uidvalidity) (origuid) (newuid)] -sub copy { - my ( $self, $target, @msgs ) = @_; - - my $msgs = - $self->Ranges - ? $self->Range(@msgs) - : join ',', map { ref $_ ? @$_ : $_ } @msgs; - - $self->_imap_uid_command( COPY => $msgs, $self->Massage($target) ) - or return undef; - - my @results = $self->History; - - my @uids; - foreach (@results) { - chomp; - s/$CR?$LF$//o; - s/^.*\[COPYUID\s+\d+\s+[\d:,]+\s+([\d:,]+)\].*/$1/ or next; - push @uids, /(\d+):(\d+)/ ? ( $1 ... $2 ) : ( split /\,/ ); - - } - return @uids ? join( ",", @uids ) : $self; -} - -sub move { - my ( $self, $target, @msgs ) = @_; - - $self->exists($target) - or $self->create($target) && $self->subscribe($target); - - my $uids = - $self->copy( $target, map { ref $_ eq 'ARRAY' ? @$_ : $_ } @msgs ) - or return undef; - - unless ( $self->delete_message(@msgs) ) { - local ($!); # old versions of Carp could reset $! - carp $self->LastError; - } - - return $uids; -} - -sub set_flag { - my ( $self, $flag, @msgs ) = @_; - @msgs = @{ $msgs[0] } if ref $msgs[0] eq 'ARRAY'; - $flag = "\\$flag" - if $flag =~ /^(?:Answered|Flagged|Deleted|Seen|Draft)$/i; - - my $which = $self->Ranges ? $self->Range(@msgs) : join( ',', @msgs ); - return $self->store( $which, '+FLAGS.SILENT', "($flag)" ); -} - -sub see { - my ( $self, @msgs ) = @_; - @msgs = @{ $msgs[0] } if ref $msgs[0] eq 'ARRAY'; - return $self->set_flag( '\\Seen', @msgs ); -} - -sub mark { - my ( $self, @msgs ) = @_; - @msgs = @{ $msgs[0] } if ref $msgs[0] eq 'ARRAY'; - return $self->set_flag( '\\Flagged', @msgs ); -} - -sub unmark { - my ( $self, @msgs ) = @_; - @msgs = @{ $msgs[0] } if ref $msgs[0] eq 'ARRAY'; - return $self->unset_flag( '\\Flagged', @msgs ); -} - -sub unset_flag { - my ( $self, $flag, @msgs ) = @_; - @msgs = @{ $msgs[0] } if ref $msgs[0] eq 'ARRAY'; - - $flag = "\\$flag" - if $flag =~ /^(?:Answered|Flagged|Deleted|Seen|Draft)$/i; - - return $self->store( join( ",", @msgs ), "-FLAGS.SILENT ($flag)" ); -} - -sub deny_seeing { - my ( $self, @msgs ) = @_; - @msgs = @{ $msgs[0] } if ref $msgs[0] eq 'ARRAY'; - return $self->unset_flag( '\\Seen', @msgs ); -} - -sub size { - my ( $self, $msg ) = @_; - my $data = $self->fetch( $msg, "(RFC822.SIZE)" ) or return undef; - - # beware of response like: * NO Cannot open message $msg - my $cmd = shift @$data; - my $err; - foreach my $line (@$data) { - return $1 if ( $line =~ /RFC822\.SIZE\s+(\d+)/ ); - $err = $line if ( $line =~ /\* NO\b/ ); - } - - if ($err) { - my $info = "$err was returned for $cmd"; - $info =~ s/$CR?$LF//og; - $self->LastError($info); - } - elsif ( !$self->LastError ) { - my $info = "no RFC822.SIZE found in: " . join( " ", @$data ); - $self->LastError($info); - } - return undef; -} - -sub getquotaroot { - my ( $self, $what ) = @_; - my $who = $what ? $self->Massage($what) : "INBOX"; - return $self->_imap_command("GETQUOTAROOT $who") ? $self->Results : undef; -} - -# BUG? using user/$User here and INBOX in quota/quota_usage -sub getquota { - my ( $self, $what ) = @_; - my $who = $what ? $self->Massage($what) : "user/" . $self->User; - return $self->_imap_command("GETQUOTA $who") ? $self->Results : undef; -} - -# usage: $self->setquota($quotaroot, storage => 512, ...) -sub setquota(@) { - my ( $self, $what ) = ( shift, shift ); - my $who = $what ? $self->Massage($what) : "user/" . $self->User; - my @limits; - while (@_) { - my ( $k, $v ) = ( $self->Quote( uc( shift @_ ) ), shift @_ ); - push( @limits, "($k $v)" ); - } - my $limits = join( ' ', @limits ); - $self->_imap_command("SETQUOTA $who $limits") ? $self->Results : undef; -} - -sub quota { - my ( $self, $what ) = ( shift, shift || "INBOX" ); - my $tref = $self->getquota($what) or return undef; - shift @$tref; # pop off command - return ( map { /.*STORAGE\s+\d+\s+(\d+).*\n$/ ? $1 : () } @$tref )[0]; -} - -sub quota_usage { - my ( $self, $what ) = ( shift, shift || "INBOX" ); - my $tref = $self->getquota($what) or return undef; - shift @$tref; # pop off command - return ( map { /.*STORAGE\s+(\d+)\s+\d+.*\n$/ ? $1 : () } @$tref )[0]; -} - -sub Quote($) { $_[0]->Massage( $_[1], NonFolderArg ) } - -# rfc3501: -# atom-specials = "(" / ")" / "{" / SP / CTL / list-wildcards / -# quoted-specials / resp-specials -# list-wildcards = "%" / "*" -# quoted-specials = DQUOTE / "\" -# resp-specials = "]" -# rfc2060: -# CTL ::= -# Paranoia/safety: -# encode strings with "}" / "[" / "]" / non-ascii chars -sub Massage($;$) { - my ( $self, $name, $notFolder ) = @_; - $name =~ s/^\"(.*)\"$/$1/s unless $notFolder; - - if ( $name =~ /["\\[:^ascii:][:cntrl:]]/s ) { - return "{" . length($name) . "}" . $CRLF . $name; - } - elsif ( $name =~ /[(){}\s%*\[\]]/s ) { - return qq("$name"); - } - else { - return $name; - } -} - -sub unseen_count { - my ( $self, $folder ) = ( shift, shift ); - $folder ||= $self->Folder; - $self->status( $folder, 'UNSEEN' ) or return undef; - - my $r = - first { s/\*\s+STATUS\s+.*\(UNSEEN\s+(\d+)\s*\)/$1/ } $self->History; - - $r =~ s/\D//g; - return $r; -} - -sub State($) { - my ( $self, $state ) = @_; - - if ( defined $state ) { - $self->{State} = $state; - - # discard cached capability info after authentication - delete $self->{CAPABILITY} if ( $state == Authenticated ); - } - - return defined( $self->{State} ) ? $self->{State} : Unconnected; -} - -sub Status { shift->State } -sub IsUnconnected { shift->State == Unconnected } -sub IsConnected { shift->State >= Connected } -sub IsAuthenticated { shift->State >= Authenticated } -sub IsSelected { shift->State == Selected } - -# The following private methods all work on an output line array. -# _data returns the data portion of an output array: -sub _data { ref $_[1] && defined $_[1]->[TYPE] ? $_[1]->[DATA] : undef } - -# _index returns the index portion of an output array: -sub _index { ref $_[1] && defined $_[1]->[TYPE] ? $_[1]->[INDEX] : undef } - -# _type returns the type portion of an output array: -sub _type { ref $_[1] && $_[1]->[TYPE] } - -# _is_literal returns true if this is a literal: -sub _is_literal { ref $_[1] && $_[1]->[TYPE] && $_[1]->[TYPE] eq 'LITERAL' } - -# _is_output_or_literal returns true if this is an -# output line (or the literal part of one): - -sub _is_output_or_literal { - ref $_[1] - && defined $_[1]->[TYPE] - && ( $_[1]->[TYPE] eq "OUTPUT" || $_[1]->[TYPE] eq "LITERAL" ); -} - -# _is_output returns true if this is an output line: -sub _is_output { ref $_[1] && $_[1]->[TYPE] && $_[1]->[TYPE] eq "OUTPUT" } - -# _is_input returns true if this is an input line: -sub _is_input { ref $_[1] && $_[1]->[TYPE] && $_[1]->[TYPE] eq "INPUT" } - -# _next_index returns next_index for a transaction; may legitimately -# return 0 when successful. -sub _next_index { my $r = $_[0]->_transaction( $_[1] ); $r } - -sub Range { - my ( $self, $targ ) = ( shift, shift ); - - UNIVERSAL::isa( $targ, 'Mail::IMAPClient::MessageSet' ) - ? $targ->cat(@_) - : Mail::IMAPClient::MessageSet->new( $targ, @_ ); -} - -1; diff --git a/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient.pod b/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient.pod deleted file mode 100644 index 5dce129..0000000 --- a/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient.pod +++ /dev/null @@ -1,3938 +0,0 @@ -=head1 NAME - -Mail::IMAPClient - An IMAP Client API - -=head1 SYNOPSIS - - use Mail::IMAPClient; - - my $imap = Mail::IMAPClient->new( - Server => 'localhost', - User => 'username', - Password => 'password', - Ssl => 1, - Uid => 1, - ); - - my $folders = $imap->folders - or die "List folders error: ", $imap->LastError, "\n"; - print "Folders: @$folders\n"; - - $imap->select( $Opt{folder} ) - or die "Select '$Opt{folder}' error: ", $imap->LastError, "\n"; - - $imap->fetch_hash("FLAGS", "INTERNALDATE", "RFC822.SIZE") - or die "Fetch hash '$Opt{folder}' error: ", $imap->LastError, "\n"; - - $imap->logout - or die "Logout error: ", $imap->LastError, "\n"; - -=head1 DESCRIPTION - -This module provides methods implementing the IMAP protocol to support -interacting with IMAP message stores. - -The module is used by constructing or instantiating a new IMAPClient -object via the L constructor method. Once the object has been -instantiated, the L method is either implicitly or -explicitly called. At that point methods are available that implement -the IMAP client commands as specified in B. When processing -is complete, the L object method should be called. - -This documentation is not meant to be a replacement for RFC3501 nor -any other IMAP related RFCs. - -Note that this documentation uses the term I in place of -RFC3501's use of I. This documentation reserves the use of -the term I to refer to the set of folders owned by a specific -IMAP id. - -=head2 Connection State - -RFC3501 defines four possible states for an IMAP connection: not -authenticated, authenticated, selected, and logged out. These -correspond to the IMAPClient constants C, C, -C, and C, respectively. These constants can be -used in conjunction with the L method to determine the status -of an IMAPClient object and its underlying IMAP session. - -Note that an IMAPClient object can be in the C state both -before a server connection is made and after it has ended. This -differs slightly from RFC3501, which does not define a pre-connection -status. For a discussion of the methods available for examining the -IMAPClient object's status, see the section labeled -L, below. - -=head2 Advanced Authentication Mechanisms - -RFC3501 defines two commands for authenticating to an IMAP server: - -=over 4 - -=item LOGIN - -LOGIN is for plain text authentication. - -=item AUTHENTICATE - -AUTHENTICATE for more advanced and/or secure authentication mechanisms. - -=back - -Mail::IMAPClient supports the following AUTHENTICATE mechanisms: - -=over 4 - -=item DIGEST-MD5 - -DIGEST-MD5 authentication requires the L and -L modules. See also L. - -=item CRAM-MD5 - -CRAM-MD5 requires the L module. - -=item PLAIN (SASL) - -PLAIN (SASL) authentication allows the optional use of the L -parameter. RFC 4616 documents this syntax for SASL PLAIN: - - message = [authzid] UTF8NUL authcid UTF8NUL passwd - -When L is defined, L is used as 'authzid' and L -is used as 'authcid'. Otherwise, L is used as 'authcid'. - -=item NTLM - -NTLM authentication requires the L module. See also -L. - -=back - -=head2 Errors - -If you attempt an operation that results in an error, then you can -retrieve the text of the error message by using the L -method. However, the L method is an object method (not a -class method) and can only be used once an object is successfully -created. In cases where an object is not successfully created the -C<$@> variable is set with an error message. - -Mail::IMAPClient resets C<$@> and L to undef before most -IMAP requests, so the values only have a short lifespan. -L will always contain error info from the last error, -until another error is encountered, another IMAP command is issued or -it is explicitly cleared. - -Please note that the use of C<$@> is subject to change in the future -release so it is best to use L for error checking once a -Mail::IMAPClient object has been created. - -Errors in the L method can prevent your object from ever being -created. If the L, L, and L parameters are -supplied to L, it will attempt to call L and -L. Any of these methods could fail and cause the L -method call to return C and leaving the variable C<$@> is set -to an error message. - -WARNING: (due to historical API behavior) on errors, many methods may -return undef regardless of LIST/SCALAR context. Therefore, it may be -wise to use most methods in a scalar context. Regardless, check -L for details on errors. - -=head2 Transactions - -RFC3501 requires that each line in an IMAP conversation be prefixed -with a tag. A typical conversation consists of the client issuing a -tag-prefixed command string, and the server replying with one of more -lines of output. Those lines of output will include a command -completion status code prefixed by the same tag as the original -command string. - -The IMAPClient module uses a simple counter to ensure that each client -command is issued with a unique tag value. This tag value is referred -to by the IMAPClient module as the transaction number. A history is -maintained by the IMAPClient object documenting each transaction. The -L method returns the number of the last transaction, and -can be used to retrieve lines of text from the object's history. - -The L parameter is used to control the size of the session -history so that long-running sessions do not eat up unreasonable -amounts of memory. See the discussion of L parameter for more -information. - -The L transaction returns the history of the entire IMAP -session since the initial connection or for the last L -transactions. This provides a record of the entire conversation, -including client command strings and server responses, and is a -wonderful debugging tool as well as a useful source of raw data for -custom parsing. - -=head1 CLASS METHODS - -There are a couple of methods that can be invoked as class methods. -Generally they can be invoked as an object method as well. Note that -if the L method is called as an object method, the object -returned is identical to what have would been returned if L had -been called as a class method. It doesn't give you a copy of the -original object. - -=head2 new - -Example: - - my $imap = Mail::IMAPClient->new(%args) - or die "new failed: $@\n"; - -The L method creates a new instance of an IMAPClient object. - -If the L parameter is passed as an argument to B, then -B will implicitly call the L method, placing the new -object in the I state. If L and L values -are also provided, then L will in turn call L, and -the resulting object will be returned from B in the -I state. - -If the L parameter is not supplied then the IMAPClient -object is created in the I state. - -If the B method is passed arguments then those arguments will be -treated as a list of key=>value pairs. The key should be one of the -parameters as documented under L below. - -Here are some examples: - - use Mail::IMAPClient; - - # returns an unconnected Mail::IMAPClient object: - my $imap = Mail::IMAPClient->new; - # ... - # intervening code using the 1st object, then: - # (returns a new, authenticated Mail::IMAPClient object) - $imap = Mail::IMAPClient->new( - Server => $host, - User => $id, - Password => $pass, - Clear => 5, # Unnecessary since '5' is the default - # ... # Other key=>value pairs go here - ) - or die "Cannot connect to $host as $id: $@"; - -See also L, L and L for more -information on how to manually connect and login after B. - -=head2 Quote - -Example: - - $imap->search( HEADER => 'Message-id' => \$imap->Quote($msg_id) ); - -The B method accepts a value as an argument and returns its -argument as a correctly quoted string or a literal string. Since -version 3.17 Mail::IMAPClient automatically quotes search arguments we -use a SCALARREF so search will not modify or re-quote the value -returned by B. - -Note this method should not be used on folder names for -Mail::IMAPClient methods, since methods that accept folder names as an -argument will quote the folder name arguments appropriately -automatically. - -If you are getting unexpected results when running methods with values -that have (or might have) embedded spaces, double quotes, braces, or -parentheses, then calling B may be necessary. This method -should B be used with arguments that are wrapped in quotes or -parens if those quotes or parens are required by RFC3501. For -example, if the RFC requires an argument in this format: - - ( argument ) - -and the argument is (or might be) "pennies (from heaven)", then one -could use: - - $argument = "(" . $imap->Quote($argument) . ")" - -Of course, the fact that sometimes these characters are sometimes -required delimiters is precisely the reason you must quote them when -they are I delimiting. - -However, there are times when a method fails unexpectedly and may -require the use of B to work. Should this happen, you can -probably file a bug/enhancement request for Mail::IMAPClient to -safeguard the particular call/case better. - -An example is RFC822 Message-id's, which I don't contain -quotes or parens. When dealing with these it is usually best to take -proactive, defensive measures from the very start and use B. - -=head2 Range - -Example: - - my $parsed = $imap->parse_headers( - $imap->Range( $imap->messages ), "Date", "Subject" - ); - -The B method will condense a list of message sequence numbers -or message UID's into the most compact format supported by RFC3501. -It accepts one or more arguments, each of which can be: - -=over 4 - -=item a) a message number, - -=item b) a comma-separated list of message numbers, - -=item c) a colon-separated range of message numbers (i.e. "$begin:$end") - -=item d) a combination of messages and message ranges, separated by commas -(i.e. 1,3,5:8,10), or - -=item e) a reference to an array whose elements are like I through I. - -=back - -The B method returns a L object. -The object uses L and if treated as a string it will act -like a string. This means you can ignore its objectivity and just -treat it like a string whose value is your message set expressed in -compact format. - -This method provides an easy way to add or remove messages from a -message set. - -For more information see L. - -=head2 Rfc3501_date - -Example: - - $Rfc3501_date = $imap->Rfc3501_date($seconds); - # or: - $Rfc3501_date = Mail::IMAPClient->Rfc3501_date($seconds); - -The B method accepts one input argument, a number of -seconds since the epoch date. It returns an RFC3501 compliant date -string for that date (as required in date-related arguments to SEARCH, -such as "since", "before", etc.). - -=head2 Rfc3501_datetime - -Example: - - $date = $imap->Rfc3501_datetime($seconds); - # or: - $date = Mail::IMAPClient->Rfc3501_datetime($seconds); - -The B method accepts one or two arguments: a -obligatory timestamp and an optional zone. The zone shall be -formatted as C<< [+-]\d{4} >>, and defaults to C<< +0000 >>. The -timestamp follows the definition of the output of the platforms -specific C -method and cannot be invoked as class methods. - -There object methods typically fall into one of two categories. There -are mailbox methods which participate in the IMAP session's -conversation (i.e. they issue IMAP client commands) and object control -methods which do not result in IMAP commands but which may affect -later commands or provide details of previous ones. - -This object control methods can be further broken down into two -types, Parameter accessor methods, which affect the behavior of future -mailbox methods, and L, which report on the affects -of previous mailbox methods. - -Methods that do not result in new IMAP client commands being issued -(such as the L, L, and L methods) all -begin with an uppercase letter, to distinguish them from methods that -do correspond to IMAP client commands. Class methods and eponymous -parameter methods likewise begin with an uppercase letter because they -also do not correspond to an IMAP client command. - -As a general rule, mailbox control methods return C on failure -and something besides C when they succeed. This rule is -modified in the case of methods that return search results. When -called in a list context, searches that do not find matching results -return an empty list. When called in a scalar context, searches with -no hits return 'undef' instead of an array reference. If you want to -know why you received no hits, you should check L or -C<$@>, which will be empty if the search was successful but had no -matching results but populated with an error message if the search -encountered a problem (such as invalid parameters). - -A number of IMAP commands do not have corresponding Mail::IMAPClient -methods. Patches are welcome. In the pre-2.99 releases of this -module, they were automatically created (AUTOLOAD), but that was very -error-prone and stalled the progress of this module. - -=head1 Mailbox Control Methods - -=head2 append - -Example: - - my $uid_or_true = $imap->append( $folder, $msgtext ) - or die "Could not append: ", $imap->LastError; - -WARNING: This method may be deprecated in the future, consider using -L instead of this method. - -The B method adds a message to the specified folder. See -L for details as it is effectively an alias for that -method. - -DEPRECATED BEHAVIOR: Additional arguments are added to the message -text, separated with . - -=head2 append_string - -Example: - - # brackets indicate optional arguments (not array refs): - my $uidort = $imap->append_string( $folder, $msgtext [,$flags [,$date ] ] ) - or die "Could not append_string: ", $imap->LastError; - -Arguments: - -=over 4 - -=item $folder - -the name of the folder to append the message to - -=item $msgtext - -the message text (including headers) of the message - -=item $flags - -An optional list of flags to set. The list must be specified as -a space-separated list of flags, including any backslashes that may be -necessary and optionally enclosed by parenthesis. - -=item $date - -An optional RFC3501 date argument to set as the internal date. It -should be in the format described for I fields in RFC3501, -i.e. "dd-Mon-yyyy hh:mm:ss +0000". - -If you want to specify a date/time but you don't want any flags then -specify I as the third ($flags) argument. - -=back - -Returns: - -=over 4 - -=item error: undef - -On error, undef can be returned regardless of LIST/SCALAR context. -Check L for details. - -=item success: UID or $imap - -With UIDPLUS the UID of the new message is returned otherwise a true -value (currently $self) is returned. - -=back - -To protect against "bare newlines", B will insert a carriage -return before any newline that is "bare". - -=head2 append_file - -Example: - - my $new_msg_uid = $imap->append_file( - $folder, - $file, - [ undef, $flags, $date ] # optional - ) or die "Could not append_file: ", $imap->LastError; - -The B method adds a message to the specified folder. -Note: The brackets in the example indicate optional arguments; they do -not mean that the argument should be an array reference. - -Arguments: - -=over 4 - -=item $folder - -the name of the folder to append the message to - -=item $file - -a filename, filehandle or SCALAR reference which holds an -RFC822-formatted message - -=item undef - -a deprecated argument used as a place holder for backwards -compatibility - -=item $flags - -The optional argument is handled the same as append_string. - -=item $date - -The optional argument is handled the same as append_string (RFC3501 -date), with the exception that if $date is "1" (one) then the -modification time (mtime) of the file will be used. - -=back - -Returns: - -=over 4 - -=item error: undef - -On error, undef can be returned regardless of LIST/SCALAR context. -Check L for details. - -=item success: UID or $imap - -With UIDPLUS the UID of the new message is returned otherwise a true -value (currently $self) is returned. - -=back - -To protect against "bare newlines", B will insert a -carriage return before any newline that is "bare". - -The B method provides a mechanism for allowing large -messages to be appended without holding the whole file in memory. - -Version note: In 2.x an optional third argument to use for -C was allowed, however this argument is -ignored/not supported as of 3.x. - -=head2 authenticate - -Example: - - $imap->authenticate( $authentication_mechanism, $coderef ) - or die "Could not authenticate: ", $imap->LastError; - -This method implements the AUTHENTICATE IMAP client command. It can -be called directly or may be called by L if the -L parameter is set to anything except 'LOGIN'. - -The B method accepts two arguments, an authentication -type to be used (ie CRAM-MD5) and a code or subroutine reference to -execute to obtain a response. The B method assumes that -the authentication type specified in the first argument follows a -challenge-response flow. The B method issues the IMAP -Client AUTHENTICATE command and receives a challenge from the server. -That challenge (minus any tag prefix or enclosing '+' characters but -still in the original base64 encoding) is passed as the only argument -to the code or subroutine referenced in the second argument. The -return value from the 2nd argument's code is written to the server as -is, except that a sequence is appended if necessary. - -If one or both of the arguments are not specified in the call to -B but their corresponding parameters have been set -(L and L, respectively) then the parameter -values are used. Arguments provided to the method call however will -override parameter settings. - -If you do not specify a second argument and you have not set the -L parameter, then the first argument must be -one of the authentication mechanisms for which Mail::IMAPClient -has built in support. - -See also the L method, which is the simplest form of -authentication defined by RFC3501. - -=head2 before - -Example: - - my @msgs = $imap->before($Rfc3501_date) - or warn "No messages found before $Rfc3501_date.\n"; - -The B method works just like the L method, below, -except it returns a list of messages whose internal system dates are -before the date supplied as the argument to the B method. - -=head2 body_string - -Example: - - my $string = $imap->body_string($msgId) - or die "Could not body_string: ", $imap->LastError; - -The B method accepts a message sequence number (or a -message UID, if the L parameter is set to true) as an argument -and returns the message body as a string. The returned value contains -the entire message in one scalar variable, without the message -headers. - -=head2 bodypart_string - -Example: - - my $string = $imap->bodypart_string( - $msgid, $part_number, $length, $offset - ) or die "Could not get bodypart string: ", $imap->LastError; - -The B method accepts a message sequence number (or a -message UID, if the L parameter is set to true) and a body part -as arguments and returns the message part as a string. The returned -value contains the entire message part (or, optionally, a portion of -the part) in one scalar variable. - -If an optional third argument is provided, that argument is the number -of bytes to fetch. (The default is the whole message part.) If an -optional fourth argument is provided then that fourth argument is the -offset into the part at which the fetch should begin. The default is -offset zero, or the beginning of the message part. - -If you specify an offset without specifying a length then the offset -will be ignored and the entire part will be returned. - -B will return C if it encounters an error. - -=head2 capability - -Example: - - my $features = $imap->capability - or die "Could not determine capability: ", $imap->LastError; - -The B method returns an array of capabilities as returned -by the CAPABILITY IMAP Client command, or a reference to an array of -capabilities if called in scalar context. If the CAPABILITY IMAP -Client command fails for any reason then the B method will -return C. Supported capabilities are cached by the client, -however, this cache is deleted after a connection is set to -I and when L is called. - -See also L. - -=head2 close - -Example: - - $imap->close or die "Could not close: $@\n"; - -The B method is used to close the currently selected folder via -the CLOSE IMAP client command. According to RFC3501, the CLOSE -command performs an implicit EXPUNGE, which means that any messages -that are flagged as I<\Deleted> (i.e. with the L -method) will now be deleted. If you haven't deleted any messages then -B can be thought of as an "unselect". - -Note: this closes the currently selected folder, not the IMAP session. - -See also L, L, and RFC3501. - -=head2 compress - -Example: - - $imap->compress or die "Could not enable RFC4978 compression: $@\n"; - -The B method accepts no arguments. This method is used to -instruct the server to use the DEFLATE (RFC1951) compression -extension. See the L attribute for how to specify arguments for use during the the initialization process. - -Version note: method added in Mail::IMAPClient 3.30 - -=head2 connect - -Example: - - $imap->connect or die "Could not connect: $@\n"; - -The B method connects an imap object to the server. It -returns C if it fails to connect for any reason. If values are -available for the L and L parameters at the time -that B is invoked, then B will call the L -method after connecting and return the result of the L method -to B's caller. If either or both of the L and -L parameters are unavailable but the connection to the -server succeeds then B returns a pointer to the IMAPClient -object. - -The L parameter must be set (either during L method -invocation or via the L object method) before invoking -B. When the parameter is an absolute file path, an UNIX -socket will get opened. If the L parameter is supplied to -the L method then B is implicitly called during object -construction. - -The B method sets the state of the object to C if -it successfully connects to the server. It returns C on -failure. - -=head2 copy - -Example: - - # Here brackets indicate optional arguments: - my $uidList = $imap->copy($folder, $msg_1 [ , ... , $msg_n ]) - or die "Could not copy: $@\n"; - -Or: - - # Now brackets indicate an array ref! - my $uidList = $imap->copy($folder, [ $msg_1, ... , $msg_n ]) - or die "Could not copy: $@\n"; - -The B method requires a folder name as the first argument, and a -list of one or more messages sequence numbers (or messages UID's, if -the I parameter is set to a true value). The message sequence -numbers or UID's should refer to messages in the currently selected -folder. Those messages will be copied into the folder named in the -first argument. - -The B method returns C on failure and a true value if -successful. If the server to which the current Mail::IMAPClient -object is connected supports the UIDPLUS capability then the true -value returned by B will be a comma separated list of UID's, -which are the UID's of the newly copied messages in the target folder. - -=head2 create - -Example: - - $imap->create($new_folder) - or die "Could not create $new_folder: $@\n"; - -The B method accepts one argument, the name of a folder (or -what RFC3501 calls a "mailbox") to create. If you specify additional -arguments to the B method and your server allows additional -arguments to the CREATE IMAP client command then the extra argument(s) -will be passed to your server. - -If you specify additional arguments to the B method and your -server does not allow additional arguments to the CREATE IMAP client -command then the extra argument(s) will still be passed to your server -and the create will fail. - -B returns a true value on success and C on failure. - -=head2 date - -Example: - - my $date = $imap->date($msg); - -The B method accepts one argument, a message sequence number (or -a message UID if the L parameter is set to a true value). It -returns the date of message as specified in the message's RFC822 -"Date: " header, without the "Date: " prefix. - -The B method is a short-cut for: - - my $date = $imap->get_header($msg,"Date"); - -=head2 delete - -Example: - - $imap->delete($folder) or die "Could not delete $folder: $@\n"; - -The B method accepts a single argument, the name of a folder -to delete. It returns a true value on success and C on -failure. - -=head2 deleteacl - -Example: - - $imap->deleteacl( $folder, $userid ) - or die "Could not delete acl: $@\n"; - -The B method accepts two input arguments, a folder name, a -user id (or authentication identifier, to use the terminology of -RFC2086). See RFC2086 for more information. (This is somewhat -experimental and its implementation may change.) - -=head2 delete_message - -Example: - - my @msgs = $imap->seen; - scalar(@msgs) and $imap->delete_message(\@msgs) - or die "Could not delete_message: $@\n"; - -The above could also be rewritten like this: - - # scalar context returns array ref - my $msgs = scalar($imap->seen); - - scalar(@$msgs) and $imap->delete_message($msgs) - or die "Could not delete_message: $@\n"; - -Or, as a one-liner: - - $imap->delete_message( scalar($imap->seen) ) - or warn "Could not delete_message: $@\n"; - # just give warning in case failure is - # due to having no 'seen' msgs in the 1st place! - -The B method accepts a list of arguments. If the -L parameter is not set to a true value, then each item in the -list should be either: - -=over 4 - -=item * - -a message sequence number, - -=item * - -a comma-separated list of message sequence numbers, - -=item * - -a reference to an array of message sequence numbers, or - -=back - -If the L parameter is set to a true value, then each item in the -list should be either: - -=over 4 - -=item * - -a message UID, - -=item * - -a comma-separated list of UID's, or - -=item * - -a reference to an array of message UID's. - -=back - -The messages identified by the sequence numbers or UID's will be -deleted. If successful, B returns the number of -messages it was told to delete. However, since the delete is done by -issuing the I<+FLAGS.SILENT> option of the STORE IMAP client command, -there is no guarantee that the delete was successful for every -message. In this manner the B method sacrifices -accuracy for speed. Generally, though, if a single message in a list -of messages fails to be deleted it's because it was already deleted, -which is what you wanted anyway so why worry about it? If there is a -more severe error, i.e. the server replies "NO", "BAD", or, banish the -thought, "BYE", then B will return C. - -If you must have guaranteed results then use the IMAP STORE client -command (via the default method) and use the +FLAGS (\Deleted) option, -and then parse your results manually. - -Eg: - - $imap->store( $msg_id, '+FLAGS (\Deleted)' ); - my @results = $imap->History( $imap->Transaction ); - ... # code to parse output goes here - -(Frankly I see no reason to bother with any of that; if a message -doesn't get deleted it's almost always because it's already not there, -which is what you want anyway. But 'your mileage may vary' and all -that.) - -The IMAPClient object must be in C status to use the -B method. - -B: All the messages identified in the input argument(s) must be in -the currently selected folder. Failure to comply with this -requirement will almost certainly result in the wrong message(s) being -deleted. - -B: In the grand tradition of the IMAP protocol, -deleting a message doesn't actually delete the message. Really. If -you want to make sure the message has been deleted, you need to -expunge the folder (via the L method, which is implemented -via the default method). Or at least L it. This is generally -considered a feature, since after deleting a message, you can change -your mind and undelete it at any time before your L or -L. - -See also: the L method, to delete a folder, the L -method, to expunge a folder, the L method to -undelete a message, and the L method (implemented here via the -default method) to close a folder. Oh, and don't forget about RFC3501. - -=head2 deny_seeing - -Example: - - # Reset all read msgs to unread - # (produces error if there are no seen msgs): - $imap->deny_seeing( scalar($imap->seen) ) - or die "Could not deny_seeing: $@\n"; - -The B method accepts a list of one or more message -sequence numbers, or a single reference to an array of one or more -message sequence numbers, as its argument(s). It then unsets the -"\Seen" flag for those messages (so that you can "deny" that you ever -saw them). Of course, if the L parameter is set to a true value -then those message sequence numbers should be unique message id's. - -Note that specifying C<$imap-Edeny_seeing(@msgs)> is just a -shortcut for specifying C<$imap-Eunset_flag("Seen",@msgs)>. - -=head2 disconnect - -Example: - - $imap->disconnect or warn "Could not logout: $@\n"; - -This method calls L, see L for details. - -=head2 done - -Example: - - my $tag = $imap->idle or warn "idle failed: $@\n"; - doSomethingA(); - my $idlemsgs = $imap->idle_data() or warn "idle_data error: $@\n"; - doSomethingB(); - my $results = $imap->done($tag) or warn "Error from done: $@\n"; - -The B method tells the IMAP server to terminate the IDLE -command. The only argument is the I (identifier) received from -the previous call to L. If I is not specified a default -I based on the B attribute is assumed to be the I to -look for in the response from the server. - -If an invalid I is specified, or the default I is wrong, -then B will hang indefinitely or until a timeout occurs. - -If B is called when an L command is not active then the -server will likely respond with an error like I<* BAD Invalid tag>. - -On failure is returned and L is set. - -See also L, L and L. - -=head2 examine - -Example: - - $imap->examine($folder) or die "Could not examine: $@\n"; - -The B method selects a folder in read-only mode and changes -the object's state to "Selected". The folder selected via the -B method can be examined but no changes can be made unless it -is first selected via the L method. - -The B method accepts one argument, which is the name of the -folder to select. - -=head2 exists - -Example: - - $imap->exists($folder) or warn "$folder not found: $@\n"; - -Accepts one argument, a folder name. Returns true if the folder -exists or false if it does not exist. - -=head2 expunge - -Example: - - $imap->expunge($folder) or die "Could not expunge: $@\n"; - -The B method accepts one optional argument, a folder name. -It expunges the folder specified as the argument, or the currently -selected folder (if any) when no argument is supplied. - -Although RFC3501 does not permit optional arguments (like a folder -name) to the EXPUNGE client command, the L method does. -Note: expunging a folder deletes the messages that have the \Deleted -flag set (i.e. messages flagged via L). - -See also the L method, which "deselects" as well as expunges. - -=head2 fetch - -Usage: - - $imap->fetch( [$seq_set|ALL], @msg_data_items ) - -Example: - - my $output = $imap->fetch(@args) or die "Could not fetch: $@\n"; - -The B method implements the FETCH IMAP client command. It -accepts a list of arguments, which will be converted into a -space-delimited list of arguments to the FETCH IMAP client command. -If no arguments are supplied then B does a FETCH ALL. If the -L parameter is set to a true value then the first argument will -be treated as a UID or list of UID's, which means that the UID FETCH -IMAP client command will be run instead of FETCH. (It would really be -a good idea at this point to review RFC3501.) - -If called in array context, B will return an array of output -lines. The output lines will be returned just as they were received -from the server, so your script will have to be prepared to parse out -the bits you want. The only exception to this is literal strings, -which will be inserted into the output line at the point at which they -were encountered (without the {nnn} literal field indicator). See -RFC3501 for a description of literal fields. - -If B is called in a scalar context, then a reference to an array -(as described above) is returned instead of the entire array. - -B returns C on failure. Inspect L or C<$@> -for an explanation of your error. - -=head2 fetch_hash - -Usage: - - $imap->fetch_hash( [$seq_set|ALL], @msg_data_items, [\%msg_by_ids] ) - -Example: - - my $hashref = {}; - $imap->fetch_hash( "RFC822.SIZE", $hashref ); - print "Msg #$m is $hashref->{$m} bytes\n" foreach my $m (keys %$hashref); - -The B method accepts a list of message attributes to be -fetched (as described in RFC3501). It returns a hash whose keys are -all the messages in the currently selected folder and whose values are -key-value pairs of fetch keywords and the message's value for that -keyword (see sample output below). - -If B is called in scalar context, it returns a reference -to the hash instead of the hash itself. If the last argument is a hash -reference, then that hash reference will be used as the place where -results are stored (and that reference will be returned upon -successful completion). If the last argument is not a reference then -it will be treated as one of the FETCH attributes and a new hash will -be created and returned (either by value or by reference, depending on -the context in which B was called). - -For example, if you have a folder with 3 messages and want the size -and internal date for each of them, you could do the following: - - use Mail::IMAPClient; - use Data::Dumper; - # ... other code goes here - $imap->select($folder); - my $hash = $imap->fetch_hash("RFC822.SIZE","INTERNALDATE"); - # (Same as: - # my $hash = $imap->fetch_hash("RFC822.SIZE"); - # $imap->fetch_hash("INTERNALDATE",$hash); - # ). - print Data::Dumper->Dumpxs([$hash],['$hash']); - -This would result in L output similar to the following: - - $hash = { - '1' => { - 'INTERNALDATE' => '21-Sep-2002 18:21:56 +0000', - 'RFC822.SIZE' => '1586', - }, - '2' => { - 'INTERNALDATE' => '22-Sep-2002 11:29:42 +0000', - 'RFC822.SIZE' => '1945', - }, - '3' => { - 'INTERNALDATE' => '23-Sep-2002 09:16:51 +0000', - 'RFC822.SIZE' => '134314', - } - }; - -By itself this method may be useful for tasks like obtaining the size -of every message in a folder. It issues one command and receives one -(possibly long!) response from the server. - -If the fetch request causes the server to return data in a -parenthesized list, the data within the parenthesized list may be -escaped via the Escape() method. Use the Unescape() method to get the -raw values back in this case. - -=head2 flags - -Example: - - my @flags = $imap->flags($msgid) - or die "Could not flags: $@\n"; - -The B method implements the FETCH IMAP client command to list a -single message's flags. It accepts one argument, a message sequence -number (or a message UID, if the L parameter is true), and -returns an array (or a reference to an array, if called in scalar -context) listing the flags that have been set. Flag names are -provided with leading backslashes. - -As of version 1.11, you can supply either a list of message id's or a -reference to an array of of message id's (which means either sequence -number, if the Uid parameter is false, or message UID's, if the Uid -parameter is true) instead of supplying a single message sequence -number or UID. If you do, then the return value will not be an array -or array reference; instead, it will be a hash reference, with each -key being a message sequence number (or UID) and each value being a -reference to an array of flags set for that message. - -For example, if you want to display the flags for every message in the -folder where you store e-mail related to your plans for world -domination, you could do something like this: - - use Mail::IMAPClient; - my $imap = Mail::IMAPClient->new( - Server => $imaphost, - User => $login, - Password => $pass, - Uid => 1, # optional - ); - - $imap->select("World Domination"); - # get the flags for every message in my 'World Domination' folder - $flaghash = $imap->flags( scalar( $imap->search("ALL") ) ); - - # pump through sorted hash keys to print results: - for my $k (sort { $flaghash->{$a} <=> $flaghash->{$b} } keys %$flaghash) { - # print: Message 1: \Flag1, \Flag2, \Flag3 - print "Message $k:\t",join(", ",@{$flaghash->{$k}}),"\n"; - } - -=head2 folders - -Example: - - $imap->folders or die "Could not list folders: $@\n"; - -The B method returns an array listing the available folders. -It will only be successful if the object is in the I or -I states. - -The B method accepts one optional argument, which is a -prefix. If a prefix is supplied to the B method, then only -folders beginning with the prefix will be returned. - -For example: - - print join(", ",$imap->folders),".\n"; - # Prints: - # INBOX, Sent, Projects, Projects/Completed, Projects/Ongoing, Projects Software. - print join(", ",$imap->folders("Projects"),".\n"; - # Prints: - # Projects, Projects/Completed, Projects/Ongoing, Projects Software. - print join(", ",$imap->folders("Projects" . $imap->separator),".\n"; - # Prints: - # Projects/Completed, Projects/Ongoing - -Please note that documentation previously suggested that if you just -want to list a folder's subfolders (and not the folder itself), then -you need to include the hierarchy separator character (as returned by -the L method). However, this does not match the behavior -of the existing implementation, so you will need to manually exclude -the parent folder from the results. - -=head2 folders_hash - - my @fhashes = $imap->folders_hash - or die "Could not get list of folder hashes.\n"; - -The B method accepts one optional argument, which is a -prefix. If a prefix is supplied to the B method, then -only folders beginning with the prefix will be returned. - -An array(ref) of hashes is returned that contain information about the -requested folders. Each hash contains three keys (name, attrs, delim) -and looks like the following: - - { - name => 'Mail/Box/Name', - attrs => '\Marked \HasNoChildren', - delim => '/', - } - -IMAP servers implementing RFC6154 return attributes to be used to -identify special-use mailboxes (folders). - - my $sattr_re = /\b\\(?:All|Archive|Drafts|Flagged|Junk|Sent|Trash)\b/; - foreach my $fhash (@fhashes) { - next unless ( $fhash->{attrs} =~ $sattr_re ); - print("special: $fhash->{name} : $fhash->{attrs}\n"); - } - -Version note: method added in Mail::IMAPClient 3.34 - -=head2 xlist_folders (DEPRECATED) - -This method is deprecated as of version 3.34. Please use folders_hash -instead. See RFC6154 for attributes to be used to identify -special-use mailboxes (folders). - -Example: - - my $xlist = $imap->xlist_folders - or die "Could not get xlist folders.\n"; - -IMAP servers implementing the XLIST extension (such as Gmail) -designate particular folders to be used for particular functions. -This is useful in the case where you want to know which folder should -be used for Trash when the actual folder name can't be predicted -(e.g. in the case of Gmail, the folder names change depending on the -user's locale settings). - -The B method returns a hash listing any "xlist" folder -names, with the values listing the actual folders that should be used -for those names. For example, using this method with a Gmail user -using the English (US) locale might give this output from -L: - - $VAR1 = { - 'Inbox' => 'Inbox', - 'AllMail' => '[Gmail]/All Mail', - 'Trash' => '[Gmail]/Trash', - 'Drafts' => '[Gmail]/Drafts', - 'Sent' => '[Gmail]/Sent Mail', - 'Spam' => '[Gmail]/Spam', - 'Starred' => '[Gmail]/Starred' - }; - -The same list for a user using the French locale might look like this: - - $VAR1 = { - 'Inbox' => 'Bo&AO4-te de r&AOk-ception', - 'AllMail' => '[Gmail]/Tous les messages', - 'Trash' => '[Gmail]/Corbeille', - 'Drafts' => '[Gmail]/Brouillons', - 'Sent' => '[Gmail]/Messages envoy&AOk-s', - 'Spam' => '[Gmail]/Spam', - 'Starred' => '[Gmail]/Suivis' - }; - -Mail::IMAPClient recognizes the following "xlist" folder names: - -=over 4 - -=item Inbox - -=item AllMail - -=item Trash - -=item Drafts - -=item Sent - -=item Spam - -=item Starred - -=back - -These are currently the only ones supported by Gmail. The XLIST -extension is not documented, and there are no other known -implementations other than Gmail, so this list is based on what Gmail -provides. - -If the server does not support the XLIST extension, this method -returns undef. - -Version note: method added in Mail::IMAPClient 3.21 - -=head2 has_capability - -Example: - - my $has_feature = $imap->has_capability($feature) - or die "Could not do has_capability($feature): $@\n"; - -Returns true if the IMAP server to which the IMAPClient object is -connected has the capability specified as an argument to -B. If the server does not have the capability then -the empty string "" is returned, if the underlying L -calls fails then undef is returned. - -=head2 idle - -Example: - - my $tag = $imap->idle or warn "idle failed: $@\n"; - doSomethingA(); - my $idlemsgs = $imap->idle_data() or warn "idle_data error: $@\n"; - doSomethingB(); - my $results = $imap->done($tag) or warn "Error from done: $@\n"; - -The B method tells the IMAP server the client is ready to accept -unsolicited mailbox update messages. This method is only valid on -servers that support the IMAP IDLE extension, see RFC2177 for details. - -The B method accepts no arguments and returns the I -(identifier) that was sent by the client for this command. This tag -should be supplied as the argument to L when ending the IDLE -command. - -On failure is returned and L is set. - -The method L may be used once B has been successful. -However, no mailbox operations may be called until the B command -has been terminated by calling L. Failure to do so will result -in an error and the idle command will typically be terminated by the -server. - -See also L and L. - -=head2 idle_data - -Usage: - - # an optional timeout in seconds may be specified - $imap->idle_data( [$timeout] ) - -Example: - - my $tag = $imap->idle or warn "idle failed: $@\n"; - doSomethingA(); - my $idlemsgs = $imap->idle_data() or warn "idle_data error: $@\n"; - doSomethingB(); - my $results = $imap->done($tag) or warn "Error from done: $@\n"; - -The B method can be used to accept any unsolicited mailbox -update messages that have been sent by the server during an L -command. This method does not send any commands to the server, it -simply looks for and optionally waits for data from the server and -returns that data to the caller. - -The B method accepts an optional $timeout argument and -returns an array (or an array reference if called in scalar context) -with the messages from the server. - -By default a timeout of 0 seconds is used (do not block). Internally -the timeout is passed to L. The timeout controls how -long the select call blocks if there are no messages waiting to be -read from the server. - -On failure is returned and L is set. - -See also L and L. - -Version note: method added in Mail::IMAPClient 3.23 -Warning: this method is considered experimental and the -interface/output may change in a future version. - -=head2 imap4rev1 - -Example: - - $imap->imap4rev1 or die "Could not imap4rev1: $@\n"; - -Returns true if the IMAP server to which the IMAPClient object is -connected has the IMAP4REV1 capability. If the server does not have -the capability then the empty string "" is returned, if the underlying -L calls fails then undef is returned. - -=head2 internaldate - -Example: - - my $msg_internal_date = $imap->internaldate($msgid) - or die "Could not internaldate: $@\n"; - -B accepts one argument, a message id (or UID if the -L parameter is true), and returns that message's internal date -or undef if the call fails or internal date is not returned. - -=head2 get_bodystructure - -Example: - - my $bodyStructObject = $imap->get_bodystructure($msgid) - or die "Could not get_bodystructure: $@\n"; - -The B method accepts one argument, a message -sequence number or, if L is true, a message UID. It obtains the -message's body structure and returns a parsed -L object for the message. - -=head2 get_envelope - -Example: - - my $envObject = $imap->get_envelope(@args) - or die "Could not get_envelope: $@\n"; - -The B method accepts one argument, a message sequence -number or, if L is true, a message UID. It obtains the -message's envelope and returns a -B object for the envelope, -which is just a version of the envelope that's been parsed into a Perl -object. - -For more information on how to use this object once you've gotten it, -see the L documention. (As of this -writing there is no separate pod document for -B.) - -=head2 getacl - -Example: - - my $hash = $imap->getacl($folder) - or die "Could not getacl for $folder: $@\n"; - -B accepts one argument, the name of a folder. If no argument -is provided then the currently selected folder is used as the default. -It returns a reference to a hash. The keys of the hash are userids -that have access to the folder, and the value of each element are the -permissions for that user. The permissions are listed in a string in -the order returned from the server with no white space or punctuation -between them. - -=head2 get_header - -Example: - - my $messageId = $imap->get_header( $msg, "Message-Id" ); - -The B method accepts two arguments, a message sequence -number or UID and the name of an RFC822 header (without the trailing -colon). It returns the value for that header in the message whose -sequence number or UID was passed as the first argument. If no value -can be found it returns C; if multiple values are found it -returns the first one. Its return value is always a scalar. -B uses case insensitive matching to get the value, so you -do not have to worry about the case of your second argument. - -The B method is a short-cut for: - - my $messageId = $imap->parse_headers($msg,"Subject")->{"Subject"}[0]; - -=head2 getquotaroot - -Example: - - my $results = $imap->getquotaroot($mailboxname) - or die "Could not getquotaroot for $mailboxname: $@\n"; - -The B method implements the RFC2087 GETQUOTAROOT -command. The "$mailboxname" defaults to "INBOX" if no argument is -provided. - -On error C is returned, otherwise L are returned. -The results should have the untagged QUOTAROOT response from the -server along with the QUOTAROOT's resource usage and limits in an -untagged QUOTA response. - -See also B, L, L, L and L. - -=head2 getquota - -Example: - - my $results = $imap->getquota($quotaroot) - or die "Could not getquota for $quotaroot: $@\n"; - -The B method implements the RFC2087 GETQUOTA command. The -"$quotaroot" defaults to "user/I" if no argument is provided. - -On error C is returned, otherwise L are returned. -The results from the server should have the untagged QUOTA response -from the server. - -See also B, L, L and L. - -=head2 quota - -Example: - - my $limit = $imap->quota($quotaroot) - or die "Could not get quota limit for $quotaroot: $@\n"; - -The B method takes the L from L and parses -out the "STORAGE" limit returned by the server. The "$quotaroot" -defaults to "INBOX" if no argument is provided. - -On error C is returned, otherwise the integer "STORAGE" limit -provided by the server is returned. - -See also B, L, L and L. - -=head2 quota_usage - -Example: - - my $usage = $imap->quota_usage($quotaroot) - or die "Could not get quota usage for $quotaroot: $@\n"; - -The B method takes the L from L and -parses out the "STORAGE" usage returned by the server. The -"$quotaroot" defaults to "INBOX" if no argument is provided. - -On error C is returned, otherwise the integer "STORAGE" usage -provided by the server is returned. - -See also B, L, L and L. - -=head2 setquota - -Example: - - my $results = $imap->setquota( $quotaroot, $resource, $limit ) - or die "Could not setquota for $quotaroot: $@\n"; - -The B method implements the RFC2087 SETQUOTA command. It -accepts multiple pairs of $resource and $limit arguments. The -"$quotaroot" defaults to "user/I" if not defined. - -On error C is returned, otherwise L are returned. - -See also B, L and L. - -=head2 is_parent - -Example: - - my $hasKids = $imap->is_parent($folder); - -The B method accepts one argument, the name of a folder. It -returns a value that indicates whether or not the folder has children. -The value it returns is either 1) a true value (indicating that the -folder has children), 2) 0 if the folder has no children at this time, -or 3) C if the folder is not permitted to have children. - -Eg: - - my $parenthood = $imap->is_parent($folder); - if (defined($parenthood)) { - if ($parenthood) { - print "$folder has children.\n"; - } else { - print "$folder is permitted children, but has none.\n"; - } - } else { - print "$folder is not permitted to have children.\n"; - } - -=head2 list - -Example: - - my @raw_output = $imap->list(@args) - or die "Could not list: $@\n"; - -The B method implements the IMAP LIST client command. Arguments -are passed to the IMAP server as received, separated from each other -by spaces. If no arguments are supplied then the default list command -C is issued. - -The B method returns an array (or an array reference, if called -in a scalar context). The array is the unadulterated output of the -LIST command. (If you want your output adulterated then see the -L method, above.) - -An C value is returned in case of errors. Be sure to check for -it. - -=head2 listrights - -Example: - - $imap->listrights($folder,$user) - or die "Could not listrights: $@\n"; - -The B method implements the IMAP LISTRIGHTS client command -(L). It accepts two arguments, the foldername and a user id. -It returns the rights the specified user has for the specified folder. -If called in a scalar context then the rights are returned a strings, -with no punctuation or white space or any nonsense like that. If called -in array context then B returns an array in which each -element is one right. - -=head2 login - -Example: - - $imap->login or die "Could not login: $@\n"; - -The B method implements the IMAP LOGIN client command to log -into the server. It automatically calls L if the -I parameter is set to anything except 'LOGIN' otherwise -a clear text LOGIN is attempted. - -The I and I parameters must be set before the B -method can be invoked. On success, a Mail::IMAPClient object with the -Status of I is returned. On failure, undef is returned -and $@ is set. The methods L, L, and L may -automatically invoke B see the documentation of each method for -details. - -If the L parameter is set, the L method will -automatically be called after successful authentication. - -See also L and L for additional information -regarding ways of authenticating with a server via SASL and/or -PROXYAUTH. - -=head2 proxyauth - -Example: - - $imap->login("admin", "password"); - $imap->proxyauth("someuser"); - -The B method implements the IMAP PROXYAUTH client command. -The command is used by Sun/iPlanet/Netscape IMAP servers to allow an -administrative user to masquerade as another user. - -=head2 logout - -Example: - - $imap->logout or die "Could not logout: $@\n"; - -The B method implements the LOGOUT IMAP client commmand. This -method causes the server to end the connection and the IMAPClient -client enters the I state. This method does not, destroy -the IMAPClient object, thus the L and L methods can -be used to establish a new IMAP session. - -Note that RFC2683 section 3.1.2 (Severed connections) makes some -recommendations on how IMAP clients should behave. It is up to the -user of this module to decide on the preferred behavior and code -accordingly. - -Version note: documentation (from 2.x through 3.23) claimed that -Mail::IMAPClient would attempt to log out of the server during -B if the object is in the L state. This -documentation was apparently incorrect from at least 2.2.2 and -possibly earlier versions on up. - -=head2 lsub - -Example: - - $imap->lsub(@args) or die "Could not lsub: $@\n"; - -The B method implements the IMAP LSUB client command. Arguments -are passed to the IMAP server as received, separated from each other -by spaces. If no arguments are supplied then the default lsub command -C is issued. - -The B method returns an array (or an array reference, if called -in a scalar context). The array is the unaltered output of the LSUB -command. If you want an array of subscribed folders then see the -L method, below. - -=head2 mark - -Example: - - $imap->mark(@msgs) or die "Could not mark: $@\n"; - -The B method accepts a list of one or more messages sequence -numbers, or a single reference to an array of one or more message -sequence numbers, as its argument(s). It then sets the "\Flagged" -flag for those message(s). Of course, if the L parameter is set -to a true value then those message sequence numbers had better be -unique message id's. - -Note that specifying C<$imap-Esee(@msgs)> is just a shortcut for -specifying C<$imap-Eset_flag("Flagged",@msgs)>. - -=head2 Massage - -Example: - - $imap->search(HEADER => 'Message-id' => $imap->Massage($msg_id,1)); - -The B method accepts a value as an argument and, optionally, -a second value that, when true, indicates that the first argument is -not the name of an existing folder. - -It returns its argument as a correctly quoted string or a literal -string. - -Note that you should rarely use this on folder names, since methods -that accept folder names as an argument will call B for -you. In fact, it was originally developed as an undocumented helper -method meant for internal Mail::IMAPClient methods only. - -You may also want to see the L method, which is related to -this method. - -=head2 message_count - -Example: - - my $msgcount = $imap->message_count($folder); - defined($msgcount) or die "Could not message_count: $@\n"; - -The B method accepts the name of a folder as an -argument and returns the number of messages in that folder. -Internally, it invokes the L method (see above) and parses -out the results to obtain the number of messages. If you don't supply -an argument to B then it will return the number of -messages in the currently selected folder (assuming of course that -you've used the L or L method to select it instead -of trying something funky). Note that RFC2683 contains warnings about -the use of the IMAP I command (and thus the L method -and therefore the B method) against the currently -selected folder. You should carefully consider this before using -B on the currently selected folder. You may be better -off using L or one of its variants (especially L), -and then counting the results. On the other hand, I regularly violate -this rule on my server without suffering any dire consequences. Your -mileage may vary. - -=head2 message_string - -Example: - - my $string = $imap->message_string($msgid) - or die "Could not message_string: $@\n"; - -The B method accepts a message sequence number (or -message UID if L is true) as an argument and returns the message -as a string. The returned value contains the entire message in one -scalar variable, including the message headers. Note that using this -method will set the message's "\Seen" flag as a side effect, unless -I is set to a true value. - -=head2 message_to_file - -Example: - - $imap->message_to_file($file,@msgs) - or die "Could not message_to_file: $@\n"; - -The B method accepts a filename or file handle and -one or more message sequence numbers (or message UIDs if L is -true) as arguments and places the message string(s) (including RFC822 -headers) into the file named in the first argument (or prints them to -the file handle, if a file handle is passed). The returned value is -true on success and C on failure. - -If the first argument is a reference, it is assumed to be an open -file handle and will not be closed when the method completes, If it is -a file, it is opened in append mode, written to, then closed. - -Note that using this method will set the message's "\Seen" flag as a -side effect. But you can use the L method to set it -back, or set the L parameter to a true value to prevent setting -the "\Seen" flag at all. - -This method currently works by making some basic assumptions about the -server's behavior, notably that the message text will be returned as a -literal string but that nothing else will be. If you have a better -idea then I'd like to hear it. - -=head2 message_uid - -Example: - - my $msg_uid = $imap->message_uid($msg_seq_no) - or die "Could not get uid for $msg_seq_no: $@\n"; - -The B method accepts a message sequence number (or -message UID if L is true) as an argument and returns the -message's UID. Yes, if L is true then it will use the IMAP UID -FETCH UID client command to obtain and return the very same argument -you supplied. This is an IMAP feature so don't complain to me about -it. - -=head2 messages - -Example: - - # Get a list of messages in the current folder: - my @msgs = $imap->messages or die "Could not messages: $@\n"; - # Get a reference to an array of messages in the current folder: - my $msgs = $imap->messages or die "Could not messages: $@\n"; - -If called in list context, the B method returns a list of -all the messages in the currently selected folder. If called in -scalar context, it returns a reference to an array containing all the -messages in the folder. If you have the L parameter turned off, -then this is the same as specifying C<1 ... $imap-EL>; -if you have UID set to true then this is the same as specifying -C<$imap-EL("ALL")>. - -=head2 migrate - -Example: - - $imap_src->migrate( $imap_dest, "ALL", $targetFolder ) - or die "Could not migrate: ", $imap_src->LastError; - -The B method copies the indicated message(s) B the -currently selected folder B another Mail::IMAPClient object's -session. It requires these arguments: - -=over 4 - -=item 1. - -a reference to the target Mail::IMAPClient object (not the calling -object, which is connected to the source account); - -=item 2. - -the message(s) to be copied, specified as either a) the message -sequence number (or message UID if the UID parameter is true) of a -single message, b) a reference to an array of message sequence numbers -(or message UID's if the UID parameter is true) or c) the special -string "ALL", which is a shortcut for the results of -C("ALL")>. - -=item 3. - -the name of the destination folder on the target mailbox to receive -the message(s). If this argument is not supplied or is I then -the currently selected folder on the calling object will be used. The -destination folder will be automatically created if necessary. - -=back - -The target ($imap_dest) Mail::IMAPClient object must not be the same -object as the source ($imap_src). - -This method does not attempt to minimize memory usage. In the future -it could be enhanced to (optionaly) write message data to a temporary -file to avoid storing the entire message in memory. - -To work around potential network timeouts on large messages, consider -setting L to 1 on both $imap_src and $imap_dest. - -See also C. - -=head2 move - -Example: - - my $newUid = $imap->move( $newFolder, $oldUid ) - or die "Could not move: $@\n"; - $imap->expunge; - -The B method moves messages from the currently selected folder -to the folder specified in the first argument to B. If the -L parameter is not true, then the rest of the arguments should -be either: - -=over 4 - -=item a) - -a message sequence number, - -=item b) - -a comma-separated list of message sequence numbers, or - -=item c) - -a reference to an array of message sequence numbers. - -=back - -If the L parameter is true, then the arguments should be: - -=over 4 - -=item a) - -a message UID, - -=item b) - -a comma-separated list of message UID's, or - -=item c) - -a reference to an array of message UID's. - -=back - -If the target folder does not exist then it will be created. - -If move is successful, then it returns a true value. Furthermore, if -the Mail::IMAPClient object is connected to a server that has the -UIDPLUS capability, then the true value will be the comma-separated -list of UID's for the newly copied messages. The list will be in the -order in which the messages were moved which should correspond to the -order of the message UID provided by the caller. - -If the move is not successful then B returns C. - -Note that a move really just involves copying the message to the new -folder and then setting the I<\Deleted> flag. To actually delete the -original message you will need to run L (or L). - -=head2 namespace - -Example: - - my $refs = $imap->namespace - or die "Could not namespace: $@\n"; - -The namespace method runs the NAMESPACE IMAP command (as defined in -RFC 2342). When called in a list context, it returns a list of three -references. Each reference looks like this: - - [ - [ $prefix_1, $separator_1 ], - [ $prefix_2, $separator_2 ], - [ $prefix_n, $separator_n ], - ] - -The first reference provides a list of prefixes and separator -characters for the available personal namespaces. The second -reference provides a list of prefixes and separator characters for the -available shared namespaces. The third reference provides a list of -prefixes and separator characters for the available public namespaces. - -If any of the three namespaces are unavailable on the current server -then an 'undef' is returned instead of a reference. So for example if -shared folders were not supported on the server but personal and -public namespaces were both available (with one namespace each), the -returned value might resemble this: - - [ [ "", "/" ] , undef, [ "#news", "." ] ]; - -If the B method is called in scalar context, it returns a -reference to the above-mentioned list of three references, thus -creating a single structure that would pretty-print something like -this: - - $VAR1 = [ - [ - [ $user_prefix_1, $user_separator_1 ], - [ $user_prefix_2, $user_separator_2 ], - [ $user_prefix_n, $user_separator_n ], - ], # or undef - [ - [ $shared_prefix_1, $shared_separator_1 ], - [ $shared_prefix_2, $shared_separator_2 ], - [ $shared_prefix_n, $shared_separator_n ], - ], # or undef - [ - [ $public_prefix_1, $public_separator_1 ], - [ $public_prefix_2, $public_separator_2 ], - [ $public_prefix_n, $public_separator_n ], - ], # or undef - ]; - -=head2 on - -Example: - - my @msgs = $imap->on($Rfc3501_date) - or warn "Could not find messages sent on $Rfc3501_date: $@\n"; - -The B method works just like the L method, below, except -it returns a list of messages whose internal system dates are the same -as the date supplied as the argument. - -=head2 parse_headers - -Example: - - my $hashref = $imap->parse_headers($msg||\@msgs, "Date", "Subject") - or die "Could not parse_headers: $@\n"; - -The B method accepts as arguments a message sequence -number and a list of header fields. It returns a hash reference in -which the keys are the header field names (without the colon) and the -values are references to arrays of values. A picture would look -something like this: - - $hashref = $imap->parse_headers(1,"Date","Received","Subject","To"); - $hashref = { - "Date" => [ "Thu, 09 Sep 1999 09:49:04 -0400" ] , - "Received" => [ q/ - from mailhub ([111.11.111.111]) by mailhost.bigco.com - (Netscape Messaging Server 3.6) with ESMTP id AAA527D for - ; Fri, 18 Jun 1999 16:29:07 +0000 - /, q/ - from directory-daemon by mailhub.bigco.com (PMDF V5.2-31 #38473) - id <0FDJ0010174HF7@mailhub.bigco.com> for bigshot@bigco.com - (ORCPT rfc822;big.shot@bigco.com); Fri, 18 Jun 1999 16:29:05 +0000 (GMT) - /, q/ - from someplace ([999.9.99.99]) by smtp-relay.bigco.com (PMDF V5.2-31 #38473) - with ESMTP id <0FDJ0000P74H0W@smtp-relay.bigco.com> for big.shot@bigco.com; Fri, - 18 Jun 1999 16:29:05 +0000 (GMT) - /] , - "Subject" => [ qw/ Help! I've fallen and I can't get up!/ ] , - "To" => [ "Big Shot ] , - }; - -The text in the example for the "Received" array has been formatted to -make reading the example easier. The actual values returned are just -strings of words separated by spaces and with newlines and carriage -returns stripped off. The I header is probably the main -reason that the B method creates a hash of lists rather -than a hash of values. - -If the second argument to B is 'ALL' or if it is -unspecified then all available headers are included in the returned -hash of lists. - -If you're not emotionally prepared to deal with a hash of lists then -you can always call the L method yourself with the appropriate -parameters and parse the data out any way you want to. Also, in the -case of headers whose contents are also reflected in the envelope, you -can use the L method as an alternative to -L. - -If the L parameter is true then the first argument will be -treated as a message UID. If the first argument is a reference to an -array of message sequence numbers (or UID's if L is true), then -B will be run against each message in the array. In -this case the return value is a hash, in which the key is the message -sequence number (or UID) and the value is a reference to a hash as -described above. - -An example of using B to print the date and subject of -every message in your smut folder could look like this: - - use Mail::IMAPClient; - my $imap = Mail::IMAPClient->new( - Server => $imaphost, User => $login, Password => $pass, Uid => 1 - ); - - $imap->select("demo"); - - my $msgs = $imap->search("ALL"); - for my $h ( - - # get the Subject and Date from every message in folder "demo" the - # first arg is a reference to an array listing all messages in the - # folder (which is what gets returned by the $imap->search("ALL") - # method when called in scalar context) and the remaining arguments - # are the fields to parse out The key is the message number, which - # in this case we don't care about: - - values %{ $imap->parse_headers( $msgs , "Subject", "Date") } ) - { - # $h is the value of each element in the hash ref returned - # from parse_headers, and $h is also a reference to a hash. - # We'll only print the first occurrence of each field because - # we don't expect more than one Date: or Subject: line per - # message. - print map { "$_:\t$h->{$_}[0]\n"} keys %$h; - } - -=head2 recent - -Example: - - my @recent = $imap->recent or warn "No recent msgs: $@\n"; - -The B method performs an IMAP SEARCH RECENT search against the -selected folder and returns an array of sequence numbers (or UID's, if -the L parameter is true) of messages that are recent. - -=head2 recent_count - -Example: - - my $count = 0; - defined($count = $imap->recent_count($folder)) - or die "Could not recent_count: $@\n"; - -The B method accepts as an argument a folder name. It -returns the number of recent messages in the folder (as returned by -the IMAP client command "STATUS folder RECENT"), or C in the -case of an error. The B method was contributed by Rob -Deker (deker@ikimbo.com). - -=head2 reconnect - -Example: - $imap->noop or $imap->reconnect or die "noop failed: $@\n"; - -Attempt to reconnect if the IMAP connection unless $imap is already in -the IsConnected state. This method calls L and optionally -L if a Folder was previously selected. On success, returns -the (same) $imap object. On failure is returned and -L is set. - -Version note: method added in Mail::IMAPClient 3.17 - -=head2 rename - -Example: - - $imap->rename($oldname,$nedwname) - or die "Could not rename: $@\n"; - -The B method accepts two arguments: the name of an existing -folder, and a new name for the folder. The existing folder will be -renamed to the new name using the RENAME IMAP client command. -B will return a true value if successful, or C if -unsuccessful. - -=head2 restore_message - -Example: - - $imap->restore_message(@msgs) or die "Could not restore_message: $@\n"; - -The B method is used to undo a previous -L operation (but not if there has been an intervening -L or L). The IMAPClient object must be in -L status to use the B method. - -The B method accepts a list of arguments. If the -L parameter is not set to a true value, then each item in the -list should be either: - -=over 4 - -=item > - -a message sequence number, - -=item > - -a comma-separated list of message sequence numbers, - -=item > - -a reference to an array of message sequence numbers, or - -=back - -If the L parameter is set to a true value, then each item in the -list should be either: - -=over 4 - -=item > - -a message UID, - -=item > - -a comma-separated list of UID's, or - -=item > - -a reference to an array of message UID's. - -=back - -The messages identified by the sequence numbers or UID's will have -their I<\Deleted> flags cleared, effectively "undeleting" the -messages. B returns the number of messages it was -able to restore. - -Note that B is similar to calling -C("\Deleted",@msgs)>, except that B -returns a (slightly) more meaningful value. Also it's easier to type. - -=head2 run - -Example: - - $imap->run(@args) or die "Could not run: $@\n"; - -The B method is provided to make those uncommon things -possible... however, we would like you to contribute the knowledge of -missing features with us. - -The B method excepts one or two arguments. The first argument is -a string containing an IMAP Client command, including a tag and all -required arguments. The optional second argument is a string to look -for that will indicate success. (The default is C). The -B method returns an array (or arrayref in scalar context) of -output lines from the command, which you are free to parse as you see -fit. - -The B method does not do any syntax checking, other than -rudimentary checking for a tag. - -When B processes the command, it increments the transaction count -and saves the command and responses in the History buffer in the same -way other commands do. However, it also creates a special entry in -the History buffer named after the tag supplied in the string passed -as the first argument. If you supply a numeric value as the tag then -you may risk overwriting a previous transaction's entry in the History -buffer. - -If you want the control of B but you don't want to worry about -tags then see L, below. - -=head2 search - -Example: - - my $msgs1 = $imap->search(@args); - if ($msgs) { - print "search matches: @$msgs1"; - } - else { - warn "Error in search: $@\n" if $@; - } - - # or note: be sure to quote string properly - my $msgs2 = $imap->search( \( $imap->Quote($msgid), "FROM", q{"me"} ) ) - or warn "search failed: $@\n"; - - # or note: be sure to quote string properly - my $msgs3 = $imap->search('TEXT "string not in mailbox"') - or warn "search failed: $@\n"; - -The B method implements the SEARCH IMAP client command. Any -arguments supplied to B are prefixed with a space then -appended to the SEARCH IMAP client command. The SEARCH IMAP client -command allows for many options and arguments. See RFC3501 for -details. - -As of version 3.17 B tries to "DWIM" by automatically quoting -things that likely need quotes when the words do not match any of the -following: - - ALL ANSWERED BCC BEFORE BODY CC DELETED DRAFT FLAGGED - FROM HEADER KEYWORD LARGER NEW NOT OLD ON OR RECENT - SEEN SENTBEFORE SENTON SENTSINCE SINCE SMALLER SUBJECT - TEXT TO UID UNANSWERED UNDELETED UNDRAFT UNFLAGGED - UNKEYWORD UNSEEN - -The following options exist to avoid the automatic quoting (note: -caller is responsible for verifying the data sent in these cases is -properly escaped/quoted): - -=over 4 - -=item * - -specify a single string/argument in the call to search. - -=item * - -specify args as scalar references (SCALAR) and the values of those -SCALAR refs will be passed along as-is. - -=back - -The B method returns an array containing sequence numbers of -messages that passed the SEARCH IMAP client command's search criteria. -If the L parameter is true then the array will contain message -UID's. If B is called in scalar context then a pointer to the -array will be passed, instead of the array itself. If no messages -meet the criteria then B returns an empty list (when in list -context) or C (in scalar context). - -Since a valid, successful search can legitimately return zero matches, -you may wish to distinguish between a search that correctly returns -zero hits and a search that has failed for some other reason (i.e. -invalid search parameters). Therefore, the C<$@> variable will always -be cleared before the I command is issued to the server, and -will thus remain empty unless the server gives a I or I -response to the I command. - -=head2 see - -Example: - - $imap->see(@msgs) or die "Could not see: $@\n"; - -The B method accepts a list of one or more messages sequence -numbers, or a single reference to an array of one or more message -sequence numbers, as its argument(s). It then sets the I<\Seen> flag -for those message(s). Of course, if the L parameter is set to a -true value then those message sequence numbers had better be unique -message id's, but then you already knew that, didn't you? - -Note that specifying C<$imap-Esee(@msgs)> is just a shortcut for -specifying C<$imap-EL("Seen",@msgs)>. - -=head2 seen - -Example: - - my @seenMsgs = $imap->seen or warn "No seen msgs: $@\n"; - -The B method performs an IMAP SEARCH SEEN search against the -selected folder and returns an array of sequence numbers of messages -that have already been seen (ie their I<\Seen> flag is set). If the -L parameter is true then an array of message UID's will be -returned instead. If called in scalar context than a reference to the -array (rather than the array itself) will be returned. - -=head2 select - -Example: - - $imap->select($folder) or die "Could not select: $@\n"; - -The B method (or L's read-only equivalent, the -L method) to select it. - -Note that setting the I parameter does not automatically -select a new folder; you use the L or L object -methods for that. Generally, the I parameter should only be -queried (by using the no-argument form of the B method). You -will only need to set the I parameter if you use some -mysterious technique of your own for selecting a folder, which you -probably won't do. - -=head2 Ignoresizeerrors - -Certain (caching) servers, like Exchange 2007, often report the wrong -message size. Instead of chopping the message into a size that it -fits the specified size, the reported size will be simply ignored when -this parameter is set to C<1>. - -=head2 Keepalive - -Some firewalls and network gear like to timeout connections -prematurely if the connection sits idle. The B parameter, -when set to a true value, affects the behavior of L and -L by enabling SO_KEEPALIVE on the socket. - -Version note: attribute added in Mail::IMAPClient 3.17 - -=head2 Maxcommandlength - -The B attribute is used by fetch() to limit length -of commands sent to a server. The default is 1000 chars, following -the recommendation of RFC2683 section 3.2.1.5. - -B: this attribute should also be used for several other methods -but this has not yet been implemented please feel free to file bugs -for methods where you run into problems with this. - -This attribute should remove the need for utilities like imapsync to -create their own split() functions and instead allows Mail::IMAPClient -to DWIM. - -In practice, this parameter has proven to be useful to overcome a -limit of 8000 octets for UW-IMAPD and 16384 octets for Courier/Cyrus -IMAP servers. - -Version note: attribute added in Mail::IMAPClient 3.17 - -=head2 Maxtemperrors - -Example: - - $Maxtemperrors = $imap->Maxtemperrors(); - # or: - $imap->Maxtemperrors($number); - -The I parameter specifies the number of times a read or -write operation is allowed to fail on a "Resource Temporarily -Available" (e.g. EAGAIN) error. The default setting is I which -means there is no limit. - -Setting this parameter to the string "unlimited" (instead of undef) to -ignore "Resource Temporarily Unavailable" errors is deprecated. - -B: This setting should be used with caution and may be removed -in a future release. Setting this can cause methods to return to the -caller before data is received (and then handled) properly thereby -possibly then leaving the module in a bad state. In the future, this -behavior may be changed in an attempt to avoid this situation. - -=head2 Password - -Example: - - $Password = $imap->Password(); - # or: - $imap->Password($new_value); - -Specifies the password to use when logging into the IMAP service on -the host specified in the I parameter as the user specified in -the I parameter. Can be supplied with the B method call or -separately by calling the B object method. - -If I, I, and I are all provided to the L -method, then the newly instantiated object will be connected to the -host specified in I (at either the port specified in I -or the default port 143) and then logged on as the user specified in -the I parameter (using the password provided in the I -parameter). See the discussion of the L method, below. - -=head2 Peek - -Example: - - $Peek = $imap->Peek(); - # or: - $imap->Peek($true_or_false); - -Setting I to a true value will prevent the L, -L and L methods from automatically -setting the I<\Seen> flag. Setting L to 0 (zero) will force -L, L, L, and -L to always set the I<\Seen> flag. - -The default is to set the seen flag whenever you fetch the body of a -message but not when you just fetch the headers. Passing I to -the eponymous B method will reset the I parameter to its -pristine, default state. - -=head2 Port - -Example: - - $Port = $imap->Port(); - # or: - $imap->Port($new_value); - -Specifies the port on which the IMAP server is listening. A default -value of 993 (if L is true) or 143 is set during a call to -L if no value is provided by the caller. This argument can -be supplied with the L method call or separately by calling the -L object method. - -=head2 Prewritemethod - -I parameter should contain a reference to a subroutine -that will do "special things" to data before it is sent to the IMAP -server (such as encryption or signing). - -This method will be called immediately prior to sending an IMAP client -command to the server. Its first argument is a reference to the -I object and the second argument is a string -containing the command that will be sent to the server. Your -I should return a string that has been signed or -encrypted or whatever; this returned string is what will actually be -sent to the server. - -Your I will probably need to know more than this to do -whatever it does. It is recommended that you tuck all other pertinent -information into a hash, and store a reference to this hash somewhere -where your method can get to it, possibly in the I -object itself. - -Note that this method should not actually send anything over the -socket connection to the server; it merely converts data prior to -sending. - -See also L. - -=head2 Ranges - -Example: - - $imap->Ranges(1); - # or: - my $search = $imap->search(@search_args); - if ( $imap->Ranges) { # $search is a MessageSet object - print "This is my condensed search result: $search\n"; - print "This is every message in the search result: ", - join(",",@$search),"\n; - } - -If set to a true value, then the L method will return a -L object if called in a scalar context, -instead of the array reference that B normally returns when -called in a scalar context. If set to zero or if undefined, then -B will continue to return an array reference when called in -scalar context. - -This parameter has no affect on the B method when B -is called in a list context. - -=head2 RawSocket - -Example: - $socket = $imap->RawSocket; - # or: - $imap->RawSocket($socketh); - -The I method can be used to obtain the socket handle of the -current connection (say, to do I/O on the connection that is not -otherwise supported by Mail::IMAPClient) or to replace the current -socket with a new handle (for instance an SSL handle, see -L, but be sure to see the L method as well). - -If you supply a socket handle yourself, either by doing something like: - - $imap=Mail::IMAPClient->new(RawSocket => $sock, User => ... ); - -or by doing something like: - - $imap = Mail::IMAPClient->new(User => $user, - Password => $pass, Server => $host); - # blah blah blah - $imap->RawSocket($ssl); - -then it will be up to you to establish the connection AND to -authenticate, either via the L method, or the fancier -L, or, since you know so much anyway, by just doing raw -I/O against the socket until you're logged in. If you do any of this -then you should also set the L parameter yourself to reflect -the current state of the object (i.e. Connected, Authenticated, etc). - -Note that no operation will be attempted on the socket when this -method is called. In particular, after the TCP connections towards -the IMAP server is established, the protocol mandates the server to -send an initial greeting message, and you will have to explicitly cope -with this message before doing any other operation, e.g. trying to -call L. Caveat emptor. - -For a more DWIM approach to setting the socket see L. - -=head2 Readmethod - -Example: - - $imap->Readmethod( # IMAP, HANDLE, BUFFER, LENGTH, OFFSET - sub { - my ( $self, $handle, $buffer, $count, $offset ) = @_; - my $rc = sysread( $handle, $$buffer, $count, $offset ); - # do something useful here... - } - ); - -B should contain a reference to a subroutine that will -replace sysread. The subroutine will be passed the following -arguments: first the used Mail::IMAPClient object. Second, a -reference to a socket. Third, a reference to a scalar variable into -which data is read (BUFFER). The data placed here should be "finished -data", so if you are decrypting or removing signatures then be sure to -do that before you place data into this buffer. Fourth, the number of -bytes requested to be read; the LENGTH of the request. Lastly, the -OFFSET into the BUFFER where the data should be read. If not supplied -it should default to zero. - -Note that this method completely replaces reads from the connection -to the server, so if you define one of these then your subroutine will -have to actually do the read. It is for things like this that we have -the L parameter and eponymous accessor method. - -Your I will probably need to know more than this to do -whatever it does. It is recommended that you tuck all other pertinent -information into a hash, and store a reference to this hash somewhere -where your method can get to it, possibly in the I -object itself. - -See also L. - -=head2 Readmoremethod - -B should contain a reference to a subroutine that will -replace/enhance the behavior of the internal _read_more() method. The -subroutine will be passed the following arguments: first the used -Mail::IMAPClient object. Second, a reference to a socket. Third, a -timeout value which is used as the timeout value for CORE::select() by -default. Depending upon changes/features introduced by Readmethod -changes may be required here. - -Version note: attribute added in Mail::IMAPClient 3.30 - -=head2 Reconnectretry - -If an IMAP connection sits idle too long, the connection may be closed -by the server or firewall, etc. The B parameter, when -given a positive integer value, will cause Mail::IMAPClient to -retrying IMAP commands up to X times when an EPIPE or ECONNRESET error -occurs. This is disabled (0) by default. - -See also L - -Version note: attribute added in Mail::IMAPClient 3.17 - -=head2 Server - -Example: - - $Server = $imap->Server(); - # or: - $imap->Server($hostname); - -Specifies the hostname or IP address of the host running the IMAP -server. If provided as part of the L method call, then the new -IMAP object will automatically be connected at the time of -instantiation. (See the L method, below.) Can be supplied with -the L method call or separately by calling the B object -method. - -=head2 Showcredentials - -Normally debugging output will mask the login credentials when the -plain text login mechanism is used. Setting I to a -true value will suppress this, so that you can see the string being -passed back and forth during plain text login. Only set this to true -when you are debugging problems with the IMAP LOGIN command, and then -turn it off right away when you're finished working on that problem. - -Example: - - print "This is very risky!\n" if $imap->Showcredentials(); - # or: - $imap->Showcredentials(0); # mask credentials again - -=head2 Socket - -B The semantics of this method has changed as of version -2.99_04 of this module. If you need the old semantics use -L. - -Example: - - $Socket = $imap->Socket(); - # or: - $imap->Socket($socket_fh); - -The I method can be used to obtain the socket handle of the -current connection. This may be necessary to do I/O on the connection -that is not otherwise supported by Mail::IMAPClient) or to replace the -current socket with a new handle (for instance an SSL handle, see -IO::Socket::SSL). - -If you supply a socket handle yourself, either by doing something like: - - $imap = Mail::IMAPClient->new( Socket => $sock, User => ... ); - -or by doing something like: - - $imap = Mail::IMAPClient->new( - User => $user, Password => $pass, Server => $host - ); - $imap->Socket($ssl); - -then you are responsible for establishing the connection, i.e. make -sure that C<$ssl> in the example is a valid and connected socket. - -This method is primarily used to provide a drop-in replacement for -L, used by L by default. In fact, this -method is called by L itself after having established a -suitable L socket connection towards the target -server; for this reason, this method also carries the normal -operations associated with L, namely: - -=over 4 - -=item * - -read the initial greeting message from the server; - -=item * - -call L if the conditions apply (see L for details); - -=item * - -leave the I object in a suitable state. - -=back - -For these reasons, the following example will work "out of the box": - - use IO::Socket::SSL; - my $imap = Mail::IMAPClient->new - ( User => 'your-username', - Password => 'your-password', - Socket => IO::Socket::SSL->new - ( Proto => 'tcp', - PeerAddr => 'some.imap.server', - PeerPort => 993, # IMAP over SSL standard port - ), - ); - -If you need more control over the socket, e.g. you have to implement a -fancier authentication method, see L. - -=head2 Starttls - -If an IMAP connection must start TLS/SSL after connecting to a server -then set this attribute. If the value is set to an arrayref then they -will be used as arguments to IO::Socket::SSL->start_SSL. By default -this connection is set to blocking while establishing the connection -with a timeout of 30 seconds. The socket will be reset to the -original blocking/non-blocking value after a successful TLS -negotiation has occured. The arguments used in the call to start_SSL -can be controlled by setting this attribute to an ARRAY reference -containing the desired arguments. - -Version note: attribute added in Mail::IMAPClient 3.22 - -=head2 Socketargs - -The arguments used in the call to IO::Socket::{UNIX|INET|SSL}->new can -be controlled by setting this attribute to an ARRAY reference -containing the desired arguments. - -For example, to always pass MultiHomed => 1 to IO::Socket::...->new -the following can be used: - - $imap = Mail::IMAPClient->new( - ..., Socketargs => [ MultiHomed => 1 ], ... - ); - -See also L for specific control of the args to IO::Socket::SSL. - -Version note: attribute added in Mail::IMAPClient 3.34 - -=head2 Ssl - -If an IMAP connection requires SSL you can set the Ssl attribute to -'1' and Mail::IMAPClient will automatically use L -instead of L to connect to the server. This -attribute is used in the L method. The arguments used in -the call to IO::Socket::SSL->new can be controlled by setting this -attribute to an ARRAY reference containing the desired arguments. - -See also L for details on connection initiatiation and -L and L if you need to take more control of -connection management. - -Version note: attribute added in Mail::IMAPClient 3.18 - -=head2 Supportedflags - -Especially when C is used, the receiving peer may need to -be configured explicitly with the list of supported flags; that may -be different from the source IMAP server. - -The names are to be specified as an ARRAY. Black-slashes and casing -will be ignored. - -You may also specify a CODE reference, which will be called for each -of the flags separately. In this case, the flags are not (yet) -normalized. The returned lists of the CODE calls are shape the -resulting flag list. - -=head2 Timeout - -Example: - - $Timeout = $imap->Timeout(); - # or: - $imap->Timeout($seconds); - -Specifies the timeout value in seconds for reads (default is 600). -Specifying a I will prevent Mail::IMAPClient from blocking -in a read. - -Since timeouts are implemented via the Perl L -operator, the I parameter may be set to a fractional number -of seconds. Setting I to 0 (zero) disables the timeout -feature. - -=head2 Uid - -Example: - - $Uid = $imap->Uid(); - # or: - $imap->Uid($true_or_false); - -If L is set to a true value (i.e. 1) then the behavior of the -L, L, L, and L methods (and their -derivatives) is changed so that arguments that would otherwise be -message sequence numbers are treated as message UID's and so that -return values (in the case of the L method and its -derivatives) that would normally be message sequence numbers are -instead message UID's. - -Internally this is implemented as a switch that, if turned on, causes -methods that would otherwise issue an IMAP FETCH, STORE, SEARCH, or -COPY client command to instead issue UID FETCH, UID STORE, UID SEARCH, -or UID COPY, respectively. The main difference between message -sequence numbers and message UID's is that, according to RFC3501, -UID's must not change during a session and should not change between -sessions, and must never be reused. Sequence numbers do not have that -same guarantee and in fact may be reused right away. - -Since folder names also have a unique identifier (UIDVALIDITY), which -is provided when the folder is Led or Ld or by -doing something like "$imap->status($folder,"UIDVALIDITY"), it is -possible to uniquely identify every message on the server, although -normally you won't need to bother. - -The methods currently affected by turning on the L flag are: - - copy fetch - search store - message_string message_uid - body_string flags - move size - parse_headers thread - -Note that if for some reason you only want the L parameter turned -on for one command, then you can choose between the following two -snippets, which are equivalent: - -Example 1: - - $imap->Uid(1); - my @uids = $imap->search('SUBJECT',"Just a silly test"); # - $imap->Uid(0); - -Example 2: - - my @uids; - foreach $r ($imap->UID("SEARCH","SUBJECT","Just a silly test") { - chomp $r; - $r =~ s/\r$//; - $r =~ s/^\*\s+SEARCH\s+// or next; - push @uids, grep(/\d/,(split(/\s+/,$r))); - } - -In the second example, we used the default method to issue the UID -IMAP Client command, being careful to use an all-uppercase method name -so as not to inadvertently call the L accessor method. Then we -parsed out the message UIDs manually, since we don't have the benefit -of the built-in L method doing it for us. - -Please be very careful when turning the L parameter on and off -throughout a script. If you loose track of whether you've got the -L parameter turned on you might do something sad, like deleting -the wrong message. Remember, like all eponymous accessor methods, the -B method without arguments will return the current value for the -L parameter, so do yourself a favor and check. The safest -approach is probably to turn it on at the beginning (or just let it -default to being on) and then leave it on. (Remember that leaving it -turned off can lead to problems if changes to a folder's contents -cause resequencing.) - -By default, the L parameter is turned on. - -=head2 User - -Example: - - $User = $imap->User(); - # or: - $imap->User($userid); - -Specifies the userid to use when logging into the IMAP service. Can -be supplied with the L method call or separately by calling the -B object method. - -Parameters can be set during L method invocation by passing named -parameter/value pairs to the method, or later by calling the -parameter's eponymous object method. - -=head1 Status Methods - -There are several object methods that return the status of the object. -They can be used at any time to check the status of an IMAPClient -object, but are particularly useful for determining the cause of -failure when a connection and login are attempted as part of a single -L method invocation. The status methods are: - -=head2 Escaped_results - -Example: - - my @results = $imap->Escaped_results; - -The B method is almost identical to the B -method. Unlike the B method, however, server output -transmitted literally will be wrapped in double quotes, with all of -the parentheses, double quotes, backslashes, newlines, and carriage -returns escaped. If called in a scalar context, B -returns an array reference rather than an array. - -B is useful if you are retrieving output and -processing it manually, and you are depending on the above special -characters to delimit the data. It is not useful when retrieving -message contents; use B or B for that. - -=head2 History - -Example: - - my @history = $imap->History; - -The B method is almost identical to the L method. -Unlike the L method, however, the IMAP command that was -issued to create the results being returned is not included in the -returned results. If called in a scalar context, B returns -an array reference rather than an array. - -=head2 IsUnconnected - -returns a true value if the object is currently in an L -state. - -=head2 IsConnected - -returns a true value if the object is currently in either a -L, L, or L state. - -=head2 IsAuthenticated - -returns a true value if the object is currently in either an -L or L state. - -=head2 IsSelected - -returns a true value if the object is currently in a L -state. - -=head2 LastError - -Internally B is implemented just like a parameter (as -described in L, above). There is a I -attribute and an eponymous accessor method which returns the -I text string describing the last error condition -encountered by the server. - -Note that some errors are more serious than others, so I's -value is only meaningful if you encounter an error condition that you -don't like. For example, if you use the L method to see if a -folder exists and the folder does not exist, then an error message -will be recorded in I even though this is not a -particularly serious error. On the other hand, if you didn't use -L and just tried to L a non-existing folder, then -L would return C after setting I to -something like C. At this point it would be useful to print out the -contents of I as you L. - -=head2 LastIMAPCommand - -New in version 2.0.4, B returns the exact IMAP -command string to be sent to the server. Useful mainly in -constructing error messages when L just isn't enough. - -=head2 Report - -The B method returns an array containing a history of the IMAP -session up to the point that B was called. It is primarily -meant to assist in debugging but can also be used to retrieve raw -output for manual parsing. The value of the L parameter -controls how many transactions are in the report. - -=head2 Results - -The B method returns an array containing the results of one -IMAP client command. It accepts one argument, the transaction number -of the command whose results are to be returned. If transaction -number is unspecified then B returns the results of the last -IMAP client command issued. If called in a scalar context, B -returns an array reference rather than an array. - -=head2 State - -The B method returns a numerical value that indicates the -current status of the IMAPClient object. If invoked with an argument, -it will set the object's state to that value. If invoked without an -argument, it behaves just like L, below. - -Normally you will not have to invoke this function. An exception is -if you are bypassing the Mail::IMAPClient module's L and/or -L modules to set up your own connection (say, for example, -over a secure socket), in which case you must manually do what the -L and L methods would otherwise do for you. - -=head2 Status - -The B method returns a numerical value that indicates the -current status of the IMAPClient object. (Not to be confused with the -L method, all lower-case, which is the implementation of the -I IMAP client command.) - -=head2 Transaction - -The B method returns the tag value (or transaction -number) of the last IMAP client command. - -=head1 Custom Authentication Mechanisms - -If you just want to use plain text authentication or any of the -supported L then there is no -need to read this section. - -There are a number of methods and parameters that you can use to build -your own authentication mechanism. All of the methods and parameters -discussed in this section are described in more detail elsewhere in -this document. This section provides a starting point for building -your own authentication mechanism. - -There are I authentication mechanisms out there, if your -preferred mechanism is not currently supported but you manage to get -it working please consider donating them to this module. Patches and -suggestions are always welcome. - -Support for add-on authentication mechanisms in Mail::IMAPClient is -pretty straight forward. You create a callback to be used to provide -the response to the server's challenge. The L parameter -contains a reference to the callback, which can be an anonymous -subroutine or a named subroutine. Then, you identify your -authentication mechanism, either via the L parameter or -as an argument to L. - -You may also need to provide a subroutine to encrypt (or whatever) -data before it is sent to the server. The L parameter -must contain a reference to this subroutine. And, you will need to -decrypt data from the server; a reference to the subroutine that does -this must be stored in the L parameter. - -This framework is based on the assumptions that a) the mechanism you -are using requires a challenge-response exchange, and b) the mechanism -does not fundamentally alter the exchange between client and server -but merely wraps the exchange in a layer of encryption. It also -assumes that the line-oriented nature of the IMAP conversation is -preserved; authentication mechanisms that break up messages into -blocks of a predetermined size may still be possible but will -certainly be more difficult to implement. - -Alternatively, if you have access to B, a utility included in -the Cyrus IMAP distribution, you can use that utility to broker your -communications with the IMAP server. This is quite easy to implement. -An example, F, can be found in the -C subdirectory of the source distribution. - -The following list summarizes the methods and parameters that you may -find useful in implementing advanced authentication: - -=over 4 - -=item The authenticate method - -The L method uses the L parameter to -determine how to authenticate with the server see the method -documentation for details. - -=item Socket and RawSocket - -The L and L methods provide access to the socket -connection. The socket is typically automatically created by the -L method, but if you are implementing an advanced -authentication technique you may choose to set up your own socket -connection and then set this parameter manually, bypassing the -B method completely. This is also useful if you want to use -L alternatives like L and need full -control. - -L simply gets/sets the socket without attempting any -interaction on it. In this case, you have to be sure to handle all -the preliminary operations and manually set the Mail::IMAPClient -object in sync with its actual status with respect to this socket (see -below for additional parameters regarding this, especially the -L parameter). - -Unlike L, L attempts to carry on preliminary -connection phases if the conditions apply. If both parameters are -present, this takes the precedence over L. If -L is set, then the L method will be called by -L. - -B As of version 2.99_04 of this module, semantics for -L have changed to make it more "DWIM". L was -introduced as a replacement for the L parameter in older -version. - -=item State, Server, User, Password, Proxy and Domain Parameters - -If you need to make your own connection to the server and perform your -authentication manually, then you can set these parameters to keep -your Mail::IMAPClient object in sync with its actual status. Of -these, only the L parameter is always necessary. The others -need to be set only if you think your program will need them later. - -=item Authmechanism - -Set this to the value that AUTHENTICATE should send to the server as -the authentication mechanism. If you are brokering your own -authentication then this parameter may be less useful. It exists -primarily so that you can set it when you call L to instantiate -your object. The L method will call L, which will -call L. If L sees that you have set an -B then it will call B, using your -B and B parameters as arguments. - -=item Authcallback - -The L, if set, holds a pointer to a subroutine -(CODEREF). The L method will use this as the callback -argument to the B method if the B and -B parameters are both set. If you set B -but not B then the default callback for your mechanism -will be used. All supported authentication mechanisms have a default -callback; in every other case not supplying the callback results in an -error. - -Most advanced authentication mechanisms require a challenge-response -exchange. After the L method sends " AUTHENTICATE -\015\012" to the IMAP server, the server replies with a -challenge. The L method then invokes the code whose -reference is stored in the B parameter as follows: - - $Authcallback->( $challenge, $imap ) - -where C<$Authcallback> is the code reference stored in the -B parameter, C<$challenge> is the challenge received -from the IMAP server, and C<$imap> is a pointer to the -Mail::IMAPClient object. The return value from the B -routine should be the response to the challenge, and that return value -will be sent by the L method to the server. - -=item Prewritemethod/Readmethod - -The B can hold a subroutine that will do whatever -encryption is necessary and then return the result to the caller so it -in turn can be sent to the server. - -The B can hold a subroutine to be used to replace -B usually performed by Mail::IMAPClient. - -See L and L for details. - -=back - -=head1 REPORTING BUGS - -Please send bug reports to C or -http://rt.cpan.org/Public/Dist/Display.html?Name=Mail-IMAPClient - -=head1 COPYRIGHT AND LICENSE - - Copyright (C) 1999-2003 The Kernen Group, Inc. - Copyright (C) 2007-2009 Mark Overmeer - Copyright (C) 2010-2013 Phil Pearl (Lobbes) - All rights reserved. - -This library is free software; you can redistribute it and/or modify -it under the same terms as Perl itself, either Perl version 5.8.0 or, -at your option, any later version of Perl 5 you may have available. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See either the -GNU General Public License or the Artistic License for more details. diff --git a/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/BodyStructure.pm b/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/BodyStructure.pm deleted file mode 100644 index 412c61e..0000000 --- a/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/BodyStructure.pm +++ /dev/null @@ -1,576 +0,0 @@ -use warnings; -use strict; - -package Mail::IMAPClient::BodyStructure; -use Mail::IMAPClient::BodyStructure::Parse; - -# BUG?: old code used name "HEAD" instead of "HEADER", change? -my $HEAD = "HEAD"; - -# my has file scope, not limited to package! -my $parser = Mail::IMAPClient::BodyStructure::Parse->new - or die "Cannot parse rules: $@\n" - . "Try remaking Mail::IMAPClient::BodyStructure::Parse.\n"; - -sub new { - my $class = shift; - my $bodystructure = shift; - - my $self = $parser->start($bodystructure) - or return undef; - - $self->{_prefix} = ""; - $self->{_id} = exists $self->{bodystructure} ? $HEAD : 1; - $self->{_top} = 1; - - bless $self, ref($class) || $class; -} - -sub _get_thingy { - my $thingy = shift; - my $object = shift || ( ref $thingy ? $thingy : undef ); - - unless ( $object && ref $object ) { - warn $@ = "No argument passed to $thingy method."; - return undef; - } - - unless ( UNIVERSAL::isa( $object, 'HASH' ) && exists $object->{$thingy} ) { - my $a = $thingy =~ /^[aeiou]/i ? 'an' : 'a'; - my $has = ref $object eq 'HASH' ? join( ", ", keys %$object ) : ''; - warn $@ = - ref($object) - . " $object does not have $a $thingy. " - . ( $has ? "It has $has" : '' ); - return undef; - } - - my $value = $object->{$thingy}; - $value =~ s/\\ ( [\\\(\)"\x0d\x0a] )/$1/gx; - $value =~ s/^"(.*)"$/$1/; - $value; -} - -BEGIN { - no strict 'refs'; - foreach my $datum ( - qw/ bodytype bodysubtype bodyparms bodydisp bodyid bodydesc bodyenc - bodysize bodylang envelopestruct textlines / - ) - { - *$datum = sub { _get_thingy( $datum, @_ ) }; - } -} - -sub parts { - my $self = shift; - return wantarray ? @{ $self->{PartsList} } : $self->{PartsList} - if exists $self->{PartsList}; - - my @parts; - $self->{PartsList} = \@parts; - - # BUG?: should this default to ($HEAD, TEXT) - unless ( exists $self->{bodystructure} ) { - $self->{PartsIndex}{1} = $self; - @parts = ( $HEAD, 1 ); - return wantarray ? @parts : \@parts; - } - - foreach my $p ( $self->bodystructure ) { - my $id = $p->id; - push @parts, $id; - $self->{PartsIndex}{$id} = $p; - my $type = uc $p->bodytype || ''; - - push @parts, "$id.$HEAD" - if $type eq 'MESSAGE'; - } - - wantarray ? @parts : \@parts; -} - -sub bodystructure { - my $self = shift; - my $partno = 0; - my @parts; - - if ( $self->{_top} ) { - $self->{_id} ||= $HEAD; - $self->{_prefix} ||= $HEAD; - $partno = 0; - foreach my $b ( @{ $self->{bodystructure} } ) { - $b->{_id} = ++$partno; - $b->{_prefix} = $partno; - push @parts, $b, $b->bodystructure; - } - return wantarray ? @parts : \@parts; - } - - my $prefix = $self->{_prefix} || ""; - $prefix =~ s/\.?$/./; - - foreach my $p ( @{ $self->{bodystructure} } ) { - $partno++; - - # BUG?: old code didn't add .TEXT sections, should we skip these? - # - This code needs to be generalised (maybe it belongs in parts()?) - # - Should every message should have HEAD (actually MIME) and TEXT? - # at least dovecot and iplanet appear to allow this even for - # non-multipart sections - my $pno = $partno; - my $stype = $self->{bodytype} || ""; - my $ptype = $p->{bodytype} || ""; - - # a message and the multipart inside of it "collapse together" - if ( $partno == 1 and $stype eq 'MESSAGE' and $ptype eq 'MULTIPART' ) { - $pno = "TEXT"; - $p->{_prefix} = "$prefix"; - } - else { - $p->{_prefix} = "$prefix$partno"; - } - $p->{_id} ||= "$prefix$pno"; - - push @parts, $p, $p->{bodystructure} ? $p->bodystructure : (); - } - - wantarray ? @parts : \@parts; -} - -sub id { - my $self = shift; - return $self->{_id} - if exists $self->{_id}; - - return $HEAD - if $self->{_top}; - - # BUG?: can this be removed? ... seems wrong - if ( $self->{bodytype} eq 'MULTIPART' ) { - my $p = $self->{_id} || $self->{_prefix}; - $p =~ s/\.$//; - return $p; - } - else { - return $self->{_id} ||= 1; - } -} - -package Mail::IMAPClient::BodyStructure::Part; -our @ISA = qw/Mail::IMAPClient::BodyStructure/; - -package Mail::IMAPClient::BodyStructure::Envelope; -our @ISA = qw/Mail::IMAPClient::BodyStructure/; - -sub new { - my ( $class, $envelope ) = @_; - $parser->envelope($envelope); -} - -sub parse_string { - my ( $class, $envelope ) = @_; - $envelope = "(" . $envelope . ")" unless ( $envelope =~ /^\(/ ); - $parser->envelopestruct($envelope); -} - -sub from_addresses { shift->_addresses( from => 1 ) } -sub sender_addresses { shift->_addresses( sender => 1 ) } -sub replyto_addresses { shift->_addresses( replyto => 1 ) } -sub to_addresses { shift->_addresses( to => 0 ) } -sub cc_addresses { shift->_addresses( cc => 0 ) } -sub bcc_addresses { shift->_addresses( bcc => 0 ) } - -sub _addresses($$$) { - my ( $self, $name, $isSender ) = @_; - ref $self->{$name} eq 'ARRAY' - or return (); - - my @list; - foreach ( @{ $self->{$name} } ) { - my $pn = $_->personalname; - my $name = $pn && $pn ne 'NIL' ? "$pn " : ''; - push @list, $name . '<' . $_->mailboxname . '@' . $_->hostname . '>'; - } - - wantarray ? @list - : $isSender ? $list[0] - : \@list; -} - -BEGIN { - no strict 'refs'; - for my $datum ( - qw(subject inreplyto from messageid bcc date - replyto to sender cc) - ) - { - *$datum = sub { @_ > 1 ? $_[0]->{$datum} = $_[1] : $_[0]->{$datum} } - } -} - -package Mail::IMAPClient::BodyStructure::Address; -our @ISA = qw/Mail::IMAPClient::BodyStructure/; - -for my $datum (qw(personalname mailboxname hostname sourcename)) { - no strict 'refs'; - *$datum = sub { shift->{$datum}; }; -} - -1; - -__END__ - -=head1 NAME - -Mail::IMAPClient::BodyStructure - parse fetched results - -=head1 SYNOPSIS - - use Mail::IMAPClient; - use Mail::IMAPClient::BodyStructure; - - my $imap = Mail::IMAPClient->new( - Server => $server, User => $login, Password => $pass - ); - - $imap->select("INBOX") or die "Could not select INBOX: $@\n"; - - my @recent = $imap->search("recent") or die "No recent msgs in INBOX\n"; - - foreach my $id (@recent) { - my $bsdat = $imap->fetch( $id, "bodystructure" ); - my $bso = Mail::IMAPClient::BodyStructure->new($bsdat); - my $mime = $bso->bodytype . "/" . $bso->bodysubtype; - my $parts = map( "\n\t" . $_, $bso->parts ); - print "Msg $id (Content-type: $mime) contains these parts:$parts\n"; - } - -=head1 DESCRIPTION - -This extension will parse the result of an IMAP FETCH BODYSTRUCTURE -command into a perl data structure. It also provides helper methods -to help pull information out of the data structure. - -This module requires Parse::RecDescent. - -=head1 Class Methods - -The following class method is available: - -=head2 new - -This class method is the constructor method for instantiating new -Mail::IMAPClient::BodyStructure objects. The B method accepts -one argument, a string containing a server response to a FETCH -BODYSTRUCTURE directive. - -The module B provides the B -conveniece method to simplify use of this module when starting with -just a messages sequence number or unique ID (UID). - -=head1 Object Methods - -The following object methods are available: - -=head2 bodytype - -The B object method requires no arguments. It returns the -bodytype for the message whose structure is described by the calling -B object. - -=head2 bodysubtype - -The B object method requires no arguments. It returns the -bodysubtype for the message whose structure is described by the calling -B object. - -=head2 bodyparms - -The B object method requires no arguments. It returns the -bodyparms for the message whose structure is described by the calling -B object. - -=head2 bodydisp - -The B object method requires no arguments. It returns the -bodydisp for the message whose structure is described by the calling -B object. - -=head2 bodyid - -The B object method requires no arguments. It returns the -bodyid for the message whose structure is described by the calling -B object. - -=head2 bodydesc - -The B object method requires no arguments. It returns the -bodydesc for the message whose structure is described by the calling -B object. - -=head2 bodyenc - -The B object method requires no arguments. It returns the -bodyenc for the message whose structure is described by the calling -B object. - -=head2 bodysize - -The B object method requires no arguments. It returns the -bodysize for the message whose structure is described by the calling -B object. - -=head2 bodylang - -The B object method requires no arguments. It returns the -bodylang for the message whose structure is described by the calling -B object. - -=head2 bodystructure - -The B object method requires no arguments. It returns -the bodystructure for the message whose structure is described by the -calling B object. - -=head2 envelopestruct - -The B object method requires no arguments. It returns -a B object for the message -from the calling B object. - -=head2 textlines - -The B object method requires no arguments. It returns the -textlines for the message whose structure is described by the calling -B object. - -=head1 Mail::IMAPClient::BodyStructure::Envelope - -The IMAP standard specifies that output from the IMAP B command will be an RFC2060 envelope structure. It further -specifies that output from the B command may also -contain embedded envelope structures (if, for example, a message's -subparts contain one or more included messages). Objects belonging to -B are Perl representations -of these envelope structures, which is to say the nested parenthetical -lists of RFC2060 translated into a Perl datastructure. - -Note that all of the fields relate to the specific part to which they -belong. In other words, output from a FETCH nnnn ENVELOPE command -(or, in B, C<$imap->fetch($msgid,"ENVELOPE")> or -Cget_envelope($msgid)>) are for the message, but -fields from within a bodystructure relate to the message subpart and -not the parent message. - -An envelope structure's B -representation is a hash of thingies that looks like this: - - { - subject => "subject", - inreplyto => "reference_message_id", - from => [ addressStruct1 ], - messageid => "message_id", - bcc => [ addressStruct1, addressStruct2 ], - date => "Tue, 09 Jul 2002 14:15:53 -0400", - replyto => [ adressStruct1, addressStruct2 ], - to => [ adressStruct1, addressStruct2 ], - sender => [ adressStruct1 ], - cc => [ adressStruct1, addressStruct2 ], - } - -The B<...::Envelope> object also has methods for accessing data in the -structure. They are: - -=over 4 - -=item date - -Returns the date of the message. - -=item inreplyto - -Returns the message id of the message to which this message is a reply. - -=item subject - -Returns the subject of the message. - -=item messageid - -Returns the message id of the message. - -=back - -You can also use the following methods to get addressing information. -Each of these methods returns an array of -B objects, which are perl -data structures representing RFC2060 address structures. Some of -these arrays would naturally contain one element (such as B, -which normally contains a single "From:" address); others will often -contain more than one address. However, because RFC2060 defines all -of these as "lists of address structures", they are all translated -into arrays of B<...::Address> objects. - -See the section on B, below, -for alternate (and preferred) ways of accessing these data. - -The methods available are: - -=over 4 - -=item bcc - -Returns an array of blind cc'ed recipients' address structures. -(Don't expect much in here unless the message was sent from the -mailbox you're poking around in, by the way.) - -=item cc - -Returns an array of cc'ed recipients' address structures. - -=item from - -Returns an array of "From:" address structures--usually just one. - -=item replyto - -Returns an array of "Reply-to:" address structures. Once again there -is usually just one address in the list. - -=item sender - -Returns an array of senders' address structures--usually just one and -usually the same as B. - -=item to - -Returns an array of recipients' address structures. - -=back - -Each of the methods that returns a list of address structures (i.e. a -list of B arrays) also has -an analagous method that will return a list of E-Mail addresses -instead. The addresses are in the format Cmailboxname@hostnameE> (see the section on -B, below) However, if the -personal name is 'NIL' then it is omitted from the address. - -These methods are: - -=over 4 - -=item bcc_addresses - -Returns a list (or an array reference if called in scalar context) of -blind cc'ed recipients' email addresses. (Don't expect much in here -unless the message was sent from the mailbox you're poking around in, -by the way.) - -=item cc_addresses - -Returns a list of cc'ed recipients' email addresses. If called in a -scalar context it returns a reference to an array of email addresses. - -=item from_addresses - -Returns a list of "From:" email addresses. If called in a scalar -context it returns the first email address in the list. (It's usually -a list of just one anyway.) - -=item replyto_addresses - -Returns a list of "Reply-to:" email addresses. If called in a scalar -context it returns the first email address in the list. - -=item sender_addresses - -Returns a list of senders' email addresses. If called in a scalar -context it returns the first email address in the list. - -=item to_addresses - -Returns a list of recipients' email addresses. If called in a scalar -context it returns a reference to an array of email addresses. - -=back - -Note that context affects the behavior of all of the above methods. - -Those fields that will commonly contain multiple entries (i.e. they -are recipients) will return an array reference when called in scalar -context. You can use this behavior to optimize performance. - -Those fields that will commonly contain just one address (the -sender's) will return the first (and usually only) address. You can -use this behavior to optimize your development time. - -=head1 Addresses and the Mail::IMAPClient::BodyStructure::Address - -Several components of an envelope structure are address structures. -They are each parsed into their own object, -B, which looks like this: - - { - mailboxname => 'somebody.special', - hostname => 'somplace.weird.com' - personalname => 'Somebody Special - sourceroute => 'NIL' - } - -RFC2060 specifies that each address component of a bodystructure is a -list of address structures, so B -parses each of these into an array of -B objects. - -Each of these objects has the following methods available to it: - -=over 4 - -=item mailboxname - -Returns the "mailboxname" portion of the address, which is the part to -the left of the '@' sign. - -=item hostname - -Returns the "hostname" portion of the address, which is the part to -the right of the '@' sign. - -=item personalname - -Returns the "personalname" portion of the address, which is the part -of the address that's treated like a comment. - -=item sourceroute - -Returns the "sourceroute" portion of the address, which is typically "NIL". - -=back - -Taken together, the parts of an address structure form an address that -will look something like this: - -Cmailboxname@hostnameE> - -Note that because the B -objects come in arrays, it's generally easier to use the methods -available to B to obtain -all of the addresses in a particular array in one operation. These -methods are provided, however, in case you'd rather do things the hard -way. (And also because the aforementioned methods from -B need them anyway.) - -=cut - -=head1 AUTHOR - -Original author: David J. Kernen; Reworked by: Mark Overmeer; -Maintained by Phil Pearl. - -=head1 SEE ALSO - -perl(1), Mail::IMAPClient, Parse::RecDescent, and RFC2060. - -=cut diff --git a/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/BodyStructure/Parse.grammar b/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/BodyStructure/Parse.grammar deleted file mode 100644 index 227ca2c..0000000 --- a/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/BodyStructure/Parse.grammar +++ /dev/null @@ -1,189 +0,0 @@ -# Directives -# ( none) -# Start-up Actions - -{ - my $mibs = "Mail::IMAPClient::BodyStructure"; - my $subpartCount = 0; - my $partCount = 0; - - sub take_optional_items($$@) - { my ($r, $items) = (shift, shift); - foreach (@_) - { my $opt = $_ .'(?)'; - exists $items->{$opt} or next; - $r->{$_} = UNIVERSAL::isa($items->{$opt}, 'ARRAY') - ? $items->{$opt}[0] : $items->{$opt}; - } - } - - sub merge_hash($$) - { my $to = shift; - my $from = shift or return; - while( my($k,$v) = each %$from) { $to->{$k} = $v } - } -} - -# Atoms - -TEXT: /^"TEXT"|^TEXT/i { $return = "TEXT" } -PLAIN: /^"PLAIN"|^PLAIN/i { $return = "PLAIN" } -HTML: /"HTML"|HTML/i { $return = "HTML" } -MESSAGE: /^"MESSAGE"|^MESSAGE/i { $return = "MESSAGE"} -RFC822: /^"RFC822"|^RFC822/i { $return = "RFC822" } -NIL: /^NIL/i { $return = "NIL" } -RFCNONCOMPLY: /^\(\)/i { $return = "NIL" } -NUMBER: /^(\d+)/ { $return = $item[1] } - -# Strings: - -SINGLE_QUOTED_STRING: "'" /(?:\\'|[^'])*/ "'" { $return = $item{__PATTERN1__} } -DOUBLE_QUOTED_STRING: '"' /(?:\\"|[^"])*/ '"' { $return = $item{__PATTERN1__} } - -BARESTRING: ...!/^[)('"]/ /^(?!\(|\))(?:\\ |\S)+/ - { $return = $item{__PATTERN1__} } - -STRING: DOUBLE_QUOTED_STRING | SINGLE_QUOTED_STRING | BARESTRING - -STRINGS: "(" STRING(s) ")" { $return = $item{'STRING(s)'} } - -textlines: NIL | NUMBER - -rfc822message: MESSAGE RFC822 { $return = "MESSAGE RFC822" } - -bodysubtype: PLAIN | HTML | NIL | STRING - -key: STRING -value: NIL | NUMBER | STRING | KVPAIRS - -kvpair: ...!")" key value - { $return = { $item{key} => $item{value} } } - -KVPAIRS: "(" kvpair(s) ")" - { $return = { map { (%$_) } @{$item{'kvpair(s)'}} } } - -bodytype: STRING -bodyparms: NIL | KVPAIRS -bodydisp: NIL | KVPAIRS -bodyid: ...!/[()]/ NIL | STRING -bodydesc: ...!/[()]/ NIL | STRING -bodysize: ...!/[()]/ NIL | NUMBER -bodyenc: NIL | STRING | KVPAIRS -bodyMD5: NIL | STRING -bodylang: NIL | STRING | STRINGS -bodyextra: NIL | STRING | STRINGS -bodyloc: NIL | STRING - -personalname: NIL | STRING -sourceroute: NIL | STRING -mailboxname: NIL | STRING -hostname: NIL | STRING - -addressstruct: "(" personalname sourceroute mailboxname hostname ")" - { bless { personalname => $item{personalname} - , sourceroute => $item{sourceroute} - , mailboxname => $item{mailboxname} - , hostname => $item{hostname} - }, 'Mail::IMAPClient::BodyStructure::Address'; - } - -subject: NIL | STRING -inreplyto: NIL | STRING -messageid: NIL | STRING -date: NIL | STRING - -ADDRESSES: NIL | RFCNONCOMPLY - | "(" addressstruct(s) ")" { $return = $item{'addressstruct(s)'} } - -cc: ADDRESSES -bcc: ADDRESSES -from: ADDRESSES -replyto: ADDRESSES -sender: ADDRESSES -to: ADDRESSES - -envelopestruct: "(" date subject from sender replyto to cc - bcc inreplyto messageid ")" - { $return = bless {}, "Mail::IMAPClient::BodyStructure::Envelope"; - $return->{$_} = $item{$_} - for qw/date subject from sender replyto to cc/ - , qw/bcc inreplyto messageid/; - 1; - } - -basicfields: bodysubtype bodyparms(?) bodyid(?) - bodydesc(?) bodyenc(?) bodysize(?) - { $return = { bodysubtype => $item{bodysubtype} }; - take_optional_items($return, \%item, - qw/bodyparms bodyid bodydesc bodyenc bodysize/); - 1; - } - -textmessage: TEXT basicfields textlines(?) bodyMD5(?) - bodydisp(?) bodylang(?) bodyextra(?) - { - $return = $item{basicfields} || {}; - $return->{bodytype} = 'TEXT'; - take_optional_items($return, \%item - , qw/textlines bodyMD5 bodydisp bodylang bodyextra/); - 1; - } - -othertypemessage: bodytype basicfields bodyMD5(?) bodydisp(?) - bodylang(?) bodyextra(?) - { $return = { bodytype => $item{bodytype} }; - take_optional_items($return, \%item - , qw/bodyMD5 bodydisp bodylang bodyextra/ ); - merge_hash($return, $item{basicfields}); - 1; - } - -nestedmessage: rfc822message bodyparms bodyid bodydesc bodyenc -# bodysize envelopestruct bodystructure textlines - bodysize envelopestruct(?) bodystructure(?) textlines(?) - bodyMD5(?) bodydisp(?) bodylang(?) bodyextra(?) - { - $return = {}; - $return->{$_} = $item{$_} - for qw/bodyparms bodyid bodydesc bodyenc bodysize/; -# envelopestruct bodystructure textlines/; - - take_optional_items($return, \%item - , qw/envelopestruct bodystructure textlines/ - , qw/bodyMD5 bodydisp bodylang bodyextra/); - - merge_hash($return, $item{bodystructure}[0]); - merge_hash($return, $item{basicfields}); - $return->{bodytype} = "MESSAGE" ; - $return->{bodysubtype} = "RFC822" ; - 1; - } - -multipart: subpart(s) bodysubtype - bodyparms(?) bodydisp(?) bodylang(?) bodyloc(?) bodyextra(?) - - { $return = - { bodysubtype => $item{bodysubtype} - , bodytype => 'MULTIPART' - , bodystructure => $item{'subpart(s)'} - }; - take_optional_items($return, \%item - , qw/bodyparms bodydisp bodylang bodyloc bodyextra/); - 1; - } - -subpart: "(" part ")" {$return = $item{part}} - -part: multipart { $return = bless $item{multipart}, $mibs } - | textmessage { $return = bless $item{textmessage}, $mibs } - | nestedmessage { $return = bless $item{nestedmessage}, $mibs } - | othertypemessage { $return = bless $item{othertypemessage}, $mibs } - -bodystructure: "(" part(s) ")" - { $return = $item{'part(s)'} } - -start: /.*?\(.*?BODYSTRUCTURE \(/i part(1) /\).*\)\r?\n?/ - { $return = $item{'part(1)'}[0] } - -envelope: /.*?\(.*?ENVELOPE/ envelopestruct /.*\)/ - { $return = $item{envelopestruct} } diff --git a/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/BodyStructure/Parse.pm b/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/BodyStructure/Parse.pm deleted file mode 100644 index 7d6fded..0000000 --- a/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/BodyStructure/Parse.pm +++ /dev/null @@ -1,16801 +0,0 @@ -package Mail::IMAPClient::BodyStructure::Parse; -use Parse::RecDescent; - -{ my $ERRORS; - - -package Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse; -use strict; -use vars qw($skip $AUTOLOAD ); -@Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::ISA = (); -$skip = '\s*'; - - my $mibs = "Mail::IMAPClient::BodyStructure"; - my $subpartCount = 0; - my $partCount = 0; - - sub take_optional_items($$@) - { my ($r, $items) = (shift, shift); - foreach (@_) - { my $opt = $_ .'(?)'; - exists $items->{$opt} or next; - $r->{$_} = UNIVERSAL::isa($items->{$opt}, 'ARRAY') - ? $items->{$opt}[0] : $items->{$opt}; - } - } - - sub merge_hash($$) - { my $to = shift; - my $from = shift or return; - while( my($k,$v) = each %$from) { $to->{$k} = $v } - } -; - - -{ -local $SIG{__WARN__} = sub {0}; -# PRETEND TO BE IN Parse::RecDescent NAMESPACE -*Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::AUTOLOAD = sub -{ - no strict 'refs'; - $AUTOLOAD =~ s/^Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse/Parse::RecDescent/; - goto &{$AUTOLOAD}; -} -} - -push @Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::ISA, 'Parse::RecDescent'; -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyparms -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"bodyparms"}; - - Parse::RecDescent::_trace(q{Trying rule: [bodyparms]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyparms}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{NIL, or KVPAIRS}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyparms}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{bodyparms}); - %item = (__RULE__ => q{bodyparms}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{bodyparms}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodyparms}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodyparms}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodyparms}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [KVPAIRS]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyparms}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{bodyparms}); - %item = (__RULE__ => q{bodyparms}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [KVPAIRS]}, - Parse::RecDescent::_tracefirst($text), - q{bodyparms}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::KVPAIRS($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodyparms}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [KVPAIRS]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodyparms}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{KVPAIRS}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [KVPAIRS]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodyparms}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyparms}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{bodyparms}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{bodyparms}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{bodyparms}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::date -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"date"}; - - Parse::RecDescent::_trace(q{Trying rule: [date]}, - Parse::RecDescent::_tracefirst($_[1]), - q{date}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{NIL, or STRING}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{date}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{date}); - %item = (__RULE__ => q{date}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{date}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{date}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{date}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{date}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{date}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{date}); - %item = (__RULE__ => q{date}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRING]}, - Parse::RecDescent::_tracefirst($text), - q{date}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{date}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{date}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{date}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{date}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{date}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{date}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{date}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodysubtype -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"bodysubtype"}; - - Parse::RecDescent::_trace(q{Trying rule: [bodysubtype]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{PLAIN, or HTML, or NIL, or STRING}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [PLAIN]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{bodysubtype}); - %item = (__RULE__ => q{bodysubtype}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [PLAIN]}, - Parse::RecDescent::_tracefirst($text), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::PLAIN($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [PLAIN]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{PLAIN}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [PLAIN]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [HTML]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{bodysubtype}); - %item = (__RULE__ => q{bodysubtype}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [HTML]}, - Parse::RecDescent::_tracefirst($text), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::HTML($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [HTML]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{HTML}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [HTML]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[2]; - $text = $_[1]; - my $_savetext; - @item = (q{bodysubtype}); - %item = (__RULE__ => q{bodysubtype}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[3]; - $text = $_[1]; - my $_savetext; - @item = (q{bodysubtype}); - %item = (__RULE__ => q{bodysubtype}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRING]}, - Parse::RecDescent::_tracefirst($text), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{bodysubtype}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{bodysubtype}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{bodysubtype}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::hostname -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"hostname"}; - - Parse::RecDescent::_trace(q{Trying rule: [hostname]}, - Parse::RecDescent::_tracefirst($_[1]), - q{hostname}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{NIL, or STRING}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{hostname}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{hostname}); - %item = (__RULE__ => q{hostname}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{hostname}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{hostname}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{hostname}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{hostname}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{hostname}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{hostname}); - %item = (__RULE__ => q{hostname}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRING]}, - Parse::RecDescent::_tracefirst($text), - q{hostname}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{hostname}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{hostname}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{hostname}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{hostname}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{hostname}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{hostname}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{hostname}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::basicfields -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"basicfields"}; - - Parse::RecDescent::_trace(q{Trying rule: [basicfields]}, - Parse::RecDescent::_tracefirst($_[1]), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{bodysubtype}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [bodysubtype bodyparms bodyid bodydesc bodyenc bodysize]}, - Parse::RecDescent::_tracefirst($_[1]), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{basicfields}); - %item = (__RULE__ => q{basicfields}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [bodysubtype]}, - Parse::RecDescent::_tracefirst($text), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodysubtype($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [bodysubtype]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodysubtype}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodyparms]}, - Parse::RecDescent::_tracefirst($text), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodyparms})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyparms, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodyparms]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodyparms(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodyid]}, - Parse::RecDescent::_tracefirst($text), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodyid})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyid, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodyid]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodyid(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodydesc]}, - Parse::RecDescent::_tracefirst($text), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodydesc})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodydesc, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodydesc]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodydesc(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodyenc]}, - Parse::RecDescent::_tracefirst($text), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodyenc})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyenc, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodyenc]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodyenc(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodysize]}, - Parse::RecDescent::_tracefirst($text), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodysize})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodysize, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodysize]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodysize(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = { bodysubtype => $item{bodysubtype} }; - take_optional_items($return, \%item, - qw/bodyparms bodyid bodydesc bodyenc bodysize/); - 1; - }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [bodysubtype bodyparms bodyid bodydesc bodyenc bodysize]<<}, - Parse::RecDescent::_tracefirst($text), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{basicfields}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{basicfields}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{basicfields}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::personalname -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"personalname"}; - - Parse::RecDescent::_trace(q{Trying rule: [personalname]}, - Parse::RecDescent::_tracefirst($_[1]), - q{personalname}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{NIL, or STRING}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{personalname}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{personalname}); - %item = (__RULE__ => q{personalname}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{personalname}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{personalname}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{personalname}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{personalname}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{personalname}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{personalname}); - %item = (__RULE__ => q{personalname}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRING]}, - Parse::RecDescent::_tracefirst($text), - q{personalname}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{personalname}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{personalname}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{personalname}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{personalname}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{personalname}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{personalname}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{personalname}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::key -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"key"}; - - Parse::RecDescent::_trace(q{Trying rule: [key]}, - Parse::RecDescent::_tracefirst($_[1]), - q{key}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{STRING}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{key}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{key}); - %item = (__RULE__ => q{key}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRING]}, - Parse::RecDescent::_tracefirst($text), - q{key}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{key}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{key}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{key}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{key}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{key}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{key}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{key}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::cc -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"cc"}; - - Parse::RecDescent::_trace(q{Trying rule: [cc]}, - Parse::RecDescent::_tracefirst($_[1]), - q{cc}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{ADDRESSES}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [ADDRESSES]}, - Parse::RecDescent::_tracefirst($_[1]), - q{cc}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{cc}); - %item = (__RULE__ => q{cc}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [ADDRESSES]}, - Parse::RecDescent::_tracefirst($text), - q{cc}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::ADDRESSES($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{cc}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [ADDRESSES]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{cc}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{ADDRESSES}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [ADDRESSES]<<}, - Parse::RecDescent::_tracefirst($text), - q{cc}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{cc}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{cc}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{cc}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{cc}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyMD5 -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"bodyMD5"}; - - Parse::RecDescent::_trace(q{Trying rule: [bodyMD5]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyMD5}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{NIL, or STRING}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyMD5}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{bodyMD5}); - %item = (__RULE__ => q{bodyMD5}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{bodyMD5}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodyMD5}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodyMD5}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodyMD5}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyMD5}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{bodyMD5}); - %item = (__RULE__ => q{bodyMD5}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRING]}, - Parse::RecDescent::_tracefirst($text), - q{bodyMD5}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodyMD5}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodyMD5}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodyMD5}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyMD5}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{bodyMD5}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{bodyMD5}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{bodyMD5}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::envelope -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"envelope"}; - - Parse::RecDescent::_trace(q{Trying rule: [envelope]}, - Parse::RecDescent::_tracefirst($_[1]), - q{envelope}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{/.*?\\(.*?ENVELOPE/}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [/.*?\\(.*?ENVELOPE/ envelopestruct /.*\\)/]}, - Parse::RecDescent::_tracefirst($_[1]), - q{envelope}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{envelope}); - %item = (__RULE__ => q{envelope}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: [/.*?\\(.*?ENVELOPE/]}, Parse::RecDescent::_tracefirst($text), - q{envelope}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:.*?\(.*?ENVELOPE)/) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN1__}=$current_match; - - - Parse::RecDescent::_trace(q{Trying subrule: [envelopestruct]}, - Parse::RecDescent::_tracefirst($text), - q{envelope}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{envelopestruct})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::envelopestruct($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{envelope}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [envelopestruct]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{envelope}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{envelopestruct}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying terminal: [/.*\\)/]}, Parse::RecDescent::_tracefirst($text), - q{envelope}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{/.*\\)/})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:.*\))/) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN2__}=$current_match; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{envelope}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = $item{envelopestruct} }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [/.*?\\(.*?ENVELOPE/ envelopestruct /.*\\)/]<<}, - Parse::RecDescent::_tracefirst($text), - q{envelope}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{envelope}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{envelope}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{envelope}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{envelope}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::MESSAGE -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"MESSAGE"}; - - Parse::RecDescent::_trace(q{Trying rule: [MESSAGE]}, - Parse::RecDescent::_tracefirst($_[1]), - q{MESSAGE}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{/^"MESSAGE"|^MESSAGE/i}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [/^"MESSAGE"|^MESSAGE/i]}, - Parse::RecDescent::_tracefirst($_[1]), - q{MESSAGE}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{MESSAGE}); - %item = (__RULE__ => q{MESSAGE}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: [/^"MESSAGE"|^MESSAGE/i]}, Parse::RecDescent::_tracefirst($text), - q{MESSAGE}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:^"MESSAGE"|^MESSAGE)/i) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN1__}=$current_match; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{MESSAGE}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = "MESSAGE"}; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [/^"MESSAGE"|^MESSAGE/i]<<}, - Parse::RecDescent::_tracefirst($text), - q{MESSAGE}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{MESSAGE}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{MESSAGE}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{MESSAGE}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{MESSAGE}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::DOUBLE_QUOTED_STRING -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"DOUBLE_QUOTED_STRING"}; - - Parse::RecDescent::_trace(q{Trying rule: [DOUBLE_QUOTED_STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{DOUBLE_QUOTED_STRING}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{'"'}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: ['"' /(?:\\\\"|[^"])*/ '"']}, - Parse::RecDescent::_tracefirst($_[1]), - q{DOUBLE_QUOTED_STRING}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{DOUBLE_QUOTED_STRING}); - %item = (__RULE__ => q{DOUBLE_QUOTED_STRING}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: ['"']}, - Parse::RecDescent::_tracefirst($text), - q{DOUBLE_QUOTED_STRING}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A\"/) - { - - $expectation->failed(); - Parse::RecDescent::_trace(qq{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING1__}=$current_match; - - - Parse::RecDescent::_trace(q{Trying terminal: [/(?:\\\\"|[^"])*/]}, Parse::RecDescent::_tracefirst($text), - q{DOUBLE_QUOTED_STRING}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{/(?:\\\\"|[^"])*/})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:(?:\\"|[^"])*)/) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN1__}=$current_match; - - - Parse::RecDescent::_trace(q{Trying terminal: ['"']}, - Parse::RecDescent::_tracefirst($text), - q{DOUBLE_QUOTED_STRING}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{'"'})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A\"/) - { - - $expectation->failed(); - Parse::RecDescent::_trace(qq{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING2__}=$current_match; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{DOUBLE_QUOTED_STRING}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = $item{__PATTERN1__} }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: ['"' /(?:\\\\"|[^"])*/ '"']<<}, - Parse::RecDescent::_tracefirst($text), - q{DOUBLE_QUOTED_STRING}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{DOUBLE_QUOTED_STRING}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{DOUBLE_QUOTED_STRING}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{DOUBLE_QUOTED_STRING}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{DOUBLE_QUOTED_STRING}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::subject -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"subject"}; - - Parse::RecDescent::_trace(q{Trying rule: [subject]}, - Parse::RecDescent::_tracefirst($_[1]), - q{subject}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{NIL, or STRING}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{subject}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{subject}); - %item = (__RULE__ => q{subject}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{subject}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{subject}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{subject}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{subject}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{subject}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{subject}); - %item = (__RULE__ => q{subject}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRING]}, - Parse::RecDescent::_tracefirst($text), - q{subject}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{subject}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{subject}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{subject}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{subject}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{subject}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{subject}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{subject}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::value -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"value"}; - - Parse::RecDescent::_trace(q{Trying rule: [value]}, - Parse::RecDescent::_tracefirst($_[1]), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{NIL, or NUMBER, or STRING, or KVPAIRS}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{value}); - %item = (__RULE__ => q{value}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NUMBER]}, - Parse::RecDescent::_tracefirst($_[1]), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{value}); - %item = (__RULE__ => q{value}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NUMBER]}, - Parse::RecDescent::_tracefirst($text), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NUMBER($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NUMBER]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NUMBER}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NUMBER]<<}, - Parse::RecDescent::_tracefirst($text), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[2]; - $text = $_[1]; - my $_savetext; - @item = (q{value}); - %item = (__RULE__ => q{value}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRING]}, - Parse::RecDescent::_tracefirst($text), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [KVPAIRS]}, - Parse::RecDescent::_tracefirst($_[1]), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[3]; - $text = $_[1]; - my $_savetext; - @item = (q{value}); - %item = (__RULE__ => q{value}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [KVPAIRS]}, - Parse::RecDescent::_tracefirst($text), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::KVPAIRS($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [KVPAIRS]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{KVPAIRS}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [KVPAIRS]<<}, - Parse::RecDescent::_tracefirst($text), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{value}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{value}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{value}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{value}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::inreplyto -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"inreplyto"}; - - Parse::RecDescent::_trace(q{Trying rule: [inreplyto]}, - Parse::RecDescent::_tracefirst($_[1]), - q{inreplyto}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{NIL, or STRING}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{inreplyto}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{inreplyto}); - %item = (__RULE__ => q{inreplyto}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{inreplyto}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{inreplyto}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{inreplyto}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{inreplyto}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{inreplyto}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{inreplyto}); - %item = (__RULE__ => q{inreplyto}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRING]}, - Parse::RecDescent::_tracefirst($text), - q{inreplyto}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{inreplyto}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{inreplyto}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{inreplyto}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{inreplyto}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{inreplyto}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{inreplyto}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{inreplyto}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::messageid -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"messageid"}; - - Parse::RecDescent::_trace(q{Trying rule: [messageid]}, - Parse::RecDescent::_tracefirst($_[1]), - q{messageid}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{NIL, or STRING}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{messageid}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{messageid}); - %item = (__RULE__ => q{messageid}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{messageid}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{messageid}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{messageid}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{messageid}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{messageid}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{messageid}); - %item = (__RULE__ => q{messageid}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRING]}, - Parse::RecDescent::_tracefirst($text), - q{messageid}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{messageid}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{messageid}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{messageid}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{messageid}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{messageid}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{messageid}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{messageid}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::sender -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"sender"}; - - Parse::RecDescent::_trace(q{Trying rule: [sender]}, - Parse::RecDescent::_tracefirst($_[1]), - q{sender}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{ADDRESSES}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [ADDRESSES]}, - Parse::RecDescent::_tracefirst($_[1]), - q{sender}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{sender}); - %item = (__RULE__ => q{sender}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [ADDRESSES]}, - Parse::RecDescent::_tracefirst($text), - q{sender}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::ADDRESSES($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{sender}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [ADDRESSES]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{sender}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{ADDRESSES}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [ADDRESSES]<<}, - Parse::RecDescent::_tracefirst($text), - q{sender}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{sender}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{sender}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{sender}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{sender}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::multipart -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"multipart"}; - - Parse::RecDescent::_trace(q{Trying rule: [multipart]}, - Parse::RecDescent::_tracefirst($_[1]), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{subpart}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [subpart bodysubtype bodyparms bodydisp bodylang bodyloc bodyextra ]}, - Parse::RecDescent::_tracefirst($_[1]), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{multipart}); - %item = (__RULE__ => q{multipart}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [subpart]}, - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::subpart, 1, 100000000, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [subpart]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{subpart(s)}} = $_tok; - push @item, $_tok; - - - - - - Parse::RecDescent::_trace(q{Trying directive: []}, - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - $_tok = do { $commit = 1 }; - if (defined($_tok)) - { - Parse::RecDescent::_trace(q{>>Matched directive<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - } - else - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - } - - last unless defined $_tok; - push @item, $item{__DIRECTIVE1__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying subrule: [bodysubtype]}, - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{bodysubtype})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodysubtype($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [bodysubtype]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodysubtype}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodyparms]}, - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodyparms})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyparms, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodyparms]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodyparms(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodydisp]}, - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodydisp})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodydisp, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodydisp]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodydisp(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodylang]}, - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodylang})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodylang, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodylang]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodylang(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodyloc]}, - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodyloc})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyloc, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodyloc]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodyloc(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodyextra]}, - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodyextra})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyextra, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodyextra]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodyextra(?)}} = $_tok; - push @item, $_tok; - - - - - - Parse::RecDescent::_trace(q{Trying directive: []}, - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - $_tok = do { push @{$thisparser->{deferred}}, sub { $subpartCount = 0 }; }; - if (defined($_tok)) - { - Parse::RecDescent::_trace(q{>>Matched directive<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - } - else - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - } - - last unless defined $_tok; - push @item, $item{__DIRECTIVE2__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = - { bodysubtype => $item{bodysubtype} - , bodytype => 'MULTIPART' - , bodystructure => $item{'subpart(s)'} - }; - take_optional_items($return, \%item - , qw/bodyparms bodydisp bodylang bodyloc bodyextra/); - 1; - }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [subpart bodysubtype bodyparms bodydisp bodylang bodyloc bodyextra ]<<}, - Parse::RecDescent::_tracefirst($text), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{multipart}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{multipart}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{multipart}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyenc -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"bodyenc"}; - - Parse::RecDescent::_trace(q{Trying rule: [bodyenc]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyenc}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{NIL, or STRING, or KVPAIRS}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyenc}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{bodyenc}); - %item = (__RULE__ => q{bodyenc}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{bodyenc}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodyenc}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodyenc}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodyenc}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyenc}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{bodyenc}); - %item = (__RULE__ => q{bodyenc}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRING]}, - Parse::RecDescent::_tracefirst($text), - q{bodyenc}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodyenc}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodyenc}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodyenc}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [KVPAIRS]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyenc}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[2]; - $text = $_[1]; - my $_savetext; - @item = (q{bodyenc}); - %item = (__RULE__ => q{bodyenc}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [KVPAIRS]}, - Parse::RecDescent::_tracefirst($text), - q{bodyenc}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::KVPAIRS($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodyenc}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [KVPAIRS]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodyenc}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{KVPAIRS}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [KVPAIRS]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodyenc}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyenc}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{bodyenc}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{bodyenc}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{bodyenc}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodydesc -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"bodydesc"}; - - Parse::RecDescent::_trace(q{Trying rule: [bodydesc]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodydesc}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{/[()]/, or STRING}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [/[()]/ NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodydesc}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{bodydesc}); - %item = (__RULE__ => q{bodydesc}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: [/[()]/]}, Parse::RecDescent::_tracefirst($text), - q{bodydesc}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - $_savetext = $text; - - if ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:[()])/) - { - $text = $_savetext; - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN1__}=$current_match; - $text = $_savetext; - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{bodydesc}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{NIL})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodydesc}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodydesc}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [/[()]/ NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodydesc}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodydesc}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{bodydesc}); - %item = (__RULE__ => q{bodydesc}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRING]}, - Parse::RecDescent::_tracefirst($text), - q{bodydesc}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodydesc}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodydesc}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodydesc}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodydesc}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{bodydesc}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{bodydesc}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{bodydesc}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::start -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"start"}; - - Parse::RecDescent::_trace(q{Trying rule: [start]}, - Parse::RecDescent::_tracefirst($_[1]), - q{start}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{/.*?\\(.*?BODYSTRUCTURE \\(/i}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [/.*?\\(.*?BODYSTRUCTURE \\(/i part /\\).*\\)\\r?\\n?/]}, - Parse::RecDescent::_tracefirst($_[1]), - q{start}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{start}); - %item = (__RULE__ => q{start}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: [/.*?\\(.*?BODYSTRUCTURE \\(/i]}, Parse::RecDescent::_tracefirst($text), - q{start}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:.*?\(.*?BODYSTRUCTURE \()/i) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN1__}=$current_match; - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [part]}, - Parse::RecDescent::_tracefirst($text), - q{start}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{part})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::part, 1, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{start}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [part]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{start}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{part(1)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying terminal: [/\\).*\\)\\r?\\n?/]}, Parse::RecDescent::_tracefirst($text), - q{start}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{/\\).*\\)\\r?\\n?/})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:\).*\)\r?\n?)/) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN2__}=$current_match; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{start}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = $item{'part(1)'}[0] }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [/.*?\\(.*?BODYSTRUCTURE \\(/i part /\\).*\\)\\r?\\n?/]<<}, - Parse::RecDescent::_tracefirst($text), - q{start}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{start}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{start}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{start}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{start}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::RFC822 -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"RFC822"}; - - Parse::RecDescent::_trace(q{Trying rule: [RFC822]}, - Parse::RecDescent::_tracefirst($_[1]), - q{RFC822}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{/^"RFC822"|^RFC822/i}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [/^"RFC822"|^RFC822/i]}, - Parse::RecDescent::_tracefirst($_[1]), - q{RFC822}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{RFC822}); - %item = (__RULE__ => q{RFC822}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: [/^"RFC822"|^RFC822/i]}, Parse::RecDescent::_tracefirst($text), - q{RFC822}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:^"RFC822"|^RFC822)/i) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN1__}=$current_match; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{RFC822}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = "RFC822" }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [/^"RFC822"|^RFC822/i]<<}, - Parse::RecDescent::_tracefirst($text), - q{RFC822}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{RFC822}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{RFC822}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{RFC822}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{RFC822}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::RFCNONCOMPLY -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"RFCNONCOMPLY"}; - - Parse::RecDescent::_trace(q{Trying rule: [RFCNONCOMPLY]}, - Parse::RecDescent::_tracefirst($_[1]), - q{RFCNONCOMPLY}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{/^\\(\\)/i}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [/^\\(\\)/i]}, - Parse::RecDescent::_tracefirst($_[1]), - q{RFCNONCOMPLY}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{RFCNONCOMPLY}); - %item = (__RULE__ => q{RFCNONCOMPLY}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: [/^\\(\\)/i]}, Parse::RecDescent::_tracefirst($text), - q{RFCNONCOMPLY}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:^\(\))/i) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN1__}=$current_match; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{RFCNONCOMPLY}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = "NIL" }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [/^\\(\\)/i]<<}, - Parse::RecDescent::_tracefirst($text), - q{RFCNONCOMPLY}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{RFCNONCOMPLY}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{RFCNONCOMPLY}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{RFCNONCOMPLY}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{RFCNONCOMPLY}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::textmessage -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"textmessage"}; - - Parse::RecDescent::_trace(q{Trying rule: [textmessage]}, - Parse::RecDescent::_tracefirst($_[1]), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{TEXT}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [TEXT basicfields textlines bodyMD5 bodydisp bodylang bodyextra]}, - Parse::RecDescent::_tracefirst($_[1]), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{textmessage}); - %item = (__RULE__ => q{textmessage}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [TEXT]}, - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::TEXT($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [TEXT]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{TEXT}} = $_tok; - push @item, $_tok; - - } - - - - Parse::RecDescent::_trace(q{Trying directive: []}, - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - $_tok = do { $commit = 1 }; - if (defined($_tok)) - { - Parse::RecDescent::_trace(q{>>Matched directive<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - } - else - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - } - - last unless defined $_tok; - push @item, $item{__DIRECTIVE1__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying subrule: [basicfields]}, - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{basicfields})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::basicfields($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [basicfields]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{basicfields}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying repeated subrule: [textlines]}, - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{textlines})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::textlines, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [textlines]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{textlines(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodyMD5]}, - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodyMD5})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyMD5, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodyMD5]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodyMD5(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodydisp]}, - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodydisp})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodydisp, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodydisp]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodydisp(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodylang]}, - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodylang})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodylang, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodylang]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodylang(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodyextra]}, - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodyextra})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyextra, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodyextra]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodyextra(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { - $return = $item{basicfields} || {}; - $return->{bodytype} = 'TEXT'; - take_optional_items($return, \%item - , qw/textlines bodyMD5 bodydisp bodylang bodyextra/); - 1; - }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [TEXT basicfields textlines bodyMD5 bodydisp bodylang bodyextra]<<}, - Parse::RecDescent::_tracefirst($text), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{textmessage}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{textmessage}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{textmessage}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyid -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"bodyid"}; - - Parse::RecDescent::_trace(q{Trying rule: [bodyid]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyid}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{/[()]/, or STRING}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [/[()]/ NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyid}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{bodyid}); - %item = (__RULE__ => q{bodyid}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: [/[()]/]}, Parse::RecDescent::_tracefirst($text), - q{bodyid}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - $_savetext = $text; - - if ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:[()])/) - { - $text = $_savetext; - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN1__}=$current_match; - $text = $_savetext; - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{bodyid}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{NIL})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodyid}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodyid}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [/[()]/ NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodyid}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyid}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{bodyid}); - %item = (__RULE__ => q{bodyid}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRING]}, - Parse::RecDescent::_tracefirst($text), - q{bodyid}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodyid}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodyid}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodyid}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyid}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{bodyid}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{bodyid}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{bodyid}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyextra -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"bodyextra"}; - - Parse::RecDescent::_trace(q{Trying rule: [bodyextra]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyextra}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{NIL, or STRING, or STRINGS}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyextra}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{bodyextra}); - %item = (__RULE__ => q{bodyextra}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{bodyextra}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodyextra}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodyextra}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodyextra}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyextra}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{bodyextra}); - %item = (__RULE__ => q{bodyextra}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRING]}, - Parse::RecDescent::_tracefirst($text), - q{bodyextra}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodyextra}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodyextra}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodyextra}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRINGS]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyextra}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[2]; - $text = $_[1]; - my $_savetext; - @item = (q{bodyextra}); - %item = (__RULE__ => q{bodyextra}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRINGS]}, - Parse::RecDescent::_tracefirst($text), - q{bodyextra}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRINGS($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodyextra}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRINGS]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodyextra}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRINGS}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRINGS]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodyextra}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyextra}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{bodyextra}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{bodyextra}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{bodyextra}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::othertypemessage -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"othertypemessage"}; - - Parse::RecDescent::_trace(q{Trying rule: [othertypemessage]}, - Parse::RecDescent::_tracefirst($_[1]), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{bodytype}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [bodytype basicfields bodyMD5 bodydisp bodylang bodyextra]}, - Parse::RecDescent::_tracefirst($_[1]), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{othertypemessage}); - %item = (__RULE__ => q{othertypemessage}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [bodytype]}, - Parse::RecDescent::_tracefirst($text), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodytype($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [bodytype]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodytype}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying subrule: [basicfields]}, - Parse::RecDescent::_tracefirst($text), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{basicfields})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::basicfields($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [basicfields]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{basicfields}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodyMD5]}, - Parse::RecDescent::_tracefirst($text), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodyMD5})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyMD5, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodyMD5]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodyMD5(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodydisp]}, - Parse::RecDescent::_tracefirst($text), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodydisp})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodydisp, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodydisp]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodydisp(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodylang]}, - Parse::RecDescent::_tracefirst($text), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodylang})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodylang, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodylang]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodylang(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodyextra]}, - Parse::RecDescent::_tracefirst($text), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodyextra})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyextra, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodyextra]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodyextra(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = { bodytype => $item{bodytype} }; - take_optional_items($return, \%item - , qw/bodyMD5 bodydisp bodylang bodyextra/ ); - merge_hash($return, $item{basicfields}); - 1; - }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [bodytype basicfields bodyMD5 bodydisp bodylang bodyextra]<<}, - Parse::RecDescent::_tracefirst($text), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{othertypemessage}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{othertypemessage}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{othertypemessage}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::kvpair -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"kvpair"}; - - Parse::RecDescent::_trace(q{Trying rule: [kvpair]}, - Parse::RecDescent::_tracefirst($_[1]), - q{kvpair}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{')'}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [')' key value]}, - Parse::RecDescent::_tracefirst($_[1]), - q{kvpair}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{kvpair}); - %item = (__RULE__ => q{kvpair}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: [')']}, - Parse::RecDescent::_tracefirst($text), - q{kvpair}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - $_savetext = $text; - - if ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = ")"; 1 } and - substr($text,0,length($_tok)) eq $_tok and - do { substr($text,0,length($_tok)) = ""; 1; } - ) - { - $text = $_savetext; - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING1__}=$_tok; - $text = $_savetext; - - Parse::RecDescent::_trace(q{Trying subrule: [key]}, - Parse::RecDescent::_tracefirst($text), - q{kvpair}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{key})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::key($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{kvpair}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [key]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{kvpair}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{key}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying subrule: [value]}, - Parse::RecDescent::_tracefirst($text), - q{kvpair}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{value})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::value($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{kvpair}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [value]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{kvpair}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{value}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{kvpair}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = { $item{key} => $item{value} } }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [')' key value]<<}, - Parse::RecDescent::_tracefirst($text), - q{kvpair}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{kvpair}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{kvpair}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{kvpair}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{kvpair}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodysize -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"bodysize"}; - - Parse::RecDescent::_trace(q{Trying rule: [bodysize]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodysize}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{/[()]/, or NUMBER}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [/[()]/ NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodysize}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{bodysize}); - %item = (__RULE__ => q{bodysize}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: [/[()]/]}, Parse::RecDescent::_tracefirst($text), - q{bodysize}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - $_savetext = $text; - - if ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:[()])/) - { - $text = $_savetext; - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN1__}=$current_match; - $text = $_savetext; - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{bodysize}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{NIL})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodysize}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodysize}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [/[()]/ NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodysize}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NUMBER]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodysize}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{bodysize}); - %item = (__RULE__ => q{bodysize}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NUMBER]}, - Parse::RecDescent::_tracefirst($text), - q{bodysize}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NUMBER($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodysize}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NUMBER]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodysize}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NUMBER}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NUMBER]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodysize}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodysize}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{bodysize}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{bodysize}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{bodysize}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"STRING"}; - - Parse::RecDescent::_trace(q{Trying rule: [STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{STRING}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{DOUBLE_QUOTED_STRING, or SINGLE_QUOTED_STRING, or BARESTRING}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [DOUBLE_QUOTED_STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{STRING}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{STRING}); - %item = (__RULE__ => q{STRING}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [DOUBLE_QUOTED_STRING]}, - Parse::RecDescent::_tracefirst($text), - q{STRING}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::DOUBLE_QUOTED_STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{STRING}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [DOUBLE_QUOTED_STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{STRING}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{DOUBLE_QUOTED_STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [DOUBLE_QUOTED_STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{STRING}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [SINGLE_QUOTED_STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{STRING}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{STRING}); - %item = (__RULE__ => q{STRING}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [SINGLE_QUOTED_STRING]}, - Parse::RecDescent::_tracefirst($text), - q{STRING}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::SINGLE_QUOTED_STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{STRING}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [SINGLE_QUOTED_STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{STRING}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{SINGLE_QUOTED_STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [SINGLE_QUOTED_STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{STRING}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [BARESTRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{STRING}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[2]; - $text = $_[1]; - my $_savetext; - @item = (q{STRING}); - %item = (__RULE__ => q{STRING}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [BARESTRING]}, - Parse::RecDescent::_tracefirst($text), - q{STRING}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::BARESTRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{STRING}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [BARESTRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{STRING}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{BARESTRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [BARESTRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{STRING}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{STRING}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{STRING}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{STRING}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{STRING}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodytype -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"bodytype"}; - - Parse::RecDescent::_trace(q{Trying rule: [bodytype]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodytype}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{STRING}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodytype}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{bodytype}); - %item = (__RULE__ => q{bodytype}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRING]}, - Parse::RecDescent::_tracefirst($text), - q{bodytype}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodytype}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodytype}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodytype}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodytype}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{bodytype}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{bodytype}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{bodytype}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::TEXT -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"TEXT"}; - - Parse::RecDescent::_trace(q{Trying rule: [TEXT]}, - Parse::RecDescent::_tracefirst($_[1]), - q{TEXT}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{/^"TEXT"|^TEXT/i}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [/^"TEXT"|^TEXT/i]}, - Parse::RecDescent::_tracefirst($_[1]), - q{TEXT}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{TEXT}); - %item = (__RULE__ => q{TEXT}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: [/^"TEXT"|^TEXT/i]}, Parse::RecDescent::_tracefirst($text), - q{TEXT}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:^"TEXT"|^TEXT)/i) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN1__}=$current_match; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{TEXT}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = "TEXT" }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [/^"TEXT"|^TEXT/i]<<}, - Parse::RecDescent::_tracefirst($text), - q{TEXT}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{TEXT}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{TEXT}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{TEXT}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{TEXT}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::to -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"to"}; - - Parse::RecDescent::_trace(q{Trying rule: [to]}, - Parse::RecDescent::_tracefirst($_[1]), - q{to}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{ADDRESSES}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [ADDRESSES]}, - Parse::RecDescent::_tracefirst($_[1]), - q{to}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{to}); - %item = (__RULE__ => q{to}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [ADDRESSES]}, - Parse::RecDescent::_tracefirst($text), - q{to}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::ADDRESSES($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{to}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [ADDRESSES]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{to}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{ADDRESSES}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [ADDRESSES]<<}, - Parse::RecDescent::_tracefirst($text), - q{to}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{to}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{to}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{to}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{to}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"NIL"}; - - Parse::RecDescent::_trace(q{Trying rule: [NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{NIL}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{/^NIL/i}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [/^NIL/i]}, - Parse::RecDescent::_tracefirst($_[1]), - q{NIL}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{NIL}); - %item = (__RULE__ => q{NIL}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: [/^NIL/i]}, Parse::RecDescent::_tracefirst($text), - q{NIL}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:^NIL)/i) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN1__}=$current_match; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{NIL}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = "NIL" }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [/^NIL/i]<<}, - Parse::RecDescent::_tracefirst($text), - q{NIL}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{NIL}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{NIL}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{NIL}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{NIL}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::KVPAIRS -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"KVPAIRS"}; - - Parse::RecDescent::_trace(q{Trying rule: [KVPAIRS]}, - Parse::RecDescent::_tracefirst($_[1]), - q{KVPAIRS}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{'('}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: ['(' kvpair ')']}, - Parse::RecDescent::_tracefirst($_[1]), - q{KVPAIRS}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{KVPAIRS}); - %item = (__RULE__ => q{KVPAIRS}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: ['(']}, - Parse::RecDescent::_tracefirst($text), - q{KVPAIRS}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = "("; 1 } and - substr($text,0,length($_tok)) eq $_tok and - do { substr($text,0,length($_tok)) = ""; 1; } - ) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING1__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [kvpair]}, - Parse::RecDescent::_tracefirst($text), - q{KVPAIRS}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{kvpair})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::kvpair, 1, 100000000, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{KVPAIRS}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [kvpair]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{KVPAIRS}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{kvpair(s)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying terminal: [')']}, - Parse::RecDescent::_tracefirst($text), - q{KVPAIRS}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{')'})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = ")"; 1 } and - substr($text,0,length($_tok)) eq $_tok and - do { substr($text,0,length($_tok)) = ""; 1; } - ) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING2__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{KVPAIRS}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = { map { (%$_) } @{$item{'kvpair(s)'}} } }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: ['(' kvpair ')']<<}, - Parse::RecDescent::_tracefirst($text), - q{KVPAIRS}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{KVPAIRS}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{KVPAIRS}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{KVPAIRS}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{KVPAIRS}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::from -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"from"}; - - Parse::RecDescent::_trace(q{Trying rule: [from]}, - Parse::RecDescent::_tracefirst($_[1]), - q{from}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{ADDRESSES}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [ADDRESSES]}, - Parse::RecDescent::_tracefirst($_[1]), - q{from}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{from}); - %item = (__RULE__ => q{from}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [ADDRESSES]}, - Parse::RecDescent::_tracefirst($text), - q{from}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::ADDRESSES($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{from}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [ADDRESSES]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{from}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{ADDRESSES}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [ADDRESSES]<<}, - Parse::RecDescent::_tracefirst($text), - q{from}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{from}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{from}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{from}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{from}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodystructure -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"bodystructure"}; - - Parse::RecDescent::_trace(q{Trying rule: [bodystructure]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodystructure}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{'('}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: ['(' part ')']}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodystructure}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{bodystructure}); - %item = (__RULE__ => q{bodystructure}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: ['(']}, - Parse::RecDescent::_tracefirst($text), - q{bodystructure}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = "("; 1 } and - substr($text,0,length($_tok)) eq $_tok and - do { substr($text,0,length($_tok)) = ""; 1; } - ) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING1__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [part]}, - Parse::RecDescent::_tracefirst($text), - q{bodystructure}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{part})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::part, 1, 100000000, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodystructure}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [part]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{bodystructure}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{part(s)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying terminal: [')']}, - Parse::RecDescent::_tracefirst($text), - q{bodystructure}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{')'})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = ")"; 1 } and - substr($text,0,length($_tok)) eq $_tok and - do { substr($text,0,length($_tok)) = ""; 1; } - ) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING2__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{bodystructure}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = $item{'part(s)'} }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: ['(' part ')']<<}, - Parse::RecDescent::_tracefirst($text), - q{bodystructure}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodystructure}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{bodystructure}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{bodystructure}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{bodystructure}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::PLAIN -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"PLAIN"}; - - Parse::RecDescent::_trace(q{Trying rule: [PLAIN]}, - Parse::RecDescent::_tracefirst($_[1]), - q{PLAIN}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{/^"PLAIN"|^PLAIN/i}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [/^"PLAIN"|^PLAIN/i]}, - Parse::RecDescent::_tracefirst($_[1]), - q{PLAIN}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{PLAIN}); - %item = (__RULE__ => q{PLAIN}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: [/^"PLAIN"|^PLAIN/i]}, Parse::RecDescent::_tracefirst($text), - q{PLAIN}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:^"PLAIN"|^PLAIN)/i) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN1__}=$current_match; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{PLAIN}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = "PLAIN" }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [/^"PLAIN"|^PLAIN/i]<<}, - Parse::RecDescent::_tracefirst($text), - q{PLAIN}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{PLAIN}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{PLAIN}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{PLAIN}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{PLAIN}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NUMBER -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"NUMBER"}; - - Parse::RecDescent::_trace(q{Trying rule: [NUMBER]}, - Parse::RecDescent::_tracefirst($_[1]), - q{NUMBER}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{/^(\\d+)/}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [/^(\\d+)/]}, - Parse::RecDescent::_tracefirst($_[1]), - q{NUMBER}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{NUMBER}); - %item = (__RULE__ => q{NUMBER}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: [/^(\\d+)/]}, Parse::RecDescent::_tracefirst($text), - q{NUMBER}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:^(\d+))/) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN1__}=$current_match; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{NUMBER}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = $item[1] }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [/^(\\d+)/]<<}, - Parse::RecDescent::_tracefirst($text), - q{NUMBER}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{NUMBER}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{NUMBER}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{NUMBER}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{NUMBER}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRINGS -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"STRINGS"}; - - Parse::RecDescent::_trace(q{Trying rule: [STRINGS]}, - Parse::RecDescent::_tracefirst($_[1]), - q{STRINGS}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{'('}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: ['(' STRING ')']}, - Parse::RecDescent::_tracefirst($_[1]), - q{STRINGS}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{STRINGS}); - %item = (__RULE__ => q{STRINGS}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: ['(']}, - Parse::RecDescent::_tracefirst($text), - q{STRINGS}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = "("; 1 } and - substr($text,0,length($_tok)) eq $_tok and - do { substr($text,0,length($_tok)) = ""; 1; } - ) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING1__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [STRING]}, - Parse::RecDescent::_tracefirst($text), - q{STRINGS}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{STRING})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING, 1, 100000000, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{STRINGS}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [STRING]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{STRINGS}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRING(s)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying terminal: [')']}, - Parse::RecDescent::_tracefirst($text), - q{STRINGS}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{')'})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = ")"; 1 } and - substr($text,0,length($_tok)) eq $_tok and - do { substr($text,0,length($_tok)) = ""; 1; } - ) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING2__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{STRINGS}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = $item{'STRING(s)'} }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: ['(' STRING ')']<<}, - Parse::RecDescent::_tracefirst($text), - q{STRINGS}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{STRINGS}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{STRINGS}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{STRINGS}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{STRINGS}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::HTML -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"HTML"}; - - Parse::RecDescent::_trace(q{Trying rule: [HTML]}, - Parse::RecDescent::_tracefirst($_[1]), - q{HTML}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{/"HTML"|HTML/i}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [/"HTML"|HTML/i]}, - Parse::RecDescent::_tracefirst($_[1]), - q{HTML}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{HTML}); - %item = (__RULE__ => q{HTML}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: [/"HTML"|HTML/i]}, Parse::RecDescent::_tracefirst($text), - q{HTML}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:"HTML"|HTML)/i) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN1__}=$current_match; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{HTML}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = "HTML" }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [/"HTML"|HTML/i]<<}, - Parse::RecDescent::_tracefirst($text), - q{HTML}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{HTML}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{HTML}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{HTML}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{HTML}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodydisp -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"bodydisp"}; - - Parse::RecDescent::_trace(q{Trying rule: [bodydisp]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodydisp}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{NIL, or KVPAIRS}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodydisp}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{bodydisp}); - %item = (__RULE__ => q{bodydisp}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{bodydisp}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodydisp}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodydisp}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodydisp}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [KVPAIRS]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodydisp}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{bodydisp}); - %item = (__RULE__ => q{bodydisp}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [KVPAIRS]}, - Parse::RecDescent::_tracefirst($text), - q{bodydisp}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::KVPAIRS($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodydisp}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [KVPAIRS]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodydisp}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{KVPAIRS}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [KVPAIRS]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodydisp}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodydisp}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{bodydisp}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{bodydisp}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{bodydisp}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::part -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"part"}; - - Parse::RecDescent::_trace(q{Trying rule: [part]}, - Parse::RecDescent::_tracefirst($_[1]), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{multipart, or textmessage, or nestedmessage, or othertypemessage}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [multipart]}, - Parse::RecDescent::_tracefirst($_[1]), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{part}); - %item = (__RULE__ => q{part}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [multipart]}, - Parse::RecDescent::_tracefirst($text), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::multipart($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [multipart]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{multipart}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = bless $item{multipart}, $mibs }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [multipart]<<}, - Parse::RecDescent::_tracefirst($text), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [textmessage]}, - Parse::RecDescent::_tracefirst($_[1]), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{part}); - %item = (__RULE__ => q{part}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [textmessage]}, - Parse::RecDescent::_tracefirst($text), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::textmessage($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [textmessage]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{textmessage}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = bless $item{textmessage}, $mibs }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [textmessage]<<}, - Parse::RecDescent::_tracefirst($text), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [nestedmessage]}, - Parse::RecDescent::_tracefirst($_[1]), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[2]; - $text = $_[1]; - my $_savetext; - @item = (q{part}); - %item = (__RULE__ => q{part}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [nestedmessage]}, - Parse::RecDescent::_tracefirst($text), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::nestedmessage($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [nestedmessage]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{nestedmessage}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = bless $item{nestedmessage}, $mibs }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [nestedmessage]<<}, - Parse::RecDescent::_tracefirst($text), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [othertypemessage]}, - Parse::RecDescent::_tracefirst($_[1]), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[3]; - $text = $_[1]; - my $_savetext; - @item = (q{part}); - %item = (__RULE__ => q{part}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [othertypemessage]}, - Parse::RecDescent::_tracefirst($text), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::othertypemessage($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [othertypemessage]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{othertypemessage}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = bless $item{othertypemessage}, $mibs }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [othertypemessage]<<}, - Parse::RecDescent::_tracefirst($text), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{part}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{part}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{part}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{part}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::nestedmessage -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"nestedmessage"}; - - Parse::RecDescent::_trace(q{Trying rule: [nestedmessage]}, - Parse::RecDescent::_tracefirst($_[1]), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{rfc822message}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [rfc822message bodyparms bodyid bodydesc bodyenc bodysize envelopestruct bodystructure textlines bodyMD5 bodydisp bodylang bodyextra]}, - Parse::RecDescent::_tracefirst($_[1]), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{nestedmessage}); - %item = (__RULE__ => q{nestedmessage}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [rfc822message]}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::rfc822message($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [rfc822message]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{rfc822message}} = $_tok; - push @item, $_tok; - - } - - - - Parse::RecDescent::_trace(q{Trying directive: []}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $_tok = do { $commit = 1 }; - if (defined($_tok)) - { - Parse::RecDescent::_trace(q{>>Matched directive<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - } - else - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - } - - last unless defined $_tok; - push @item, $item{__DIRECTIVE1__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying subrule: [bodyparms]}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{bodyparms})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyparms($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [bodyparms]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodyparms}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying subrule: [bodyid]}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{bodyid})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyid($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [bodyid]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodyid}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying subrule: [bodydesc]}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{bodydesc})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodydesc($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [bodydesc]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodydesc}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying subrule: [bodyenc]}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{bodyenc})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyenc($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [bodyenc]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodyenc}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying subrule: [bodysize]}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{bodysize})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodysize($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [bodysize]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodysize}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying repeated subrule: [envelopestruct]}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{envelopestruct})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::envelopestruct, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [envelopestruct]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{envelopestruct(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodystructure]}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodystructure})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodystructure, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodystructure]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodystructure(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [textlines]}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{textlines})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::textlines, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [textlines]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{textlines(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodyMD5]}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodyMD5})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyMD5, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodyMD5]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodyMD5(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodydisp]}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodydisp})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodydisp, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodydisp]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodydisp(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodylang]}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodylang})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodylang, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodylang]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodylang(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [bodyextra]}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{bodyextra})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyextra, 0, 1, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodyextra]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bodyextra(?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { - $return = {}; - $return->{$_} = $item{$_} - for qw/bodyparms bodyid bodydesc bodyenc bodysize/; -# envelopestruct bodystructure textlines/; - - take_optional_items($return, \%item - , qw/envelopestruct bodystructure textlines/ - , qw/bodyMD5 bodydisp bodylang bodyextra/); - - merge_hash($return, $item{bodystructure}[0]); - merge_hash($return, $item{basicfields}); - $return->{bodytype} = "MESSAGE" ; - $return->{bodysubtype} = "RFC822" ; - 1; - }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [rfc822message bodyparms bodyid bodydesc bodyenc bodysize envelopestruct bodystructure textlines bodyMD5 bodydisp bodylang bodyextra]<<}, - Parse::RecDescent::_tracefirst($text), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{nestedmessage}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{nestedmessage}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{nestedmessage}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::SINGLE_QUOTED_STRING -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"SINGLE_QUOTED_STRING"}; - - Parse::RecDescent::_trace(q{Trying rule: [SINGLE_QUOTED_STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{SINGLE_QUOTED_STRING}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{'''}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [''' /(?:\\\\'|[^'])*/ ''']}, - Parse::RecDescent::_tracefirst($_[1]), - q{SINGLE_QUOTED_STRING}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{SINGLE_QUOTED_STRING}); - %item = (__RULE__ => q{SINGLE_QUOTED_STRING}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: [''']}, - Parse::RecDescent::_tracefirst($text), - q{SINGLE_QUOTED_STRING}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = "'"; 1 } and - substr($text,0,length($_tok)) eq $_tok and - do { substr($text,0,length($_tok)) = ""; 1; } - ) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING1__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying terminal: [/(?:\\\\'|[^'])*/]}, Parse::RecDescent::_tracefirst($text), - q{SINGLE_QUOTED_STRING}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{/(?:\\\\'|[^'])*/})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:(?:\\'|[^'])*)/) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN1__}=$current_match; - - - Parse::RecDescent::_trace(q{Trying terminal: [''']}, - Parse::RecDescent::_tracefirst($text), - q{SINGLE_QUOTED_STRING}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{'''})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = "'"; 1 } and - substr($text,0,length($_tok)) eq $_tok and - do { substr($text,0,length($_tok)) = ""; 1; } - ) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING2__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{SINGLE_QUOTED_STRING}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = $item{__PATTERN1__} }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [''' /(?:\\\\'|[^'])*/ ''']<<}, - Parse::RecDescent::_tracefirst($text), - q{SINGLE_QUOTED_STRING}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{SINGLE_QUOTED_STRING}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{SINGLE_QUOTED_STRING}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{SINGLE_QUOTED_STRING}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{SINGLE_QUOTED_STRING}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::ADDRESSES -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"ADDRESSES"}; - - Parse::RecDescent::_trace(q{Trying rule: [ADDRESSES]}, - Parse::RecDescent::_tracefirst($_[1]), - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{NIL, or RFCNONCOMPLY, or '('}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{ADDRESSES}); - %item = (__RULE__ => q{ADDRESSES}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [RFCNONCOMPLY]}, - Parse::RecDescent::_tracefirst($_[1]), - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{ADDRESSES}); - %item = (__RULE__ => q{ADDRESSES}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [RFCNONCOMPLY]}, - Parse::RecDescent::_tracefirst($text), - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::RFCNONCOMPLY($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [RFCNONCOMPLY]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{RFCNONCOMPLY}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [RFCNONCOMPLY]<<}, - Parse::RecDescent::_tracefirst($text), - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: ['(' addressstruct ')']}, - Parse::RecDescent::_tracefirst($_[1]), - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[2]; - $text = $_[1]; - my $_savetext; - @item = (q{ADDRESSES}); - %item = (__RULE__ => q{ADDRESSES}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: ['(']}, - Parse::RecDescent::_tracefirst($text), - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = "("; 1 } and - substr($text,0,length($_tok)) eq $_tok and - do { substr($text,0,length($_tok)) = ""; 1; } - ) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING1__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [addressstruct]}, - Parse::RecDescent::_tracefirst($text), - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{addressstruct})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::addressstruct, 1, 100000000, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [addressstruct]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{addressstruct(s)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying terminal: [')']}, - Parse::RecDescent::_tracefirst($text), - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{')'})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = ")"; 1 } and - substr($text,0,length($_tok)) eq $_tok and - do { substr($text,0,length($_tok)) = ""; 1; } - ) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING2__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = $item{'addressstruct(s)'} }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: ['(' addressstruct ')']<<}, - Parse::RecDescent::_tracefirst($text), - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{ADDRESSES}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{ADDRESSES}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{ADDRESSES}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bcc -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"bcc"}; - - Parse::RecDescent::_trace(q{Trying rule: [bcc]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bcc}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{ADDRESSES}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [ADDRESSES]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bcc}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{bcc}); - %item = (__RULE__ => q{bcc}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [ADDRESSES]}, - Parse::RecDescent::_tracefirst($text), - q{bcc}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::ADDRESSES($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bcc}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [ADDRESSES]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bcc}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{ADDRESSES}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [ADDRESSES]<<}, - Parse::RecDescent::_tracefirst($text), - q{bcc}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{bcc}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{bcc}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{bcc}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{bcc}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::rfc822message -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"rfc822message"}; - - Parse::RecDescent::_trace(q{Trying rule: [rfc822message]}, - Parse::RecDescent::_tracefirst($_[1]), - q{rfc822message}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{MESSAGE}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [MESSAGE RFC822]}, - Parse::RecDescent::_tracefirst($_[1]), - q{rfc822message}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{rfc822message}); - %item = (__RULE__ => q{rfc822message}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [MESSAGE]}, - Parse::RecDescent::_tracefirst($text), - q{rfc822message}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::MESSAGE($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{rfc822message}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [MESSAGE]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{rfc822message}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{MESSAGE}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying subrule: [RFC822]}, - Parse::RecDescent::_tracefirst($text), - q{rfc822message}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{RFC822})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::RFC822($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{rfc822message}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [RFC822]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{rfc822message}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{RFC822}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{rfc822message}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = "MESSAGE RFC822" }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [MESSAGE RFC822]<<}, - Parse::RecDescent::_tracefirst($text), - q{rfc822message}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{rfc822message}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{rfc822message}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{rfc822message}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{rfc822message}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::addressstruct -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"addressstruct"}; - - Parse::RecDescent::_trace(q{Trying rule: [addressstruct]}, - Parse::RecDescent::_tracefirst($_[1]), - q{addressstruct}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{'('}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: ['(' personalname sourceroute mailboxname hostname ')']}, - Parse::RecDescent::_tracefirst($_[1]), - q{addressstruct}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{addressstruct}); - %item = (__RULE__ => q{addressstruct}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: ['(']}, - Parse::RecDescent::_tracefirst($text), - q{addressstruct}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = "("; 1 } and - substr($text,0,length($_tok)) eq $_tok and - do { substr($text,0,length($_tok)) = ""; 1; } - ) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING1__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying subrule: [personalname]}, - Parse::RecDescent::_tracefirst($text), - q{addressstruct}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{personalname})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::personalname($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{addressstruct}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [personalname]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{addressstruct}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{personalname}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying subrule: [sourceroute]}, - Parse::RecDescent::_tracefirst($text), - q{addressstruct}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{sourceroute})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::sourceroute($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{addressstruct}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [sourceroute]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{addressstruct}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{sourceroute}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying subrule: [mailboxname]}, - Parse::RecDescent::_tracefirst($text), - q{addressstruct}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{mailboxname})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::mailboxname($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{addressstruct}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [mailboxname]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{addressstruct}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{mailboxname}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying subrule: [hostname]}, - Parse::RecDescent::_tracefirst($text), - q{addressstruct}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{hostname})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::hostname($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{addressstruct}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [hostname]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{addressstruct}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{hostname}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying terminal: [')']}, - Parse::RecDescent::_tracefirst($text), - q{addressstruct}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{')'})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = ")"; 1 } and - substr($text,0,length($_tok)) eq $_tok and - do { substr($text,0,length($_tok)) = ""; 1; } - ) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING2__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{addressstruct}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { bless { personalname => $item{personalname} - , sourceroute => $item{sourceroute} - , mailboxname => $item{mailboxname} - , hostname => $item{hostname} - }, 'Mail::IMAPClient::BodyStructure::Address'; - }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: ['(' personalname sourceroute mailboxname hostname ')']<<}, - Parse::RecDescent::_tracefirst($text), - q{addressstruct}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{addressstruct}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{addressstruct}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{addressstruct}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{addressstruct}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::sourceroute -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"sourceroute"}; - - Parse::RecDescent::_trace(q{Trying rule: [sourceroute]}, - Parse::RecDescent::_tracefirst($_[1]), - q{sourceroute}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{NIL, or STRING}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{sourceroute}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{sourceroute}); - %item = (__RULE__ => q{sourceroute}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{sourceroute}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{sourceroute}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{sourceroute}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{sourceroute}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{sourceroute}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{sourceroute}); - %item = (__RULE__ => q{sourceroute}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRING]}, - Parse::RecDescent::_tracefirst($text), - q{sourceroute}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{sourceroute}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{sourceroute}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{sourceroute}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{sourceroute}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{sourceroute}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{sourceroute}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{sourceroute}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::subpart -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"subpart"}; - - Parse::RecDescent::_trace(q{Trying rule: [subpart]}, - Parse::RecDescent::_tracefirst($_[1]), - q{subpart}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{'('}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: ['(' part ')' ]}, - Parse::RecDescent::_tracefirst($_[1]), - q{subpart}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{subpart}); - %item = (__RULE__ => q{subpart}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: ['(']}, - Parse::RecDescent::_tracefirst($text), - q{subpart}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = "("; 1 } and - substr($text,0,length($_tok)) eq $_tok and - do { substr($text,0,length($_tok)) = ""; 1; } - ) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING1__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying subrule: [part]}, - Parse::RecDescent::_tracefirst($text), - q{subpart}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{part})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::part($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{subpart}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [part]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{subpart}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{part}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying terminal: [')']}, - Parse::RecDescent::_tracefirst($text), - q{subpart}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{')'})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = ")"; 1 } and - substr($text,0,length($_tok)) eq $_tok and - do { substr($text,0,length($_tok)) = ""; 1; } - ) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING2__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{subpart}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do {$return = $item{part}}; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - - Parse::RecDescent::_trace(q{Trying directive: []}, - Parse::RecDescent::_tracefirst($text), - q{subpart}, - $tracelevel) - if defined $::RD_TRACE; - $_tok = do { push @{$thisparser->{deferred}}, sub { ++$subpartCount; }; }; - if (defined($_tok)) - { - Parse::RecDescent::_trace(q{>>Matched directive<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - } - else - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - } - - last unless defined $_tok; - push @item, $item{__DIRECTIVE1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: ['(' part ')' ]<<}, - Parse::RecDescent::_tracefirst($text), - q{subpart}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{subpart}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{subpart}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{subpart}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{subpart}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::textlines -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"textlines"}; - - Parse::RecDescent::_trace(q{Trying rule: [textlines]}, - Parse::RecDescent::_tracefirst($_[1]), - q{textlines}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{NIL, or NUMBER}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{textlines}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{textlines}); - %item = (__RULE__ => q{textlines}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{textlines}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{textlines}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{textlines}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{textlines}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NUMBER]}, - Parse::RecDescent::_tracefirst($_[1]), - q{textlines}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{textlines}); - %item = (__RULE__ => q{textlines}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NUMBER]}, - Parse::RecDescent::_tracefirst($text), - q{textlines}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NUMBER($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{textlines}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NUMBER]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{textlines}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NUMBER}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NUMBER]<<}, - Parse::RecDescent::_tracefirst($text), - q{textlines}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{textlines}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{textlines}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{textlines}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{textlines}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::BARESTRING -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"BARESTRING"}; - - Parse::RecDescent::_trace(q{Trying rule: [BARESTRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{BARESTRING}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{/^[)('"]/}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [/^[)('"]/ /^(?!\\(|\\))(?:\\\\ |\\S)+/]}, - Parse::RecDescent::_tracefirst($_[1]), - q{BARESTRING}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{BARESTRING}); - %item = (__RULE__ => q{BARESTRING}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: [/^[)('"]/]}, Parse::RecDescent::_tracefirst($text), - q{BARESTRING}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - $_savetext = $text; - - if ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:^[)('"])/) - { - $text = $_savetext; - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN1__}=$current_match; - $text = $_savetext; - - Parse::RecDescent::_trace(q{Trying terminal: [/^(?!\\(|\\))(?:\\\\ |\\S)+/]}, Parse::RecDescent::_tracefirst($text), - q{BARESTRING}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{/^(?!\\(|\\))(?:\\\\ |\\S)+/})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:^(?!\(|\))(?:\\ |\S)+)/) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN2__}=$current_match; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{BARESTRING}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = $item{__PATTERN1__} }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [/^[)('"]/ /^(?!\\(|\\))(?:\\\\ |\\S)+/]<<}, - Parse::RecDescent::_tracefirst($text), - q{BARESTRING}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{BARESTRING}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{BARESTRING}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{BARESTRING}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{BARESTRING}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyloc -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"bodyloc"}; - - Parse::RecDescent::_trace(q{Trying rule: [bodyloc]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyloc}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{NIL, or STRING}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyloc}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{bodyloc}); - %item = (__RULE__ => q{bodyloc}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{bodyloc}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodyloc}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodyloc}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodyloc}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyloc}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{bodyloc}); - %item = (__RULE__ => q{bodyloc}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRING]}, - Parse::RecDescent::_tracefirst($text), - q{bodyloc}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodyloc}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodyloc}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodyloc}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodyloc}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{bodyloc}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{bodyloc}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{bodyloc}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodylang -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"bodylang"}; - - Parse::RecDescent::_trace(q{Trying rule: [bodylang]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodylang}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{NIL, or STRING, or STRINGS}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodylang}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{bodylang}); - %item = (__RULE__ => q{bodylang}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{bodylang}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodylang}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodylang}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodylang}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodylang}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{bodylang}); - %item = (__RULE__ => q{bodylang}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRING]}, - Parse::RecDescent::_tracefirst($text), - q{bodylang}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodylang}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodylang}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodylang}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRINGS]}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodylang}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[2]; - $text = $_[1]; - my $_savetext; - @item = (q{bodylang}); - %item = (__RULE__ => q{bodylang}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRINGS]}, - Parse::RecDescent::_tracefirst($text), - q{bodylang}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRINGS($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{bodylang}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRINGS]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{bodylang}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRINGS}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRINGS]<<}, - Parse::RecDescent::_tracefirst($text), - q{bodylang}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{bodylang}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{bodylang}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{bodylang}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{bodylang}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::envelopestruct -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"envelopestruct"}; - - Parse::RecDescent::_trace(q{Trying rule: [envelopestruct]}, - Parse::RecDescent::_tracefirst($_[1]), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{'('}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: ['(' date subject from sender replyto to cc bcc inreplyto messageid ')']}, - Parse::RecDescent::_tracefirst($_[1]), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{envelopestruct}); - %item = (__RULE__ => q{envelopestruct}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: ['(']}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = "("; 1 } and - substr($text,0,length($_tok)) eq $_tok and - do { substr($text,0,length($_tok)) = ""; 1; } - ) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING1__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying subrule: [date]}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{date})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::date($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [date]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{date}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying subrule: [subject]}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{subject})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::subject($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [subject]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{subject}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying subrule: [from]}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{from})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::from($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [from]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{from}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying subrule: [sender]}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{sender})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::sender($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [sender]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{sender}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying subrule: [replyto]}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{replyto})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::replyto($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [replyto]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{replyto}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying subrule: [to]}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{to})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::to($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [to]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{to}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying subrule: [cc]}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{cc})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::cc($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [cc]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{cc}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying subrule: [bcc]}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{bcc})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bcc($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [bcc]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{bcc}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying subrule: [inreplyto]}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{inreplyto})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::inreplyto($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [inreplyto]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{inreplyto}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying subrule: [messageid]}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{messageid})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::messageid($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [messageid]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{messageid}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying terminal: [')']}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{')'})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = ")"; 1 } and - substr($text,0,length($_tok)) eq $_tok and - do { substr($text,0,length($_tok)) = ""; 1; } - ) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING2__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = bless {}, "Mail::IMAPClient::BodyStructure::Envelope"; - $return->{$_} = $item{$_} - for qw/date subject from sender replyto to cc/ - , qw/bcc inreplyto messageid/; - 1; - }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: ['(' date subject from sender replyto to cc bcc inreplyto messageid ')']<<}, - Parse::RecDescent::_tracefirst($text), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{envelopestruct}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{envelopestruct}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{envelopestruct}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::replyto -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"replyto"}; - - Parse::RecDescent::_trace(q{Trying rule: [replyto]}, - Parse::RecDescent::_tracefirst($_[1]), - q{replyto}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{ADDRESSES}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [ADDRESSES]}, - Parse::RecDescent::_tracefirst($_[1]), - q{replyto}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{replyto}); - %item = (__RULE__ => q{replyto}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [ADDRESSES]}, - Parse::RecDescent::_tracefirst($text), - q{replyto}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::ADDRESSES($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{replyto}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [ADDRESSES]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{replyto}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{ADDRESSES}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [ADDRESSES]<<}, - Parse::RecDescent::_tracefirst($text), - q{replyto}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{replyto}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{replyto}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{replyto}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{replyto}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::mailboxname -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"mailboxname"}; - - Parse::RecDescent::_trace(q{Trying rule: [mailboxname]}, - Parse::RecDescent::_tracefirst($_[1]), - q{mailboxname}, - $tracelevel) - if defined $::RD_TRACE; - - my $def_at = @{$thisparser->{deferred}}; - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{NIL, or STRING}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NIL]}, - Parse::RecDescent::_tracefirst($_[1]), - q{mailboxname}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{mailboxname}); - %item = (__RULE__ => q{mailboxname}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NIL]}, - Parse::RecDescent::_tracefirst($text), - q{mailboxname}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{mailboxname}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{mailboxname}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NIL}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<}, - Parse::RecDescent::_tracefirst($text), - q{mailboxname}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [STRING]}, - Parse::RecDescent::_tracefirst($_[1]), - q{mailboxname}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{mailboxname}); - %item = (__RULE__ => q{mailboxname}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [STRING]}, - Parse::RecDescent::_tracefirst($text), - q{mailboxname}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{mailboxname}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{mailboxname}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{STRING}} = $_tok; - push @item, $_tok; - - } - - - Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<}, - Parse::RecDescent::_tracefirst($text), - q{mailboxname}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - splice - @{$thisparser->{deferred}}, $def_at unless $_matched; - - unless ( $_matched || defined($score) ) - { - splice @{$thisparser->{deferred}}, $def_at; - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{mailboxname}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{mailboxname}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{mailboxname}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{mailboxname}, - $tracelevel) - } - $_[1] = $text; - return $return; -} -} -package Mail::IMAPClient::BodyStructure::Parse; sub new { my $self = bless( { - '_precompiled' => 1, - 'localvars' => '', - 'startcode' => '', - 'namespace' => 'Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse', - 'deferrable' => 1, - 'rules' => { - 'bodyparms' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'KVPAIRS' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 66 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'KVPAIRS', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 66 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 66 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'bodyparms', - 'vars' => '', - 'line' => 66 - }, 'Parse::RecDescent::Rule' ), - 'date' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'STRING' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 93 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 93 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 93 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'date', - 'vars' => '', - 'line' => 93 - }, 'Parse::RecDescent::Rule' ), - 'bodysubtype' => bless( { - 'impcount' => 0, - 'calls' => [ - 'PLAIN', - 'HTML', - 'NIL', - 'STRING' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'PLAIN', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 54 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'HTML', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 54 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 54 - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '2', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 54 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 54 - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '3', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 54 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 54 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'bodysubtype', - 'vars' => '', - 'line' => 54 - }, 'Parse::RecDescent::Rule' ), - 'hostname' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'STRING' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 80 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 80 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 80 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'hostname', - 'vars' => '', - 'line' => 80 - }, 'Parse::RecDescent::Rule' ), - 'basicfields' => bless( { - 'impcount' => 0, - 'calls' => [ - 'bodysubtype', - 'bodyparms', - 'bodyid', - 'bodydesc', - 'bodyenc', - 'bodysize' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'subrule' => 'bodysubtype', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 114 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'bodyparms', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 114 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'bodyid', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 114 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'bodydesc', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 115 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'bodyenc', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 115 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'bodysize', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 115 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 116, - 'code' => '{ $return = { bodysubtype => $item{bodysubtype} }; - take_optional_items($return, \\%item, - qw/bodyparms bodyid bodydesc bodyenc bodysize/); - 1; - }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'basicfields', - 'vars' => '', - 'line' => 114 - }, 'Parse::RecDescent::Rule' ), - 'personalname' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'STRING' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 77 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 77 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 77 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'personalname', - 'vars' => '', - 'line' => 77 - }, 'Parse::RecDescent::Rule' ), - 'key' => bless( { - 'impcount' => 0, - 'calls' => [ - 'STRING' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 56 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'key', - 'vars' => '', - 'line' => 56 - }, 'Parse::RecDescent::Rule' ), - 'cc' => bless( { - 'impcount' => 0, - 'calls' => [ - 'ADDRESSES' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'ADDRESSES', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 98 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'cc', - 'vars' => '', - 'line' => 98 - }, 'Parse::RecDescent::Rule' ), - 'bodyMD5' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'STRING' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 72 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 72 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 72 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'bodyMD5', - 'vars' => '', - 'line' => 72 - }, 'Parse::RecDescent::Rule' ), - 'envelope' => bless( { - 'impcount' => 0, - 'calls' => [ - 'envelopestruct' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 2, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '.*?\\(.*?ENVELOPE', - 'hashname' => '__PATTERN1__', - 'description' => '/.*?\\\\(.*?ENVELOPE/', - 'lookahead' => 0, - 'rdelim' => '/', - 'line' => 188, - 'mod' => '', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ), - bless( { - 'subrule' => 'envelopestruct', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 188 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'pattern' => '.*\\)', - 'hashname' => '__PATTERN2__', - 'description' => '/.*\\\\)/', - 'lookahead' => 0, - 'rdelim' => '/', - 'line' => 188, - 'mod' => '', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 189, - 'code' => '{ $return = $item{envelopestruct} }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'envelope', - 'vars' => '', - 'line' => 188 - }, 'Parse::RecDescent::Rule' ), - 'MESSAGE' => bless( { - 'impcount' => 0, - 'calls' => [], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 1, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '^"MESSAGE"|^MESSAGE', - 'hashname' => '__PATTERN1__', - 'description' => '/^"MESSAGE"|^MESSAGE/i', - 'lookahead' => 0, - 'rdelim' => '/', - 'line' => 32, - 'mod' => 'i', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 32, - 'code' => '{ $return = "MESSAGE"}' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'MESSAGE', - 'vars' => '', - 'line' => 32 - }, 'Parse::RecDescent::Rule' ), - 'DOUBLE_QUOTED_STRING' => bless( { - 'impcount' => 0, - 'calls' => [], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 2, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 1, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '"', - 'hashname' => '__STRING1__', - 'description' => '\'"\'', - 'lookahead' => 0, - 'line' => 41 - }, 'Parse::RecDescent::Literal' ), - bless( { - 'pattern' => '(?:\\\\"|[^"])*', - 'hashname' => '__PATTERN1__', - 'description' => '/(?:\\\\\\\\"|[^"])*/', - 'lookahead' => 0, - 'rdelim' => '/', - 'line' => 41, - 'mod' => '', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ), - bless( { - 'pattern' => '"', - 'hashname' => '__STRING2__', - 'description' => '\'"\'', - 'lookahead' => 0, - 'line' => 41 - }, 'Parse::RecDescent::Literal' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 41, - 'code' => '{ $return = $item{__PATTERN1__} }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'DOUBLE_QUOTED_STRING', - 'vars' => '', - 'line' => 41 - }, 'Parse::RecDescent::Rule' ), - 'subject' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'STRING' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 90 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 90 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 90 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'subject', - 'vars' => '', - 'line' => 90 - }, 'Parse::RecDescent::Rule' ), - 'value' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'NUMBER', - 'STRING', - 'KVPAIRS' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 57 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NUMBER', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 57 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 57 - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '2', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 57 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 57 - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '3', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'KVPAIRS', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 57 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 57 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'value', - 'vars' => '', - 'line' => 57 - }, 'Parse::RecDescent::Rule' ), - 'inreplyto' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'STRING' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 91 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 91 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 91 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'inreplyto', - 'vars' => '', - 'line' => 91 - }, 'Parse::RecDescent::Rule' ), - 'messageid' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'STRING' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 92 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 92 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 92 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'messageid', - 'vars' => '', - 'line' => 92 - }, 'Parse::RecDescent::Rule' ), - 'sender' => bless( { - 'impcount' => 0, - 'calls' => [ - 'ADDRESSES' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'ADDRESSES', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 102 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'sender', - 'vars' => '', - 'line' => 102 - }, 'Parse::RecDescent::Rule' ), - 'multipart' => bless( { - 'impcount' => 0, - 'calls' => [ - 'subpart', - 'bodysubtype', - 'bodyparms', - 'bodydisp', - 'bodylang', - 'bodyloc', - 'bodyextra' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 2, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'subrule' => 'subpart', - 'expected' => undef, - 'min' => 1, - 'argcode' => undef, - 'max' => 100000000, - 'matchrule' => 0, - 'repspec' => 's', - 'lookahead' => 0, - 'line' => 162 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'hashname' => '__DIRECTIVE1__', - 'name' => '', - 'lookahead' => 0, - 'line' => 162, - 'code' => '$commit = 1' - }, 'Parse::RecDescent::Directive' ), - bless( { - 'subrule' => 'bodysubtype', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 162 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'bodyparms', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 163 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'bodydisp', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 163 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'bodylang', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 163 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'bodyloc', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 163 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'bodyextra', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 163 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'hashname' => '__DIRECTIVE2__', - 'name' => '', - 'lookahead' => 0, - 'line' => 164, - 'code' => 'push @{$thisparser->{deferred}}, sub { $subpartCount = 0 };' - }, 'Parse::RecDescent::Directive' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 165, - 'code' => '{ $return = - { bodysubtype => $item{bodysubtype} - , bodytype => \'MULTIPART\' - , bodystructure => $item{\'subpart(s)\'} - }; - take_optional_items($return, \\%item - , qw/bodyparms bodydisp bodylang bodyloc bodyextra/); - 1; - }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'multipart', - 'vars' => '', - 'line' => 162 - }, 'Parse::RecDescent::Rule' ), - 'bodyenc' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'STRING', - 'KVPAIRS' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 71 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 71 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 71 - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '2', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'KVPAIRS', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 71 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 71 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'bodyenc', - 'vars' => '', - 'line' => 71 - }, 'Parse::RecDescent::Rule' ), - 'bodydesc' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'STRING' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 1, - 'actcount' => 0, - 'items' => [ - bless( { - 'pattern' => '[()]', - 'hashname' => '__PATTERN1__', - 'description' => '/[()]/', - 'lookahead' => -1, - 'rdelim' => '/', - 'line' => 69, - 'mod' => '', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ), - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 69 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 69 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 69 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'bodydesc', - 'vars' => '', - 'line' => 69 - }, 'Parse::RecDescent::Rule' ), - 'start' => bless( { - 'impcount' => 0, - 'calls' => [ - 'part' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 2, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '.*?\\(.*?BODYSTRUCTURE \\(', - 'hashname' => '__PATTERN1__', - 'description' => '/.*?\\\\(.*?BODYSTRUCTURE \\\\(/i', - 'lookahead' => 0, - 'rdelim' => '/', - 'line' => 185, - 'mod' => 'i', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ), - bless( { - 'subrule' => 'part', - 'expected' => undef, - 'min' => 1, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '1', - 'lookahead' => 0, - 'line' => 185 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'pattern' => '\\).*\\)\\r?\\n?', - 'hashname' => '__PATTERN2__', - 'description' => '/\\\\).*\\\\)\\\\r?\\\\n?/', - 'lookahead' => 0, - 'rdelim' => '/', - 'line' => 185, - 'mod' => '', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 186, - 'code' => '{ $return = $item{\'part(1)\'}[0] }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'start', - 'vars' => '', - 'line' => 185 - }, 'Parse::RecDescent::Rule' ), - 'RFC822' => bless( { - 'impcount' => 0, - 'calls' => [], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 1, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '^"RFC822"|^RFC822', - 'hashname' => '__PATTERN1__', - 'description' => '/^"RFC822"|^RFC822/i', - 'lookahead' => 0, - 'rdelim' => '/', - 'line' => 33, - 'mod' => 'i', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 33, - 'code' => '{ $return = "RFC822" }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'RFC822', - 'vars' => '', - 'line' => 33 - }, 'Parse::RecDescent::Rule' ), - 'RFCNONCOMPLY' => bless( { - 'impcount' => 0, - 'calls' => [], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 1, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '^\\(\\)', - 'hashname' => '__PATTERN1__', - 'description' => '/^\\\\(\\\\)/i', - 'lookahead' => 0, - 'rdelim' => '/', - 'line' => 35, - 'mod' => 'i', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 35, - 'code' => '{ $return = "NIL" }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'RFCNONCOMPLY', - 'vars' => '', - 'line' => 35 - }, 'Parse::RecDescent::Rule' ), - 'textmessage' => bless( { - 'impcount' => 0, - 'calls' => [ - 'TEXT', - 'basicfields', - 'textlines', - 'bodyMD5', - 'bodydisp', - 'bodylang', - 'bodyextra' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 1, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'subrule' => 'TEXT', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 122 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'hashname' => '__DIRECTIVE1__', - 'name' => '', - 'lookahead' => 0, - 'line' => 122, - 'code' => '$commit = 1' - }, 'Parse::RecDescent::Directive' ), - bless( { - 'subrule' => 'basicfields', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 122 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'textlines', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 122 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'bodyMD5', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 122 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'bodydisp', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 123 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'bodylang', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 123 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'bodyextra', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 123 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 124, - 'code' => '{ - $return = $item{basicfields} || {}; - $return->{bodytype} = \'TEXT\'; - take_optional_items($return, \\%item - , qw/textlines bodyMD5 bodydisp bodylang bodyextra/); - 1; - }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'textmessage', - 'vars' => '', - 'line' => 122 - }, 'Parse::RecDescent::Rule' ), - 'bodyid' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'STRING' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 1, - 'actcount' => 0, - 'items' => [ - bless( { - 'pattern' => '[()]', - 'hashname' => '__PATTERN1__', - 'description' => '/[()]/', - 'lookahead' => -1, - 'rdelim' => '/', - 'line' => 68, - 'mod' => '', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ), - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 68 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 68 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 68 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'bodyid', - 'vars' => '', - 'line' => 68 - }, 'Parse::RecDescent::Rule' ), - 'bodyextra' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'STRING', - 'STRINGS' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 74 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 74 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 74 - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '2', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRINGS', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 74 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 74 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'bodyextra', - 'vars' => '', - 'line' => 74 - }, 'Parse::RecDescent::Rule' ), - 'othertypemessage' => bless( { - 'impcount' => 0, - 'calls' => [ - 'bodytype', - 'basicfields', - 'bodyMD5', - 'bodydisp', - 'bodylang', - 'bodyextra' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'subrule' => 'bodytype', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 132 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'basicfields', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 132 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'bodyMD5', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 132 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'bodydisp', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 132 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'bodylang', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 133 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'bodyextra', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 133 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 134, - 'code' => '{ $return = { bodytype => $item{bodytype} }; - take_optional_items($return, \\%item - , qw/bodyMD5 bodydisp bodylang bodyextra/ ); - merge_hash($return, $item{basicfields}); - 1; - }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'othertypemessage', - 'vars' => '', - 'line' => 132 - }, 'Parse::RecDescent::Rule' ), - 'kvpair' => bless( { - 'impcount' => 0, - 'calls' => [ - 'key', - 'value' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 1, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => ')', - 'hashname' => '__STRING1__', - 'description' => '\')\'', - 'lookahead' => -1, - 'line' => 59 - }, 'Parse::RecDescent::InterpLit' ), - bless( { - 'subrule' => 'key', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 59 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'value', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 59 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 60, - 'code' => '{ $return = { $item{key} => $item{value} } }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'kvpair', - 'vars' => '', - 'line' => 59 - }, 'Parse::RecDescent::Rule' ), - 'bodysize' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'NUMBER' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 1, - 'actcount' => 0, - 'items' => [ - bless( { - 'pattern' => '[()]', - 'hashname' => '__PATTERN1__', - 'description' => '/[()]/', - 'lookahead' => -1, - 'rdelim' => '/', - 'line' => 70, - 'mod' => '', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ), - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 70 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NUMBER', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 70 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 70 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'bodysize', - 'vars' => '', - 'line' => 70 - }, 'Parse::RecDescent::Rule' ), - 'STRING' => bless( { - 'impcount' => 0, - 'calls' => [ - 'DOUBLE_QUOTED_STRING', - 'SINGLE_QUOTED_STRING', - 'BARESTRING' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'DOUBLE_QUOTED_STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 46 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'SINGLE_QUOTED_STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 46 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 46 - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '2', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'BARESTRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 46 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 46 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'STRING', - 'vars' => '', - 'line' => 46 - }, 'Parse::RecDescent::Rule' ), - 'bodytype' => bless( { - 'impcount' => 0, - 'calls' => [ - 'STRING' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 65 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'bodytype', - 'vars' => '', - 'line' => 65 - }, 'Parse::RecDescent::Rule' ), - 'TEXT' => bless( { - 'impcount' => 0, - 'calls' => [], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 1, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '^"TEXT"|^TEXT', - 'hashname' => '__PATTERN1__', - 'description' => '/^"TEXT"|^TEXT/i', - 'lookahead' => 0, - 'rdelim' => '/', - 'line' => 29, - 'mod' => 'i', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 29, - 'code' => '{ $return = "TEXT" }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'TEXT', - 'vars' => '', - 'line' => 27 - }, 'Parse::RecDescent::Rule' ), - 'to' => bless( { - 'impcount' => 0, - 'calls' => [ - 'ADDRESSES' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'ADDRESSES', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 103 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'to', - 'vars' => '', - 'line' => 103 - }, 'Parse::RecDescent::Rule' ), - 'NIL' => bless( { - 'impcount' => 0, - 'calls' => [], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 1, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '^NIL', - 'hashname' => '__PATTERN1__', - 'description' => '/^NIL/i', - 'lookahead' => 0, - 'rdelim' => '/', - 'line' => 34, - 'mod' => 'i', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 34, - 'code' => '{ $return = "NIL" }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'NIL', - 'vars' => '', - 'line' => 34 - }, 'Parse::RecDescent::Rule' ), - 'KVPAIRS' => bless( { - 'impcount' => 0, - 'calls' => [ - 'kvpair' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 2, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '(', - 'hashname' => '__STRING1__', - 'description' => '\'(\'', - 'lookahead' => 0, - 'line' => 62 - }, 'Parse::RecDescent::InterpLit' ), - bless( { - 'subrule' => 'kvpair', - 'expected' => undef, - 'min' => 1, - 'argcode' => undef, - 'max' => 100000000, - 'matchrule' => 0, - 'repspec' => 's', - 'lookahead' => 0, - 'line' => 62 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'pattern' => ')', - 'hashname' => '__STRING2__', - 'description' => '\')\'', - 'lookahead' => 0, - 'line' => 62 - }, 'Parse::RecDescent::InterpLit' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 63, - 'code' => '{ $return = { map { (%$_) } @{$item{\'kvpair(s)\'}} } }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'KVPAIRS', - 'vars' => '', - 'line' => 62 - }, 'Parse::RecDescent::Rule' ), - 'from' => bless( { - 'impcount' => 0, - 'calls' => [ - 'ADDRESSES' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'ADDRESSES', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 100 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'from', - 'vars' => '', - 'line' => 100 - }, 'Parse::RecDescent::Rule' ), - 'bodystructure' => bless( { - 'impcount' => 0, - 'calls' => [ - 'part' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 2, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '(', - 'hashname' => '__STRING1__', - 'description' => '\'(\'', - 'lookahead' => 0, - 'line' => 182 - }, 'Parse::RecDescent::InterpLit' ), - bless( { - 'subrule' => 'part', - 'expected' => undef, - 'min' => 1, - 'argcode' => undef, - 'max' => 100000000, - 'matchrule' => 0, - 'repspec' => 's', - 'lookahead' => 0, - 'line' => 182 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'pattern' => ')', - 'hashname' => '__STRING2__', - 'description' => '\')\'', - 'lookahead' => 0, - 'line' => 182 - }, 'Parse::RecDescent::InterpLit' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 183, - 'code' => '{ $return = $item{\'part(s)\'} }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'bodystructure', - 'vars' => '', - 'line' => 182 - }, 'Parse::RecDescent::Rule' ), - 'PLAIN' => bless( { - 'impcount' => 0, - 'calls' => [], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 1, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '^"PLAIN"|^PLAIN', - 'hashname' => '__PATTERN1__', - 'description' => '/^"PLAIN"|^PLAIN/i', - 'lookahead' => 0, - 'rdelim' => '/', - 'line' => 30, - 'mod' => 'i', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 30, - 'code' => '{ $return = "PLAIN" }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'PLAIN', - 'vars' => '', - 'line' => 30 - }, 'Parse::RecDescent::Rule' ), - 'NUMBER' => bless( { - 'impcount' => 0, - 'calls' => [], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 1, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '^(\\d+)', - 'hashname' => '__PATTERN1__', - 'description' => '/^(\\\\d+)/', - 'lookahead' => 0, - 'rdelim' => '/', - 'line' => 36, - 'mod' => '', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 36, - 'code' => '{ $return = $item[1] }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'NUMBER', - 'vars' => '', - 'line' => 36 - }, 'Parse::RecDescent::Rule' ), - 'STRINGS' => bless( { - 'impcount' => 0, - 'calls' => [ - 'STRING' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 2, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '(', - 'hashname' => '__STRING1__', - 'description' => '\'(\'', - 'lookahead' => 0, - 'line' => 48 - }, 'Parse::RecDescent::InterpLit' ), - bless( { - 'subrule' => 'STRING', - 'expected' => undef, - 'min' => 1, - 'argcode' => undef, - 'max' => 100000000, - 'matchrule' => 0, - 'repspec' => 's', - 'lookahead' => 0, - 'line' => 48 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'pattern' => ')', - 'hashname' => '__STRING2__', - 'description' => '\')\'', - 'lookahead' => 0, - 'line' => 48 - }, 'Parse::RecDescent::InterpLit' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 48, - 'code' => '{ $return = $item{\'STRING(s)\'} }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'STRINGS', - 'vars' => '', - 'line' => 48 - }, 'Parse::RecDescent::Rule' ), - 'HTML' => bless( { - 'impcount' => 0, - 'calls' => [], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 1, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '"HTML"|HTML', - 'hashname' => '__PATTERN1__', - 'description' => '/"HTML"|HTML/i', - 'lookahead' => 0, - 'rdelim' => '/', - 'line' => 31, - 'mod' => 'i', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 31, - 'code' => '{ $return = "HTML" }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'HTML', - 'vars' => '', - 'line' => 31 - }, 'Parse::RecDescent::Rule' ), - 'bodydisp' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'KVPAIRS' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 67 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'KVPAIRS', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 67 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 67 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'bodydisp', - 'vars' => '', - 'line' => 67 - }, 'Parse::RecDescent::Rule' ), - 'part' => bless( { - 'impcount' => 0, - 'calls' => [ - 'multipart', - 'textmessage', - 'nestedmessage', - 'othertypemessage' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'subrule' => 'multipart', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 177 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 177, - 'code' => '{ $return = bless $item{multipart}, $mibs }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'subrule' => 'textmessage', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 178 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 178, - 'code' => '{ $return = bless $item{textmessage}, $mibs }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => 178 - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '2', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'subrule' => 'nestedmessage', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 179 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 179, - 'code' => '{ $return = bless $item{nestedmessage}, $mibs }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => 179 - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '3', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'subrule' => 'othertypemessage', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 180 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 180, - 'code' => '{ $return = bless $item{othertypemessage}, $mibs }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => 180 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'part', - 'vars' => '', - 'line' => 177 - }, 'Parse::RecDescent::Rule' ), - 'nestedmessage' => bless( { - 'impcount' => 0, - 'calls' => [ - 'rfc822message', - 'bodyparms', - 'bodyid', - 'bodydesc', - 'bodyenc', - 'bodysize', - 'envelopestruct', - 'bodystructure', - 'textlines', - 'bodyMD5', - 'bodydisp', - 'bodylang', - 'bodyextra' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 1, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'subrule' => 'rfc822message', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 141 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'hashname' => '__DIRECTIVE1__', - 'name' => '', - 'lookahead' => 0, - 'line' => 141, - 'code' => '$commit = 1' - }, 'Parse::RecDescent::Directive' ), - bless( { - 'subrule' => 'bodyparms', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 141 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'bodyid', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 141 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'bodydesc', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 141 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'bodyenc', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 141 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'bodysize', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 142 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'envelopestruct', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 143 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'bodystructure', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 143 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'textlines', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 143 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'bodyMD5', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 144 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'bodydisp', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 144 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'bodylang', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 144 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'subrule' => 'bodyextra', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 1, - 'matchrule' => 0, - 'repspec' => '?', - 'lookahead' => 0, - 'line' => 144 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 145, - 'code' => '{ - $return = {}; - $return->{$_} = $item{$_} - for qw/bodyparms bodyid bodydesc bodyenc bodysize/; -# envelopestruct bodystructure textlines/; - - take_optional_items($return, \\%item - , qw/envelopestruct bodystructure textlines/ - , qw/bodyMD5 bodydisp bodylang bodyextra/); - - merge_hash($return, $item{bodystructure}[0]); - merge_hash($return, $item{basicfields}); - $return->{bodytype} = "MESSAGE" ; - $return->{bodysubtype} = "RFC822" ; - 1; - }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'nestedmessage', - 'vars' => '', - 'line' => 141 - }, 'Parse::RecDescent::Rule' ), - 'SINGLE_QUOTED_STRING' => bless( { - 'impcount' => 0, - 'calls' => [], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 2, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 1, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '\'', - 'hashname' => '__STRING1__', - 'description' => '\'\'\'', - 'lookahead' => 0, - 'line' => 40 - }, 'Parse::RecDescent::InterpLit' ), - bless( { - 'pattern' => '(?:\\\\\'|[^\'])*', - 'hashname' => '__PATTERN1__', - 'description' => '/(?:\\\\\\\\\'|[^\'])*/', - 'lookahead' => 0, - 'rdelim' => '/', - 'line' => 40, - 'mod' => '', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ), - bless( { - 'pattern' => '\'', - 'hashname' => '__STRING2__', - 'description' => '\'\'\'', - 'lookahead' => 0, - 'line' => 40 - }, 'Parse::RecDescent::InterpLit' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 40, - 'code' => '{ $return = $item{__PATTERN1__} }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'SINGLE_QUOTED_STRING', - 'vars' => '', - 'line' => 38 - }, 'Parse::RecDescent::Rule' ), - 'ADDRESSES' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'RFCNONCOMPLY', - 'addressstruct' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 95 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'RFCNONCOMPLY', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 95 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 95 - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '2', - 'strcount' => 2, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '(', - 'hashname' => '__STRING1__', - 'description' => '\'(\'', - 'lookahead' => 0, - 'line' => 96 - }, 'Parse::RecDescent::InterpLit' ), - bless( { - 'subrule' => 'addressstruct', - 'expected' => undef, - 'min' => 1, - 'argcode' => undef, - 'max' => 100000000, - 'matchrule' => 0, - 'repspec' => 's', - 'lookahead' => 0, - 'line' => 96 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'pattern' => ')', - 'hashname' => '__STRING2__', - 'description' => '\')\'', - 'lookahead' => 0, - 'line' => 96 - }, 'Parse::RecDescent::InterpLit' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 96, - 'code' => '{ $return = $item{\'addressstruct(s)\'} }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => 96 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'ADDRESSES', - 'vars' => '', - 'line' => 95 - }, 'Parse::RecDescent::Rule' ), - 'bcc' => bless( { - 'impcount' => 0, - 'calls' => [ - 'ADDRESSES' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'ADDRESSES', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 99 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'bcc', - 'vars' => '', - 'line' => 99 - }, 'Parse::RecDescent::Rule' ), - 'rfc822message' => bless( { - 'impcount' => 0, - 'calls' => [ - 'MESSAGE', - 'RFC822' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'subrule' => 'MESSAGE', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 52 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'RFC822', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 52 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 52, - 'code' => '{ $return = "MESSAGE RFC822" }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'rfc822message', - 'vars' => '', - 'line' => 52 - }, 'Parse::RecDescent::Rule' ), - 'addressstruct' => bless( { - 'impcount' => 0, - 'calls' => [ - 'personalname', - 'sourceroute', - 'mailboxname', - 'hostname' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 2, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '(', - 'hashname' => '__STRING1__', - 'description' => '\'(\'', - 'lookahead' => 0, - 'line' => 82 - }, 'Parse::RecDescent::InterpLit' ), - bless( { - 'subrule' => 'personalname', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 82 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'sourceroute', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 82 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'mailboxname', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 82 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'hostname', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 82 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'pattern' => ')', - 'hashname' => '__STRING2__', - 'description' => '\')\'', - 'lookahead' => 0, - 'line' => 82 - }, 'Parse::RecDescent::InterpLit' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 83, - 'code' => '{ bless { personalname => $item{personalname} - , sourceroute => $item{sourceroute} - , mailboxname => $item{mailboxname} - , hostname => $item{hostname} - }, \'Mail::IMAPClient::BodyStructure::Address\'; - }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'addressstruct', - 'vars' => '', - 'line' => 82 - }, 'Parse::RecDescent::Rule' ), - 'sourceroute' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'STRING' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 78 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 78 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 78 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'sourceroute', - 'vars' => '', - 'line' => 78 - }, 'Parse::RecDescent::Rule' ), - 'subpart' => bless( { - 'impcount' => 0, - 'calls' => [ - 'part' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 2, - 'dircount' => 1, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '(', - 'hashname' => '__STRING1__', - 'description' => '\'(\'', - 'lookahead' => 0, - 'line' => 175 - }, 'Parse::RecDescent::InterpLit' ), - bless( { - 'subrule' => 'part', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 175 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'pattern' => ')', - 'hashname' => '__STRING2__', - 'description' => '\')\'', - 'lookahead' => 0, - 'line' => 175 - }, 'Parse::RecDescent::InterpLit' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 175, - 'code' => '{$return = $item{part}}' - }, 'Parse::RecDescent::Action' ), - bless( { - 'hashname' => '__DIRECTIVE1__', - 'name' => '', - 'lookahead' => 0, - 'line' => 175, - 'code' => 'push @{$thisparser->{deferred}}, sub { ++$subpartCount; };' - }, 'Parse::RecDescent::Directive' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'subpart', - 'vars' => '', - 'line' => 175 - }, 'Parse::RecDescent::Rule' ), - 'textlines' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'NUMBER' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 50 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NUMBER', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 50 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 50 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'textlines', - 'vars' => '', - 'line' => 50 - }, 'Parse::RecDescent::Rule' ), - 'BARESTRING' => bless( { - 'impcount' => 0, - 'calls' => [], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 2, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '^[)(\'"]', - 'hashname' => '__PATTERN1__', - 'description' => '/^[)(\'"]/', - 'lookahead' => -1, - 'rdelim' => '/', - 'line' => 43, - 'mod' => '', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ), - bless( { - 'pattern' => '^(?!\\(|\\))(?:\\\\ |\\S)+', - 'hashname' => '__PATTERN2__', - 'description' => '/^(?!\\\\(|\\\\))(?:\\\\\\\\ |\\\\S)+/', - 'lookahead' => 0, - 'rdelim' => '/', - 'line' => 43, - 'mod' => '', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 44, - 'code' => '{ $return = $item{__PATTERN1__} }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'BARESTRING', - 'vars' => '', - 'line' => 43 - }, 'Parse::RecDescent::Rule' ), - 'bodyloc' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'STRING' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 75 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 75 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 75 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'bodyloc', - 'vars' => '', - 'line' => 75 - }, 'Parse::RecDescent::Rule' ), - 'bodylang' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'STRING', - 'STRINGS' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 73 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 73 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 73 - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '2', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRINGS', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 73 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 73 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'bodylang', - 'vars' => '', - 'line' => 73 - }, 'Parse::RecDescent::Rule' ), - 'envelopestruct' => bless( { - 'impcount' => 0, - 'calls' => [ - 'date', - 'subject', - 'from', - 'sender', - 'replyto', - 'to', - 'cc', - 'bcc', - 'inreplyto', - 'messageid' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 2, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '(', - 'hashname' => '__STRING1__', - 'description' => '\'(\'', - 'lookahead' => 0, - 'line' => 105 - }, 'Parse::RecDescent::InterpLit' ), - bless( { - 'subrule' => 'date', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 105 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'subject', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 105 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'from', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 105 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'sender', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 105 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'replyto', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 105 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'to', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 105 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'cc', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 105 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'bcc', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 106 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'inreplyto', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 106 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'subrule' => 'messageid', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 106 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'pattern' => ')', - 'hashname' => '__STRING2__', - 'description' => '\')\'', - 'lookahead' => 0, - 'line' => 106 - }, 'Parse::RecDescent::InterpLit' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 107, - 'code' => '{ $return = bless {}, "Mail::IMAPClient::BodyStructure::Envelope"; - $return->{$_} = $item{$_} - for qw/date subject from sender replyto to cc/ - , qw/bcc inreplyto messageid/; - 1; - }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'envelopestruct', - 'vars' => '', - 'line' => 105 - }, 'Parse::RecDescent::Rule' ), - 'replyto' => bless( { - 'impcount' => 0, - 'calls' => [ - 'ADDRESSES' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'ADDRESSES', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 101 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'replyto', - 'vars' => '', - 'line' => 101 - }, 'Parse::RecDescent::Rule' ), - 'mailboxname' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NIL', - 'STRING' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'NIL', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 79 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 0, - 'items' => [ - bless( { - 'subrule' => 'STRING', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 79 - }, 'Parse::RecDescent::Subrule' ) - ], - 'line' => 79 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'mailboxname', - 'vars' => '', - 'line' => 79 - }, 'Parse::RecDescent::Rule' ) - }, - '_AUTOTREE' => undef, - '_check' => { - 'thisoffset' => '', - 'itempos' => '', - 'prevoffset' => '', - 'prevline' => '', - 'prevcolumn' => '', - 'thiscolumn' => '' - }, - '_AUTOACTION' => undef - }, 'Parse::RecDescent' ); -} \ No newline at end of file diff --git a/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/BodyStructure/Parse.pod b/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/BodyStructure/Parse.pod deleted file mode 100644 index 418259c..0000000 --- a/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/BodyStructure/Parse.pod +++ /dev/null @@ -1,15 +0,0 @@ -=head1 NAME - -Mail::IMAPClient::BodyStructure::Parse - used internally by Mail::IMAPClient::BodyStructure - -=head1 DESCRIPTION - -This module is used internally by L -and is generated using L. It is not meant to be used -directly by other scripts nor is there much point in debugging it. - -=head1 SYNOPSIS - -This module is used internally by L -and is not meant to be used or called directly from applications. So -don't do that. diff --git a/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/MessageSet.pm b/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/MessageSet.pm deleted file mode 100644 index 28405ad..0000000 --- a/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/MessageSet.pm +++ /dev/null @@ -1,280 +0,0 @@ -use warnings; -use strict; - -package Mail::IMAPClient::MessageSet; - -=head1 NAME - -Mail::IMAPClient::MessageSet - ranges of message sequence nummers - -=cut - -use overload - '""' => "str" - , '.=' => sub {$_[0]->cat($_[1])} - , '+=' => sub {$_[0]->cat($_[1])} - , '-=' => sub {$_[0]->rem($_[1])} - , '@{}' => "unfold" - , fallback => 1; - -sub new -{ my $class = shift; - my $range = $class->range(@_); - bless \$range, $class; -} - -sub str { overload::StrVal( ${$_[0]} ) } - -sub _unfold_range($) -# { my $x = shift; return if $x =~ m/[^0-9,:]$/; $x =~ s/\:/../g; eval $x; } -{ map { /(\d+)\s*\:\s*(\d+)/ ? ($1..$2) : $_ } - split /\,/, shift; -} - -sub rem -{ my $self = shift; - my %delete = map { ($_ => 1) } map { _unfold_range $_ } @_; - $$self = $self->range(grep {not $delete{$_}} $self->unfold); - $self; -} - -sub cat -{ my $self = shift; - $$self = $self->range($$self, @_); - $self; -} - -sub range -{ my $self = shift; - - my @msgs; - foreach my $m (@_) - { defined $m && length $m - or next; - - foreach my $mm (ref $m eq 'ARRAY' ? @$m : $m) - { push @msgs, _unfold_range $mm; - } - } - - @msgs - or return undef; - - @msgs = sort {$a <=> $b} @msgs; - my $low = my $high = shift @msgs; - - my @ranges; - foreach my $m (@msgs) - { next if $m == $high; # double - - if($m == $high + 1) { $high = $m } - else - { push @ranges, $low == $high ? $low : "$low:$high"; - $low = $high = $m; - } - } - - push @ranges, $low == $high ? $low : "$low:$high" ; - join ",", @ranges; -} - -sub unfold -{ my $self = shift; - wantarray ? ( _unfold_range $$self ) : [ _unfold_range $$self ]; -} - -=head1 SYNOPSIS - - my @msgs = $imap->search("SUBJECT","Virus"); # returns 1,3,4,5,6,9,10 - my $msgset = Mail::IMAPClient::MessageSet->new(@msgs); - print $msgset; # prints "1,3:6,9:10" - - # add message 14 to the set: - $msgset += 14; - print $msgset; # prints "1,3:6,9:10,14" - - # add messages 16,17,18,19, and 20 to the set: - $msgset .= "16,17,18:20"; - print $msgset; # prints "1,3:6,9:10,14,16:20" - - # Hey, I didn't really want message 17 in there; let's take it out: - $msgset -= 17; - print $msgset; # prints "1,3:6,9:10,14,16,18:20" - - # Now let's iterate over each message: - for my $msg (@$msgset) - { print "$msg\n"; # Prints: "1\n3\n4\n5\n6..16\n18\n19\n20\n" - } - print join("\n", @$msgset)."\n"; # same simpler - local $" = "\n"; print "@$msgset\n"; # even more simple - -=head1 DESCRIPTION - -The B module is designed to make life easier -for programmers who need to manipulate potentially large sets of IMAP -message UID's or sequence numbers. - -This module presents an object-oriented interface into handling your -message sets. The object reference returned by the L method is an -overloaded reference to a scalar variable that contains the message set's -compact RFC2060 representation. The object is overloaded so that using -it like a string returns this compact message set representation. You -can also add messages to the set (using either a '.=' operator or a '+=' -operator) or remove messages (with the '-=' operator). And if you use -it as an array reference, it will humor you and act like one by calling -L for you. - -RFC2060 specifies that multiple messages can be provided to certain IMAP -commands by separating them with commas. For example, "1,2,3,4,5" would -specify messages 1, 2, 3, 4, and (you guessed it!) 5. However, if you are -performing an operation on lots of messages, this string can get quite long. -So long that it may slow down your transaction, and perhaps even cause the -server to reject it. So RFC2060 also permits you to specifiy a range of -messages, so that messages 1, 2, 3, 4 and 5 can also be specified as -"1:5". - -This is where B comes in. It will convert -your message set into the shortest correct syntax. This could potentially -save you tons of network I/O, as in the case where you want to fetch the -flags for all messages in a 10000 message folder, where the messages -are all numbered sequentially. Delimited as commas, and making the -best-case assumption that the first message is message "1", it would take -48893 bytes to specify the whole message set using the comma-delimited -method. To specify it as a range, it takes just seven bytes (1:10000). - -Note that the L B method can be used as -a short-cut to specifying Cnew(@etc)>.) - -=head1 CLASS METHODS - -The only class method you need to worry about is B. And if you create -your B objects via L's -B method then you don't even need to worry about B. - -=head2 new - -Example: - - my $msgset = Mail::IMAPClient::MessageSet->new(@msgs); - -The B method requires at least one argument. That argument can be -either a message, a comma-separated list of messages, a colon-separated -range of messages, or a combination of comma-separated messages and -colon-separated ranges. It can also be a reference to an array of messages, -comma-separated message lists, and colon separated ranges. - -If more then one argument is supplied to B, then those arguments should -be more message numbers, lists, and ranges (or references to arrays of them) -just as in the first argument. - -The message numbers passed to B can really be any kind of number at -all but to be useful in a L session they should be either -message UID's (if your I parameter is true) or message sequence numbers. - -The B method will return a reference to a B -object. That object, when double quoted, will act just like a string whose -value is the message set expressed in the shortest possible way, with the -message numbers sorted in ascending order and with duplicates removed. - -=head1 OBJECT METHODS - -The only object method currently available to a B -object is the L method. - -=head2 unfold - -Example: - - my $msgset = $imap->Range( $imap->messages ) ; - my @all_messages = $msgset->unfold; - -The B method returns an array of messages that belong to the -message set. If called in a scalar context it returns a reference to the -array instead. - -=head1 OVERRIDDEN OPERATIONS - -B overrides a number of operators in order -to make manipulating your message sets easier. The overridden operations are: - -=head2 stringify - -Attempts to stringify a B object will result in -the compact message specification being returned, which is almost certainly -what you will want. - -=head2 Auto-increment - -Attempts to autoincrement a B object will -result in a message (or messages) being added to the object's message set. - -Example: - - $msgset += 34; - # Message #34 is now in the message set - -=head2 Concatenate - -Attempts to concatenate to a B object will -result in a message (or messages) being added to the object's message set. - -Example: - - $msgset .= "34,35,36,40:45"; - # Messages 34,35,36,40,41,42,43,44,and 45 are now in the message set - -The C<.=> operator and the C<+=> operator can be used interchangeably, but -as you can see by looking at the examples there are times when use of one -has an aesthetic advantage over use of the other. - -=head2 Autodecrement - -Attempts to autodecrement a B object will -result in a message being removed from the object's message set. - -Examples: - - $msgset -= 34; - # Message #34 is no longer in the message set - $msgset -= "1:10"; - # Messages 1 through 10 are no longer in the message set - -If you attempt to remove a message that was not in the original message set -then your resulting message set will be the same as the original, only more -expensive. However, if you attempt to remove several messages from the message -set and some of those messages were in the message set and some were not, -the additional overhead of checking for the messages that were not there -is negligable. In either case you get back the message set you want regardless -of whether it was already like that or not. - -=head1 AUTHOR - - David J. Kernen - The Kernen Consulting Group, Inc - -=head1 COPYRIGHT - - Copyright 1999, 2000, 2001, 2002 The Kernen Group, Inc. - All rights reserved. - -This program is free software; you can redistribute it and/or modify it -under the terms of either: - -=over 4 - -=item a) the "Artistic License" which comes with this Kit, or - -=item b) the GNU General Public License as published by the Free Software -Foundation; either version 1, or (at your option) any later version. - -=back - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See either the GNU -General Public License or the Artistic License for more details. All your -base are belong to us. - -=cut - -1; diff --git a/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/Thread.grammar b/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/Thread.grammar deleted file mode 100644 index 543c182..0000000 --- a/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/Thread.grammar +++ /dev/null @@ -1,18 +0,0 @@ -# Atoms: - -NUMBER: /\d+/ - -# Rules: - -threadmember: NUMBER { $return = $item{NUMBER} ; } | - thread { $return = $item{thread} ; } - -thread: "(" threadmember(s) ")" - { - $return = $item{'threadmember(s)'}||undef; - } - -# Start: -start: /^\* THREAD /i thread(s?) { - $return=$item{'thread(s?)'}||undef; -} diff --git a/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/Thread.pm b/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/Thread.pm deleted file mode 100644 index 03b6cdf..0000000 --- a/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/Thread.pm +++ /dev/null @@ -1,1024 +0,0 @@ -package Mail::IMAPClient::Thread; -use Parse::RecDescent; - -{ my $ERRORS; - - -package Parse::RecDescent::Mail::IMAPClient::Thread; -use strict; -use vars qw($skip $AUTOLOAD ); -@Parse::RecDescent::Mail::IMAPClient::Thread::ISA = (); -$skip = '\s*'; - - -{ -local $SIG{__WARN__} = sub {0}; -# PRETEND TO BE IN Parse::RecDescent NAMESPACE -*Parse::RecDescent::Mail::IMAPClient::Thread::AUTOLOAD = sub -{ - no strict 'refs'; - $AUTOLOAD =~ s/^Parse::RecDescent::Mail::IMAPClient::Thread/Parse::RecDescent/; - goto &{$AUTOLOAD}; -} -} - -push @Parse::RecDescent::Mail::IMAPClient::Thread::ISA, 'Parse::RecDescent'; -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::Thread::thread -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"thread"}; - - Parse::RecDescent::_trace(q{Trying rule: [thread]}, - Parse::RecDescent::_tracefirst($_[1]), - q{thread}, - $tracelevel) - if defined $::RD_TRACE; - - - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{'('}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: ['(' threadmember ')']}, - Parse::RecDescent::_tracefirst($_[1]), - q{thread}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{thread}); - %item = (__RULE__ => q{thread}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: ['(']}, - Parse::RecDescent::_tracefirst($text), - q{thread}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = "("; 1 } and - substr($text,0,length($_tok)) eq $_tok and - do { substr($text,0,length($_tok)) = ""; 1; } - ) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING1__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [threadmember]}, - Parse::RecDescent::_tracefirst($text), - q{thread}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{threadmember})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::Thread::threadmember, 1, 100000000, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{thread}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [threadmember]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{thread}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{threadmember(s)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying terminal: [')']}, - Parse::RecDescent::_tracefirst($text), - q{thread}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{')'})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = ")"; 1 } and - substr($text,0,length($_tok)) eq $_tok and - do { substr($text,0,length($_tok)) = ""; 1; } - ) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__STRING2__}=$_tok; - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{thread}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { - $return = $item{'threadmember(s)'}||undef; - }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: ['(' threadmember ')']<<}, - Parse::RecDescent::_tracefirst($text), - q{thread}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - - unless ( $_matched || defined($score) ) - { - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{thread}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{thread}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{thread}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{thread}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::Thread::NUMBER -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"NUMBER"}; - - Parse::RecDescent::_trace(q{Trying rule: [NUMBER]}, - Parse::RecDescent::_tracefirst($_[1]), - q{NUMBER}, - $tracelevel) - if defined $::RD_TRACE; - - - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{/\\d+/}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [/\\d+/]}, - Parse::RecDescent::_tracefirst($_[1]), - q{NUMBER}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{NUMBER}); - %item = (__RULE__ => q{NUMBER}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: [/\\d+/]}, Parse::RecDescent::_tracefirst($text), - q{NUMBER}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:\d+)/) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN1__}=$current_match; - - - - Parse::RecDescent::_trace(q{>>Matched production: [/\\d+/]<<}, - Parse::RecDescent::_tracefirst($text), - q{NUMBER}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - - unless ( $_matched || defined($score) ) - { - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{NUMBER}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{NUMBER}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{NUMBER}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{NUMBER}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::Thread::start -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"start"}; - - Parse::RecDescent::_trace(q{Trying rule: [start]}, - Parse::RecDescent::_tracefirst($_[1]), - q{start}, - $tracelevel) - if defined $::RD_TRACE; - - - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{/^\\* THREAD /i}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [/^\\* THREAD /i thread]}, - Parse::RecDescent::_tracefirst($_[1]), - q{start}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{start}); - %item = (__RULE__ => q{start}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying terminal: [/^\\* THREAD /i]}, Parse::RecDescent::_tracefirst($text), - q{start}, - $tracelevel) - if defined $::RD_TRACE; - $lastsep = ""; - $expectation->is(q{})->at($text); - - - unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:^\* THREAD )/i) - { - - $expectation->failed(); - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - - last; - } - $current_match = substr($text, $-[0], $+[0] - $-[0]); - substr($text,0,length($current_match),q{}); - Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [} - . $current_match . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $item{__PATTERN1__}=$current_match; - - - Parse::RecDescent::_trace(q{Trying repeated subrule: [thread]}, - Parse::RecDescent::_tracefirst($text), - q{start}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->is(q{thread})->at($text); - - unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::Thread::thread, 0, 100000000, $_noactions,$expectation,sub { \@arg }))) - { - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{start}, - $tracelevel) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched repeated subrule: [thread]<< (} - . @$_tok . q{ times)}, - - Parse::RecDescent::_tracefirst($text), - q{start}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{thread(s?)}} = $_tok; - push @item, $_tok; - - - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{start}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { - $return=$item{'thread(s?)'}||undef; -}; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [/^\\* THREAD /i thread]<<}, - Parse::RecDescent::_tracefirst($text), - q{start}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - - unless ( $_matched || defined($score) ) - { - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{start}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{start}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{start}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{start}, - $tracelevel) - } - $_[1] = $text; - return $return; -} - -# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args) -sub Parse::RecDescent::Mail::IMAPClient::Thread::threadmember -{ - my $thisparser = $_[0]; - use vars q{$tracelevel}; - local $tracelevel = ($tracelevel||0)+1; - $ERRORS = 0; - my $thisrule = $thisparser->{"rules"}{"threadmember"}; - - Parse::RecDescent::_trace(q{Trying rule: [threadmember]}, - Parse::RecDescent::_tracefirst($_[1]), - q{threadmember}, - $tracelevel) - if defined $::RD_TRACE; - - - my $err_at = @{$thisparser->{errors}}; - - my $score; - my $score_return; - my $_tok; - my $return = undef; - my $_matched=0; - my $commit=0; - my @item = (); - my %item = (); - my $repeating = defined($_[2]) && $_[2]; - my $_noactions = defined($_[3]) && $_[3]; - my @arg = defined $_[4] ? @{ &{$_[4]} } : (); - my %arg = ($#arg & 01) ? @arg : (@arg, undef); - my $text; - my $lastsep=""; - my $current_match; - my $expectation = new Parse::RecDescent::Expectation(q{NUMBER, or thread}); - $expectation->at($_[1]); - - my $thisline; - tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser; - - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [NUMBER]}, - Parse::RecDescent::_tracefirst($_[1]), - q{threadmember}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[0]; - $text = $_[1]; - my $_savetext; - @item = (q{threadmember}); - %item = (__RULE__ => q{threadmember}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [NUMBER]}, - Parse::RecDescent::_tracefirst($text), - q{threadmember}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::Thread::NUMBER($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{threadmember}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [NUMBER]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{threadmember}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{NUMBER}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{threadmember}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = $item{NUMBER} ; }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [NUMBER]<<}, - Parse::RecDescent::_tracefirst($text), - q{threadmember}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - - while (!$_matched && !$commit) - { - - Parse::RecDescent::_trace(q{Trying production: [thread]}, - Parse::RecDescent::_tracefirst($_[1]), - q{threadmember}, - $tracelevel) - if defined $::RD_TRACE; - my $thisprod = $thisrule->{"prods"}[1]; - $text = $_[1]; - my $_savetext; - @item = (q{threadmember}); - %item = (__RULE__ => q{threadmember}); - my $repcount = 0; - - - Parse::RecDescent::_trace(q{Trying subrule: [thread]}, - Parse::RecDescent::_tracefirst($text), - q{threadmember}, - $tracelevel) - if defined $::RD_TRACE; - if (1) { no strict qw{refs}; - $expectation->is(q{})->at($text); - unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::Thread::thread($thisparser,$text,$repeating,$_noactions,sub { \@arg }))) - { - - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($text), - q{threadmember}, - $tracelevel) - if defined $::RD_TRACE; - $expectation->failed(); - last; - } - Parse::RecDescent::_trace(q{>>Matched subrule: [thread]<< (return value: [} - . $_tok . q{]}, - - Parse::RecDescent::_tracefirst($text), - q{threadmember}, - $tracelevel) - if defined $::RD_TRACE; - $item{q{thread}} = $_tok; - push @item, $_tok; - - } - - Parse::RecDescent::_trace(q{Trying action}, - Parse::RecDescent::_tracefirst($text), - q{threadmember}, - $tracelevel) - if defined $::RD_TRACE; - - - $_tok = ($_noactions) ? 0 : do { $return = $item{thread} ; }; - unless (defined $_tok) - { - Parse::RecDescent::_trace(q{<> (return value: [undef])}) - if defined $::RD_TRACE; - last; - } - Parse::RecDescent::_trace(q{>>Matched action<< (return value: [} - . $_tok . q{])}, - Parse::RecDescent::_tracefirst($text)) - if defined $::RD_TRACE; - push @item, $_tok; - $item{__ACTION1__}=$_tok; - - - - Parse::RecDescent::_trace(q{>>Matched production: [thread]<<}, - Parse::RecDescent::_tracefirst($text), - q{threadmember}, - $tracelevel) - if defined $::RD_TRACE; - $_matched = 1; - last; - } - - - unless ( $_matched || defined($score) ) - { - - - $_[1] = $text; # NOT SURE THIS IS NEEDED - Parse::RecDescent::_trace(q{<>}, - Parse::RecDescent::_tracefirst($_[1]), - q{threadmember}, - $tracelevel) - if defined $::RD_TRACE; - return undef; - } - if (!defined($return) && defined($score)) - { - Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "", - q{threadmember}, - $tracelevel) - if defined $::RD_TRACE; - $return = $score_return; - } - splice @{$thisparser->{errors}}, $err_at; - $return = $item[$#item] unless defined $return; - if (defined $::RD_TRACE) - { - Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} . - $return . q{])}, "", - q{threadmember}, - $tracelevel); - Parse::RecDescent::_trace(q{(consumed: [} . - Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, - Parse::RecDescent::_tracefirst($text), - , q{threadmember}, - $tracelevel) - } - $_[1] = $text; - return $return; -} -} -package Mail::IMAPClient::Thread; sub new { my $self = bless( { - '_precompiled' => 1, - 'localvars' => '', - 'startcode' => '', - 'namespace' => 'Parse::RecDescent::Mail::IMAPClient::Thread', - 'rules' => { - 'thread' => bless( { - 'impcount' => 0, - 'calls' => [ - 'threadmember' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 2, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '(', - 'hashname' => '__STRING1__', - 'description' => '\'(\'', - 'lookahead' => 0, - 'line' => 10 - }, 'Parse::RecDescent::InterpLit' ), - bless( { - 'subrule' => 'threadmember', - 'expected' => undef, - 'min' => 1, - 'argcode' => undef, - 'max' => 100000000, - 'matchrule' => 0, - 'repspec' => 's', - 'lookahead' => 0, - 'line' => 10 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'pattern' => ')', - 'hashname' => '__STRING2__', - 'description' => '\')\'', - 'lookahead' => 0, - 'line' => 10 - }, 'Parse::RecDescent::InterpLit' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 11, - 'code' => '{ - $return = $item{\'threadmember(s)\'}||undef; - }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'thread', - 'vars' => '', - 'line' => 10 - }, 'Parse::RecDescent::Rule' ), - 'NUMBER' => bless( { - 'impcount' => 0, - 'calls' => [], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 1, - 'actcount' => 0, - 'items' => [ - bless( { - 'pattern' => '\\d+', - 'hashname' => '__PATTERN1__', - 'description' => '/\\\\d+/', - 'lookahead' => 0, - 'rdelim' => '/', - 'line' => 3, - 'mod' => '', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'NUMBER', - 'vars' => '', - 'line' => 1 - }, 'Parse::RecDescent::Rule' ), - 'start' => bless( { - 'impcount' => 0, - 'calls' => [ - 'thread' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 1, - 'actcount' => 1, - 'items' => [ - bless( { - 'pattern' => '^\\* THREAD ', - 'hashname' => '__PATTERN1__', - 'description' => '/^\\\\* THREAD /i', - 'lookahead' => 0, - 'rdelim' => '/', - 'line' => 16, - 'mod' => 'i', - 'ldelim' => '/' - }, 'Parse::RecDescent::Token' ), - bless( { - 'subrule' => 'thread', - 'expected' => undef, - 'min' => 0, - 'argcode' => undef, - 'max' => 100000000, - 'matchrule' => 0, - 'repspec' => 's?', - 'lookahead' => 0, - 'line' => 16 - }, 'Parse::RecDescent::Repetition' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 16, - 'code' => '{ - $return=$item{\'thread(s?)\'}||undef; -}' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'start', - 'vars' => '', - 'line' => 15 - }, 'Parse::RecDescent::Rule' ), - 'threadmember' => bless( { - 'impcount' => 0, - 'calls' => [ - 'NUMBER', - 'thread' - ], - 'changed' => 0, - 'opcount' => 0, - 'prods' => [ - bless( { - 'number' => '0', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'subrule' => 'NUMBER', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 7 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 7, - 'code' => '{ $return = $item{NUMBER} ; }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => undef - }, 'Parse::RecDescent::Production' ), - bless( { - 'number' => '1', - 'strcount' => 0, - 'dircount' => 0, - 'uncommit' => undef, - 'error' => undef, - 'patcount' => 0, - 'actcount' => 1, - 'items' => [ - bless( { - 'subrule' => 'thread', - 'matchrule' => 0, - 'implicit' => undef, - 'argcode' => undef, - 'lookahead' => 0, - 'line' => 8 - }, 'Parse::RecDescent::Subrule' ), - bless( { - 'hashname' => '__ACTION1__', - 'lookahead' => 0, - 'line' => 8, - 'code' => '{ $return = $item{thread} ; }' - }, 'Parse::RecDescent::Action' ) - ], - 'line' => 7 - }, 'Parse::RecDescent::Production' ) - ], - 'name' => 'threadmember', - 'vars' => '', - 'line' => 5 - }, 'Parse::RecDescent::Rule' ) - }, - '_AUTOTREE' => undef, - '_check' => { - 'thisoffset' => '', - 'itempos' => '', - 'prevoffset' => '', - 'prevline' => '', - 'prevcolumn' => '', - 'thiscolumn' => '' - }, - '_AUTOACTION' => undef - }, 'Parse::RecDescent' ); -} \ No newline at end of file diff --git a/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/Thread.pod b/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/Thread.pod deleted file mode 100644 index 46a5a26..0000000 --- a/W/Mail-IMAPClient-3.34/lib/Mail/IMAPClient/Thread.pod +++ /dev/null @@ -1,14 +0,0 @@ -=head1 NAME - -Mail::IMAPClient::Thread - used internally by Mail::IMAPClient->thread - -=head1 DESCRIPTION - -This module is used internally by L and is -generated using L. It is not meant to be used directly by -other scripts nor is there much point in debugging it. - -=head1 SYNOPSIS - -This module is used internally by L and is not meant to -be used or called directly from applications. So don't do that. diff --git a/W/Mail-IMAPClient-3.34/pm_to_blib b/W/Mail-IMAPClient-3.34/pm_to_blib deleted file mode 100644 index e69de29..0000000 diff --git a/W/Mail-IMAPClient-3.35.tar.gz b/W/Mail-IMAPClient-3.35.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..d38f41eb2ab614df78222392778265c19e229c67 GIT binary patch literal 186010 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 z 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 [ (IO::Socket::.. args) ] diff --git a/W/Mail-IMAPClient-3.34/MANIFEST b/W/Mail-IMAPClient-3.35/MANIFEST similarity index 100% rename from W/Mail-IMAPClient-3.34/MANIFEST rename to W/Mail-IMAPClient-3.35/MANIFEST diff --git a/W/Mail-IMAPClient-3.34/META.yml b/W/Mail-IMAPClient-3.35/META.yml similarity index 98% rename from W/Mail-IMAPClient-3.34/META.yml rename to W/Mail-IMAPClient-3.35/META.yml index 9bad9bc..b776acc 100644 --- a/W/Mail-IMAPClient-3.34/META.yml +++ b/W/Mail-IMAPClient-3.35/META.yml @@ -1,6 +1,6 @@ --- #YAML:1.0 name: Mail-IMAPClient -version: 3.34 +version: 3.35 abstract: IMAP4 client library author: - Phil Pearl (Lobbes) diff --git a/W/Mail-IMAPClient-3.34/Makefile.PL b/W/Mail-IMAPClient-3.35/Makefile.PL similarity index 100% rename from W/Mail-IMAPClient-3.34/Makefile.PL rename to W/Mail-IMAPClient-3.35/Makefile.PL diff --git a/W/Mail-IMAPClient-3.34/README b/W/Mail-IMAPClient-3.35/README similarity index 100% rename from W/Mail-IMAPClient-3.34/README rename to W/Mail-IMAPClient-3.35/README diff --git a/W/Mail-IMAPClient-3.34/examples/build_dist.pl b/W/Mail-IMAPClient-3.35/examples/build_dist.pl similarity index 100% rename from W/Mail-IMAPClient-3.34/examples/build_dist.pl rename to W/Mail-IMAPClient-3.35/examples/build_dist.pl diff --git a/W/Mail-IMAPClient-3.34/examples/build_ldif.pl b/W/Mail-IMAPClient-3.35/examples/build_ldif.pl similarity index 100% rename from W/Mail-IMAPClient-3.34/examples/build_ldif.pl rename to W/Mail-IMAPClient-3.35/examples/build_ldif.pl diff --git a/W/Mail-IMAPClient-3.34/examples/cleanTest.pl b/W/Mail-IMAPClient-3.35/examples/cleanTest.pl similarity index 100% rename from W/Mail-IMAPClient-3.34/examples/cleanTest.pl rename to W/Mail-IMAPClient-3.35/examples/cleanTest.pl diff --git a/W/Mail-IMAPClient-3.34/examples/copy_folder.pl b/W/Mail-IMAPClient-3.35/examples/copy_folder.pl similarity index 100% rename from W/Mail-IMAPClient-3.34/examples/copy_folder.pl rename to W/Mail-IMAPClient-3.35/examples/copy_folder.pl diff --git a/W/Mail-IMAPClient-3.34/examples/cyrus_expire.pl b/W/Mail-IMAPClient-3.35/examples/cyrus_expire.pl similarity index 100% rename from W/Mail-IMAPClient-3.34/examples/cyrus_expire.pl rename to W/Mail-IMAPClient-3.35/examples/cyrus_expire.pl diff --git a/W/Mail-IMAPClient-3.34/examples/cyrus_expunge.pl b/W/Mail-IMAPClient-3.35/examples/cyrus_expunge.pl similarity index 100% rename from W/Mail-IMAPClient-3.34/examples/cyrus_expunge.pl rename to W/Mail-IMAPClient-3.35/examples/cyrus_expunge.pl diff --git a/W/Mail-IMAPClient-3.34/examples/find_dup_msgs.pl b/W/Mail-IMAPClient-3.35/examples/find_dup_msgs.pl similarity index 100% rename from W/Mail-IMAPClient-3.34/examples/find_dup_msgs.pl rename to W/Mail-IMAPClient-3.35/examples/find_dup_msgs.pl diff --git a/W/Mail-IMAPClient-3.34/examples/idle.pl b/W/Mail-IMAPClient-3.35/examples/idle.pl similarity index 100% rename from W/Mail-IMAPClient-3.34/examples/idle.pl rename to W/Mail-IMAPClient-3.35/examples/idle.pl diff --git a/W/Mail-IMAPClient-3.34/examples/imap_to_mbox.pl b/W/Mail-IMAPClient-3.35/examples/imap_to_mbox.pl similarity index 100% rename from W/Mail-IMAPClient-3.34/examples/imap_to_mbox.pl rename to W/Mail-IMAPClient-3.35/examples/imap_to_mbox.pl diff --git a/W/Mail-IMAPClient-3.34/examples/imtestExample.pl b/W/Mail-IMAPClient-3.35/examples/imtestExample.pl similarity index 100% rename from W/Mail-IMAPClient-3.34/examples/imtestExample.pl rename to W/Mail-IMAPClient-3.35/examples/imtestExample.pl diff --git a/W/Mail-IMAPClient-3.34/examples/migrate_mail2.pl b/W/Mail-IMAPClient-3.35/examples/migrate_mail2.pl similarity index 100% rename from W/Mail-IMAPClient-3.34/examples/migrate_mail2.pl rename to W/Mail-IMAPClient-3.35/examples/migrate_mail2.pl diff --git a/W/Mail-IMAPClient-3.34/examples/migrate_mbox.pl b/W/Mail-IMAPClient-3.35/examples/migrate_mbox.pl similarity index 100% rename from W/Mail-IMAPClient-3.34/examples/migrate_mbox.pl rename to W/Mail-IMAPClient-3.35/examples/migrate_mbox.pl diff --git a/W/Mail-IMAPClient-3.34/examples/populate_mailbox.pl b/W/Mail-IMAPClient-3.35/examples/populate_mailbox.pl similarity index 100% rename from W/Mail-IMAPClient-3.34/examples/populate_mailbox.pl rename to W/Mail-IMAPClient-3.35/examples/populate_mailbox.pl diff --git a/W/Mail-IMAPClient-3.34/examples/sharedFolder.pl b/W/Mail-IMAPClient-3.35/examples/sharedFolder.pl similarity index 100% rename from W/Mail-IMAPClient-3.34/examples/sharedFolder.pl rename to W/Mail-IMAPClient-3.35/examples/sharedFolder.pl diff --git a/W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient.pm b/W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient.pm similarity index 97% rename from W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient.pm rename to W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient.pm index 7a568b0..6e77c85 100644 --- a/W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient.pm +++ b/W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient.pm @@ -7,7 +7,7 @@ use strict; use warnings; package Mail::IMAPClient; -our $VERSION = '3.34'; +our $VERSION = '3.35'; use Mail::IMAPClient::MessageSet; @@ -36,8 +36,6 @@ use constant { DATA => 2, # Array index for output line data }; -use constant NonFolderArg => 1; # for Massage indicating non-folder arguments - my %SEARCH_KEYS = map { ( $_ => 1 ) } qw( ALL ANSWERED BCC BEFORE BODY CC DELETED DRAFT FLAGGED FROM HEADER KEYWORD LARGER NEW NOT OLD ON OR RECENT @@ -535,7 +533,7 @@ sub compress { return $ret if ( !$ret && !$lz ); # $ret is undef or 0 } - # accummulate inflated data in $Ibuf + # accumulate inflated data in $Ibuf if ($lz) { my ( $tbuf, $rc ) = $io->inflate( \$Zbuf ); unless ( $rc == $zcl->Z_OK ) { @@ -649,21 +647,12 @@ sub _list_or_lsub { length $target or $target = '""'; $target eq '*' || $target eq '""' - or $target = $self->Massage($target); + or $target = $self->Quote($target); $self->_imap_command(qq($cmd "$reference" $target)) or return undef; - # cleanup any literal data that may be returned - my $ret = wantarray ? [ $self->History ] : $self->Results; - if ($ret) { - my $cmd = wantarray ? undef : shift @$ret; - $self->_list_response_preprocess($ret); - unshift( @$ret, $cmd ) if defined($cmd); - } - - #return wantarray ? $self->History : $self->Results; - return wantarray ? @$ret : $ret; + return wantarray ? $self->Escaped_history : $self->Escaped_results; } sub list { shift->_list_or_lsub( "LIST", @_ ) } @@ -765,7 +754,7 @@ sub subscribed { sub deleteacl { my ( $self, $target, $user ) = @_; - $target = $self->Massage($target); + $target = $self->Quote($target); $user = ( $user eq "" ) ? qq("") : $self->Quote($user); $self->_imap_command(qq(DELETEACL $target $user)) @@ -777,7 +766,7 @@ sub deleteacl { sub setacl { my ( $self, $target, $user, $acl ) = @_; $target ||= $self->Folder; - $target = $self->Massage($target); + $target = $self->Quote($target); $user ||= $self->User; $user = ( $user eq "" ) ? qq("") : $self->Quote($user); @@ -792,7 +781,7 @@ sub setacl { sub getacl { my ( $self, $target ) = @_; defined $target or $target = $self->Folder; - my $mtarget = $self->Massage($target); + my $mtarget = $self->Quote($target); $self->_imap_command(qq(GETACL $mtarget)) or return undef; @@ -822,7 +811,7 @@ sub getacl { sub listrights { my ( $self, $target, $user ) = @_; $target ||= $self->Folder; - $target = $self->Massage($target); + $target = $self->Quote($target); $user ||= $self->User; $user = ( $user eq "" ) ? qq("") : $self->Quote($user); @@ -841,7 +830,7 @@ sub select { my ( $self, $target ) = @_; defined $target or return undef; - my $qqtarget = $self->Massage($target); + my $qqtarget = $self->Quote($target); my $old = $self->Folder; $self->_imap_command("SELECT $qqtarget") @@ -1104,7 +1093,7 @@ sub examine { my ( $self, $target ) = @_; defined $target or return undef; - $self->_imap_command( 'EXAMINE ' . $self->Massage($target) ) + $self->_imap_command( 'EXAMINE ' . $self->Quote($target) ) or return undef; my $old = $self->Folder; @@ -1650,7 +1639,7 @@ sub _read_line { while ( $iBuffer =~ s/^(.*?$CR?$LF)//o ) # consume line { my $current_line = $1; - if ( $current_line !~ s/\s*\{(\d+)\}$CR?$LF$//o ) { + if ( $current_line !~ s/\{(\d+)\}$CR?$LF$//o ) { push @$oBuffer, [ $index++, 'OUTPUT', $current_line ]; next; } @@ -1845,6 +1834,35 @@ sub _trans_data(;$) { map { $_->[DATA] } $_[0]->_transaction( $_[1] ); } +sub _escaped_trans_data(;$) { + my ( $self, $trans ) = @_; + my @a; + my $prevwasliteral = 0; + foreach my $line ( $self->_transaction($trans) ) { + next unless defined $line; + + my $data = $line->[DATA]; + + # literal is appended to previous data + if ( $self->_is_literal($line) ) { + $data = $self->Escape($data); + $a[-1] .= qq("$data"); + $prevwasliteral = 1; + } + else { + if ($prevwasliteral) { + $a[-1] .= $data; + } + else { + push( @a, $data ); + } + $prevwasliteral = 0; + } + } + + return wantarray ? @a : \@a; +} + sub Report { my $self = shift; map { $self->_trans_data($_) } $self->_trans_index; @@ -1874,30 +1892,15 @@ sub _transaction_literals() { grep { $self->_is_literal($_) } $self->_transaction; } +sub Escaped_history { + my ( $self, $trans ) = @_; + my ( $cmd, @a ) = $self->_escaped_trans_data($trans); + return wantarray ? @a : \@a; +} + sub Escaped_results { my ( $self, $trans ) = @_; - my @a; - my $prevwasliteral = 0; - foreach my $line ( grep defined, $self->_transaction($trans) ) { - my $data = $line->[DATA]; - - # literal is appended to previous data - if ( $self->_is_literal($line) ) { - $data = $self->Escape($data); - $a[-1] .= qq( "$data"); - $prevwasliteral = 1; - } - else { - if ($prevwasliteral) { - $a[-1] .= $data; - } - else { - push( @a, $data ); - } - $prevwasliteral = 0; - } - } - + my @a = $self->_escaped_trans_data($trans); return wantarray ? @a : \@a; } @@ -1936,8 +1939,7 @@ sub _disconnect { # LIST/XLIST/LSUB Response # Contents: name attributes, hierarchy delimiter, name # Example: * LIST (\Noselect) "/" ~/Mail/foo -# NOTE: in _list_response_preprocess we append literal data so we need -# to be liberal about our matching of folder name data +# NOTE: liberal matching as folder name data may be Escape()d sub _list_or_lsub_response_parse { my ( $self, $resp ) = @_; @@ -1959,25 +1961,6 @@ sub _list_or_lsub_response_parse { return wantarray ? %info : \%info; } -# handle listeral data returned in list/lsub responses -# some example responses: -# * LIST () "/" "My Folder" # nothing to do here... -# * LIST () "/" {9} # the {9} is already removed by _read_line() -# Special % # we append this to the previous line -sub _list_response_preprocess { - my ( $self, $data ) = @_; - return undef unless defined $data; - - for ( my $m = 0 ; $m < @$data ; $m++ ) { - if ( $data->[$m] && $data->[$m] !~ /$CR?$LF$/o ) { - $self->_debug("concatenating '$data->[$m]' and '$data->[$m+1]'"); - $data->[$m] .= " " . $data->[ $m + 1 ]; - splice @$data, $m + 1, 1; - } - } - return $data; -} - sub exists { my ( $self, $folder ) = @_; $self->status($folder) ? $self : undef; @@ -2302,7 +2285,7 @@ sub store { sub _imap_folder_command($$@) { my ( $self, $command ) = ( shift, shift ); - my $folder = $self->Massage(shift); + my $folder = $self->Quote(shift); $self->_imap_command( join ' ', $command, $folder, @_ ) or return undef; @@ -2380,8 +2363,8 @@ sub uidexpunge { sub rename { my ( $self, $from, $to ) = @_; - $from = ( $from eq "" ) ? qq("") : $self->Massage($from); - $to = ( $to eq "" ) ? qq("") : $self->Massage($to); + $from = ( $from eq "" ) ? qq("") : $self->Quote($from); + $to = ( $to eq "" ) ? qq("") : $self->Quote($to); $self->_imap_command(qq(RENAME $from $to)) ? $self : undef; } @@ -2392,7 +2375,7 @@ sub status { my $which = @_ ? join( " ", @_ ) : 'MESSAGES'; - my $box = $self->Massage($folder); + my $box = $self->Quote($folder); $self->_imap_command("STATUS $box ($which)") or return undef; @@ -2621,11 +2604,10 @@ sub or { return undef; } - my $or = "OR " - . $self->Massage( shift @what ) . " " - . $self->Massage( shift @what ); + my $or = + "OR " . $self->Quote( shift @what ) . " " . $self->Quote( shift @what ); - $or = "OR $or " . $self->Massage($_) for @what; + $or = "OR $or " . $self->Quote($_) for @what; $self->_imap_uid_command( SEARCH => $or ) or return undef; @@ -2708,7 +2690,7 @@ sub thread { my $charset = shift || 'UTF-8'; my @a = @_ ? @_ : 'ALL'; - $a[-1] = $self->Massage( $a[-1], 1 ) + $a[-1] = $self->Quote( $a[-1], 1 ) if @a > 1 && !exists $SEARCH_KEYS{ uc $a[-1] }; $self->_imap_uid_command( THREAD => $algorythm, $charset, @a ) @@ -2955,7 +2937,7 @@ sub append_string($$$;$$) { my $text = defined( $_[2] ) ? $_[2] : ''; - $folder = $self->Massage($folder); + $folder = $self->Quote($folder); $flags = $self->_clean_flags($flags) if ( defined $flags ); $date = $self->_clean_date($date) if ( defined $date ); $text =~ s/\r?\n/$CRLF/og; @@ -3010,7 +2992,7 @@ sub append_file { binmode($fh); - $folder = $self->Massage($folder) if ( defined $folder ); + $folder = $self->Quote($folder) if ( defined $folder ); $flags = $self->_clean_flags($flags) if ( defined $flags ); # allow the date to be specified or even use mtime on file @@ -3254,7 +3236,7 @@ sub copy { ? $self->Range(@msgs) : join ',', map { ref $_ ? @$_ : $_ } @msgs; - $self->_imap_uid_command( COPY => $msgs, $self->Massage($target) ) + $self->_imap_uid_command( COPY => $msgs, $self->Quote($target) ) or return undef; my @results = $self->History; @@ -3358,21 +3340,21 @@ sub size { sub getquotaroot { my ( $self, $what ) = @_; - my $who = $what ? $self->Massage($what) : "INBOX"; + my $who = $what ? $self->Quote($what) : "INBOX"; return $self->_imap_command("GETQUOTAROOT $who") ? $self->Results : undef; } # BUG? using user/$User here and INBOX in quota/quota_usage sub getquota { my ( $self, $what ) = @_; - my $who = $what ? $self->Massage($what) : "user/" . $self->User; + my $who = $what ? $self->Quote($what) : "user/" . $self->User; return $self->_imap_command("GETQUOTA $who") ? $self->Results : undef; } # usage: $self->setquota($quotaroot, storage => 512, ...) sub setquota(@) { my ( $self, $what ) = ( shift, shift ); - my $who = $what ? $self->Massage($what) : "user/" . $self->User; + my $who = $what ? $self->Quote($what) : "user/" . $self->User; my @limits; while (@_) { my ( $k, $v ) = ( $self->Quote( uc( shift @_ ) ), shift @_ ); @@ -3396,8 +3378,6 @@ sub quota_usage { return ( map { /.*STORAGE\s+(\d+)\s+\d+.*\n$/ ? $1 : () } @$tref )[0]; } -sub Quote($) { $_[0]->Massage( $_[1], NonFolderArg ) } - # rfc3501: # atom-specials = "(" / ")" / "{" / SP / CTL / list-wildcards / # quoted-specials / resp-specials @@ -3408,10 +3388,8 @@ sub Quote($) { $_[0]->Massage( $_[1], NonFolderArg ) } # CTL ::= # Paranoia/safety: # encode strings with "}" / "[" / "]" / non-ascii chars -sub Massage($;$) { - my ( $self, $name, $notFolder ) = @_; - $name =~ s/^\"(.*)\"$/$1/s unless $notFolder; - +sub Quote($) { + my ( $self, $name ) = @_; if ( $name =~ /["\\[:^ascii:][:cntrl:]]/s ) { return "{" . length($name) . "}" . $CRLF . $name; } @@ -3423,6 +3401,13 @@ sub Massage($;$) { } } +# legacy behavior: strip double quote around folder name args! +sub Massage($;$) { + my ( $self, $name, $notFolder ) = @_; + $name =~ s/^\"(.*)\"$/$1/s unless $notFolder; + return $self->Quote($name); +} + sub unseen_count { my ( $self, $folder ) = ( shift, shift ); $folder ||= $self->Folder; diff --git a/W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient.pod b/W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient.pod similarity index 98% rename from W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient.pod rename to W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient.pod index 5dce129..5b306be 100644 --- a/W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient.pod +++ b/W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient.pod @@ -235,8 +235,7 @@ returned by B. Note this method should not be used on folder names for Mail::IMAPClient methods, since methods that accept folder names as an -argument will quote the folder name arguments appropriately -automatically. +argument will quote the folder name arguments automatically. If you are getting unexpected results when running methods with values that have (or might have) embedded spaces, double quotes, braces, or @@ -680,7 +679,8 @@ Example: The B method accepts no arguments. This method is used to instruct the server to use the DEFLATE (RFC1951) compression -extension. See the L attribute for how to specify arguments for use during the the initialization process. +extension. See the L attribute for how to specify +arguments for use during the initialization process. Version note: method added in Mail::IMAPClient 3.30 @@ -1114,7 +1114,7 @@ context) listing the flags that have been set. Flag names are provided with leading backslashes. As of version 1.11, you can supply either a list of message id's or a -reference to an array of of message id's (which means either sequence +reference to an array of message id's (which means either sequence number, if the Uid parameter is false, or message UID's, if the Uid parameter is true) instead of supplying a single message sequence number or UID. If you do, then the return value will not be an array @@ -1412,7 +1412,7 @@ which is just a version of the envelope that's been parsed into a Perl object. For more information on how to use this object once you've gotten it, -see the L documention. (As of this +see the L documentation. (As of this writing there is no separate pod document for B.) @@ -1633,7 +1633,7 @@ Example: $imap->logout or die "Could not logout: $@\n"; -The B method implements the LOGOUT IMAP client commmand. This +The B method implements the LOGOUT IMAP client command. This method causes the server to end the connection and the IMAPClient client enters the I state. This method does not, destroy the IMAPClient object, thus the L and L methods can @@ -1688,20 +1688,23 @@ Example: $imap->search(HEADER => 'Message-id' => $imap->Massage($msg_id,1)); +WARNING: This method may be deprecated in the future, consider using +L instead of this method. + The B method accepts a value as an argument and, optionally, a second value that, when true, indicates that the first argument is not the name of an existing folder. +WARNING: If the first argument has double quotes at the beginning and +end of its value, those double quote will be stripped unless the +second argument does not evaluate to true. + It returns its argument as a correctly quoted string or a literal string. Note that you should rarely use this on folder names, since methods -that accept folder names as an argument will call B for -you. In fact, it was originally developed as an undocumented helper -method meant for internal Mail::IMAPClient methods only. - -You may also want to see the L method, which is related to -this method. +that accept folder names as an argument will call B for +you. =head2 message_count @@ -1840,7 +1843,7 @@ The target ($imap_dest) Mail::IMAPClient object must not be the same object as the source ($imap_src). This method does not attempt to minimize memory usage. In the future -it could be enhanced to (optionaly) write message data to a temporary +it could be enhanced to (optionally) write message data to a temporary file to avoid storing the entire message in memory. To work around potential network timeouts on large messages, consider @@ -2802,8 +2805,8 @@ their private extensions to the protocol implementation. =head2 copy($msg, $folder) -Copy a message from the currently selected folder in the the folder -whose name is in C<$folder> +Copy a message from the currently selected folder in the folder whose +name is in C<$folder> =head2 subscribe($folder) @@ -3482,7 +3485,7 @@ will be used as arguments to IO::Socket::SSL->start_SSL. By default this connection is set to blocking while establishing the connection with a timeout of 30 seconds. The socket will be reset to the original blocking/non-blocking value after a successful TLS -negotiation has occured. The arguments used in the call to start_SSL +negotiation has occurred. The arguments used in the call to start_SSL can be controlled by setting this attribute to an ARRAY reference containing the desired arguments. @@ -3514,7 +3517,7 @@ attribute is used in the L method. The arguments used in the call to IO::Socket::SSL->new can be controlled by setting this attribute to an ARRAY reference containing the desired arguments. -See also L for details on connection initiatiation and +See also L for details on connection initiation and L and L if you need to take more control of connection management. @@ -3654,18 +3657,34 @@ object, but are particularly useful for determining the cause of failure when a connection and login are attempted as part of a single L method invocation. The status methods are: +=head2 Escaped_history + +Example: + + my @history = $imap->Escaped_history; + +The B method is almost identical to the B +method. Unlike the B method, however, server output +transmitted literally will be wrapped in double quotes, with all +double quotes, backslashes escaped. If called in a scalar context, +B returns an array reference rather than an array. + +B is useful if you are retrieving output and +processing it manually, and you are depending on the above special +characters to delimit the data. It is not useful when retrieving +message contents; use B or B for that. + =head2 Escaped_results Example: my @results = $imap->Escaped_results; -The B method is almost identical to the B -method. Unlike the B method, however, server output -transmitted literally will be wrapped in double quotes, with all of -the parentheses, double quotes, backslashes, newlines, and carriage -returns escaped. If called in a scalar context, B -returns an array reference rather than an array. +The B method is almost identical to the B +method. Unlike the B method, however, server output +transmitted literally will be wrapped in double quotes, with all +double quotes, backslashes escaped. If called in a scalar context, +B returns an array reference rather than an array. B is useful if you are retrieving output and processing it manually, and you are depending on the above special diff --git a/W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient/BodyStructure.pm b/W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient/BodyStructure.pm similarity index 99% rename from W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient/BodyStructure.pm rename to W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient/BodyStructure.pm index 412c61e..ad65528 100644 --- a/W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient/BodyStructure.pm +++ b/W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient/BodyStructure.pm @@ -266,7 +266,7 @@ one argument, a string containing a server response to a FETCH BODYSTRUCTURE directive. The module B provides the B -conveniece method to simplify use of this module when starting with +convenience method to simplify use of this module when starting with just a messages sequence number or unique ID (UID). =head1 Object Methods @@ -451,7 +451,7 @@ Returns an array of recipients' address structures. Each of the methods that returns a list of address structures (i.e. a list of B arrays) also has -an analagous method that will return a list of E-Mail addresses +an analogous method that will return a list of E-Mail addresses instead. The addresses are in the format Cmailboxname@hostnameE> (see the section on B, below) However, if the diff --git a/W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient/BodyStructure/Parse.grammar b/W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient/BodyStructure/Parse.grammar similarity index 100% rename from W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient/BodyStructure/Parse.grammar rename to W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient/BodyStructure/Parse.grammar diff --git a/W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient/BodyStructure/Parse.pm b/W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient/BodyStructure/Parse.pm similarity index 100% rename from W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient/BodyStructure/Parse.pm rename to W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient/BodyStructure/Parse.pm diff --git a/W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient/BodyStructure/Parse.pod b/W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient/BodyStructure/Parse.pod similarity index 100% rename from W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient/BodyStructure/Parse.pod rename to W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient/BodyStructure/Parse.pod diff --git a/W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient/MessageSet.pm b/W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient/MessageSet.pm similarity index 97% rename from W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient/MessageSet.pm rename to W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient/MessageSet.pm index 28405ad..b03a78c 100644 --- a/W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient/MessageSet.pm +++ b/W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient/MessageSet.pm @@ -5,7 +5,7 @@ package Mail::IMAPClient::MessageSet; =head1 NAME -Mail::IMAPClient::MessageSet - ranges of message sequence nummers +Mail::IMAPClient::MessageSet - ranges of message sequence numbers =cut @@ -129,7 +129,7 @@ commands by separating them with commas. For example, "1,2,3,4,5" would specify messages 1, 2, 3, 4, and (you guessed it!) 5. However, if you are performing an operation on lots of messages, this string can get quite long. So long that it may slow down your transaction, and perhaps even cause the -server to reject it. So RFC2060 also permits you to specifiy a range of +server to reject it. So RFC2060 also permits you to specify a range of messages, so that messages 1, 2, 3, 4 and 5 can also be specified as "1:5". @@ -244,7 +244,7 @@ then your resulting message set will be the same as the original, only more expensive. However, if you attempt to remove several messages from the message set and some of those messages were in the message set and some were not, the additional overhead of checking for the messages that were not there -is negligable. In either case you get back the message set you want regardless +is negligible. In either case you get back the message set you want regardless of whether it was already like that or not. =head1 AUTHOR diff --git a/W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient/Thread.grammar b/W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient/Thread.grammar similarity index 100% rename from W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient/Thread.grammar rename to W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient/Thread.grammar diff --git a/W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient/Thread.pm b/W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient/Thread.pm similarity index 100% rename from W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient/Thread.pm rename to W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient/Thread.pm diff --git a/W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient/Thread.pod b/W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient/Thread.pod similarity index 100% rename from W/Mail-IMAPClient-3.34/blib/lib/Mail/IMAPClient/Thread.pod rename to W/Mail-IMAPClient-3.35/lib/Mail/IMAPClient/Thread.pod diff --git a/W/Mail-IMAPClient-3.34/prepare_dist b/W/Mail-IMAPClient-3.35/prepare_dist similarity index 100% rename from W/Mail-IMAPClient-3.34/prepare_dist rename to W/Mail-IMAPClient-3.35/prepare_dist diff --git a/W/Mail-IMAPClient-3.34/t/basic.t b/W/Mail-IMAPClient-3.35/t/basic.t similarity index 100% rename from W/Mail-IMAPClient-3.34/t/basic.t rename to W/Mail-IMAPClient-3.35/t/basic.t diff --git a/W/Mail-IMAPClient-3.34/t/body_string.t b/W/Mail-IMAPClient-3.35/t/body_string.t similarity index 100% rename from W/Mail-IMAPClient-3.34/t/body_string.t rename to W/Mail-IMAPClient-3.35/t/body_string.t diff --git a/W/Mail-IMAPClient-3.34/t/bodystructure.t b/W/Mail-IMAPClient-3.35/t/bodystructure.t similarity index 100% rename from W/Mail-IMAPClient-3.34/t/bodystructure.t rename to W/Mail-IMAPClient-3.35/t/bodystructure.t diff --git a/W/Mail-IMAPClient-3.34/t/fetch_hash.t b/W/Mail-IMAPClient-3.35/t/fetch_hash.t similarity index 100% rename from W/Mail-IMAPClient-3.34/t/fetch_hash.t rename to W/Mail-IMAPClient-3.35/t/fetch_hash.t diff --git a/W/Mail-IMAPClient-3.34/t/messageset.t b/W/Mail-IMAPClient-3.35/t/messageset.t similarity index 100% rename from W/Mail-IMAPClient-3.34/t/messageset.t rename to W/Mail-IMAPClient-3.35/t/messageset.t diff --git a/W/Mail-IMAPClient-3.34/t/pod.t b/W/Mail-IMAPClient-3.35/t/pod.t similarity index 100% rename from W/Mail-IMAPClient-3.34/t/pod.t rename to W/Mail-IMAPClient-3.35/t/pod.t diff --git a/W/Mail-IMAPClient-3.34/t/simple.t b/W/Mail-IMAPClient-3.35/t/simple.t similarity index 100% rename from W/Mail-IMAPClient-3.34/t/simple.t rename to W/Mail-IMAPClient-3.35/t/simple.t diff --git a/W/Mail-IMAPClient-3.34/t/thread.t b/W/Mail-IMAPClient-3.35/t/thread.t similarity index 100% rename from W/Mail-IMAPClient-3.34/t/thread.t rename to W/Mail-IMAPClient-3.35/t/thread.t diff --git a/W/Mail-IMAPClient-3.34/test_template.txt b/W/Mail-IMAPClient-3.35/test_template.txt similarity index 100% rename from W/Mail-IMAPClient-3.34/test_template.txt rename to W/Mail-IMAPClient-3.35/test_template.txt diff --git a/W/learn/copy b/W/learn/copy new file mode 100755 index 0000000..dd46c88 --- /dev/null +++ b/W/learn/copy @@ -0,0 +1,41 @@ +#!/usr/bin/perl + +use warnings; +use strict; +use English; +use Mail::IMAPClient; + +my $rcs = '$Id: append,v 1.1 2011/07/14 16:49:02 gilles Exp gilles $ '; + +$ARGV[3] or die "usage: $0 host user password folder uid\n"; + +my $host = $ARGV[0]; +my $user = $ARGV[1]; +my $password = $ARGV[2]; +my $folder_1 = $ARGV[3]; +my $folder_2 = $ARGV[4]; + +my $imap = Mail::IMAPClient->new( ); +$imap->Debug( 1 ); +$imap->Server( $host ); +$imap->connect( ) or die; +$imap->User( $user ); +$imap->Password( $password ) ; +$imap->login( ) or die; +$imap->Uid( 1 ) ; +$imap->Peek( 1 ) ; +$imap->Clear( 0 ) ; + +#print map {"$_\n"} $imap->folders( ) ; + +$imap->select( $folder_1 ) or die ; +my @msgs_1 = $imap->messages ; +print "LIST_1: @msgs_1\n" ; +my $copy = $imap->copy( $folder_2, $msgs_1[0] ) ; +print "copy: $copy\n" ; +$imap->select( $folder_2 ) or die ; +my @msgs_2 = $imap->messages ; +print "LIST_2: @msgs_2\n" ; + +$imap->close( ) ; + diff --git a/W/learn/hashes_set b/W/learn/hashes_set new file mode 100755 index 0000000..a28cb6c --- /dev/null +++ b/W/learn/hashes_set @@ -0,0 +1,37 @@ +#!/usr/bin/perl -w + +use Data::Dumper ; +use strict ; + +my %hash_1 = ( + 'abcd' => 'zzz', + 'efgh' => 'zzz', +) ; + +my %hash_2 = ( + '2345' => 'zzz', + '8888' => 'zzz', + 'efgh' => 'zzz', +) ; + + +print Data::Dumper->Dump( [ \%hash_1 ] ) ; + +my %hash_X ; + +foreach my $k ( keys( %hash_1 ) ) { + $hash_X{ $k }->{ 'folder_1' } ++ ; +} + +foreach my $k ( keys( %hash_2 ) ) { + $hash_X{ $k }->{ 'folder_2'} ++ ; +} + +foreach my $k ( keys( %hash_1 ) ) { + $hash_X{ $k }->{ 'folder_1' } ++ ; +} + +print Data::Dumper->Dump( [ \%hash_X ] ) ; + +print keys( %{ $hash_X{ 'efgh' } } ) ; + diff --git a/W/memo b/W/memo index 2b3c3e9..38aa862 100644 --- a/W/memo +++ b/W/memo @@ -1,6 +1,6 @@ #!/bin/sh -# $Id: memo,v 1.44 2013/07/03 04:14:44 gilles Exp gilles $ +# $Id: memo,v 1.45 2013/11/11 19:32:19 gilles Exp gilles $ count_nice() { @@ -212,7 +212,7 @@ export TMPDIR echo statistics_VERSION_getstats statistics_VERSION_getstats() { ( - cd /home/imapsync/imapsync_stats + cd $HOME/imapsync_stats for f in /var/log/apache2/access.log_????????.gz ; do b=`basename "$f" .gz` #echo "$b" @@ -228,7 +228,7 @@ statistics_VERSION_monthly_ip() { month=${1:-`date '+%m'`} year=${2:-`date '+%Y'`} ( - cd /home/imapsync/imapsync_stats + cd $HOME/imapsync_stats cut -d ' ' -f 1,12,13,18,19 access.log_${year}${month}??.imapsync_VERSION |sort -n |uniq -c|sort -n > stats_imapsync_${year}_${month}.ip ) } @@ -238,7 +238,7 @@ statistics_VERSION_monthly_os() { month=${1:-`date '+%m'`} year=${2:-`date '+%Y'`} ( - cd /home/imapsync/imapsync_stats + cd $HOME/imapsync_stats Linux=`grep -i linux stats_imapsync_${year}_${month}.ip | wc -l` Win32=`grep -i MSWin32 stats_imapsync_${year}_${month}.ip | wc -l` Darwin=`grep -i darwin stats_imapsync_${year}_${month}.ip | wc -l` @@ -260,7 +260,7 @@ echo "statistics_VERSION_yearly_os 2012 # short" statistics_VERSION_yearly_os() { year=${1:-`date '+%Y'`} ( - cd /home/imapsync/imapsync_stats + cd $HOME/imapsync_stats Linux=`grep -i linux stats_imapsync_${year}.ip | wc -l` Win32=`grep -i MSWin32 stats_imapsync_${year}.ip | wc -l` Darwin=`grep -i darwin stats_imapsync_${year}.ip | wc -l` @@ -284,7 +284,7 @@ statistics_VERSION_monthly_ip_wc() { month=${1:-`date '+%m'`} year=${2:-`date '+%Y'`} ( - cd /home/imapsync/imapsync_stats + cd $HOME/imapsync_stats test -f stats_imapsync_${year}_${month}.ip || statistics_VERSION_monthly_ip $month ${year} wc -l stats_imapsync_${year}_${month}.ip ) @@ -295,7 +295,7 @@ statistics_VERSION_monthly_runs() { month=${1:-`date '+%m'`} year=${2:-`date '+%Y'`} ( - cd /home/imapsync/imapsync_stats + cd $HOME/imapsync_stats wc -l access.log_${year}${month}??.imapsync_VERSION > stats_imapsync_${year}_${month}.runs cat stats_imapsync_${year}_${month}.runs ) @@ -320,7 +320,7 @@ statistics_VERSION_yearly_ip() { year=${1:-`date '+%Y'`} ( statistics_VERSION_getstats - cd /home/imapsync/imapsync_stats + cd $HOME/imapsync_stats cut -d ' ' -f 1,12,13,18,19 access.log_${year}????.imapsync_VERSION |sort -n |uniq -c|sort -n > stats_imapsync_${year}.ip ) } @@ -328,7 +328,7 @@ statistics_VERSION_yearly_ip() { statistics_VERSION_yearly_runs() { year=${1:-`date '+%Y'`} ( - cd /home/imapsync/imapsync_stats + cd $HOME/imapsync_stats test -f stats_imapsync_${year}.ip && cat stats_imapsync_${year}.ip | awk '{ sum+=$1 } END {print sum}' ) } @@ -339,7 +339,7 @@ echo "statistics_VERSION_synthesis 2012 # short" statistics_VERSION_synthesis() { year=${1:-`date '+%Y'`} ( - cd /home/imapsync/imapsync_stats + cd $HOME/imapsync_stats echo Nb users each month wc -l stats_imapsync_${year}_??.ip echo Nb runs each month diff --git a/W/patches/create_folder_erik.torgesta.com b/W/patches/create_folder_erik.torgesta.com new file mode 100644 index 0000000..9407ed0 --- /dev/null +++ b/W/patches/create_folder_erik.torgesta.com @@ -0,0 +1,38 @@ +create_folder { + my( $imap2, $h2_fold, $h1_fold ) = @_ ; + my(@parts, $parent); + + print "Creating folder [$h2_fold] on host2\n"; + if ( ( 'INBOX' eq uc( $h2_fold) ) + and ( $imap2->exists( $h2_fold ) ) ) { + print "Folder [$h2_fold] already exists\n" ; + return( 1 ) ; + } + + @parts = split($h2_sep, $h2_fold ); + pop( @parts ); + $parent = join($h2_sep, @parts ); + $parent =~ s/^\s+|\s+$//g ; + if(($parent ne "") and !$imap2->exists( $parent )) { + create_folder( $imap2 , $parent , $h1_fold); + } + + if ( ! $dry ){ + if ( ! $imap2->create( $h2_fold ) ) { + print( "Couldn't create folder [$h2_fold] from [$h1_fold]: ", + $imap2->LastError( ), "\n" ); + $nb_errors++; + # success if folder exists ("already exists" error) + return( 1 ) if $imap2->exists( $h2_fold ) ; + # failure since create failed + return( 0 ); + }else{ + #create succeeded + return( 1 ); + } + }else{ + # dry mode, no folder so many imap will fail, assuming failure + return( 0 ); + } +} + diff --git a/W/paypal_reply/paypal_build_invoices b/W/paypal_reply/paypal_build_invoices index b27f1a2..09a4a8e 100755 --- a/W/paypal_reply/paypal_build_invoices +++ b/W/paypal_reply/paypal_build_invoices @@ -1,6 +1,6 @@ #!/bin/sh -# $Id: paypal_build_invoices,v 1.56 2013/09/13 10:55:46 gilles Exp gilles $ +# $Id: paypal_build_invoices,v 1.60 2013/12/14 17:30:04 gilles Exp gilles $ # usage: sh paypal_build_invoices /g/var/paypal_invoices/???? @@ -42,7 +42,9 @@ cp /home/gilles/public_html/AGIL/factures/000/facture_imapsync-000.tex /g/var/pa #/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 2682 /g/paypal/paypal_2013_07_complet.csv #/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 2741 /g/paypal/paypal_2013_08_complet.csv #/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 2820 /g/paypal/paypal_2013_09_complet.csv -/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 2891 /g/paypal/paypal_2013_10_complet.csv +#/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 2891 /g/paypal/paypal_2013_10_complet.csv +#/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 2973 /g/paypal/paypal_2013_11_complet.csv +/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 3040 /g/paypal/paypal_2013_12_complet.csv : /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 147 /g/paypal/paypal_2010_11_complet.csv : /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 214 /g/paypal/paypal_2010_12_complet.csv @@ -73,26 +75,29 @@ cp /home/gilles/public_html/AGIL/factures/000/facture_imapsync-000.tex /g/var/pa : /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2299 /g/paypal/paypal_2013_01_complet.csv : /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2384 /g/paypal/paypal_2013_02_complet.csv : /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2451 /g/paypal/paypal_2013_03_complet.csv -: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2519 /g/paypal/paypal_2013_04_complet.csv -: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2572 /g/paypal/paypal_2013_05_complet.csv -: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2627 /g/paypal/paypal_2013_06_complet.csv -: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2682 /g/paypal/paypal_2013_07_complet.csv +: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2519 /g/paypal/paypal_2013_04_complet.csv +: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2572 /g/paypal/paypal_2013_05_complet.csv +: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2627 /g/paypal/paypal_2013_06_complet.csv +: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2682 /g/paypal/paypal_2013_07_complet.csv : /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2741 /g/paypal/paypal_2013_08_complet.csv - -set -x : /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2820 /g/paypal/paypal_2013_09_complet.csv : /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2891 /g/paypal/paypal_2013_10_complet.csv + +set -x +: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2973 /g/paypal/paypal_2013_11_complet.csv +: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 3040 /g/paypal/paypal_2013_12_complet.csv + set +x # La totale : /g/public_html/imapsync/W/paypal_reply/paypal_bilan --bnc --debug \ - --first_in 147 --avoid_numbers '292 293 643 644 731 732 1093 1330 1331 1332 1333 1334 1652 1653 2131 2132 2295 2296 2297 2298 2625 2626 ' \ + --first_in 147 --avoid_numbers '292 293 643 644 731 732 1093 1330 1331 1332 1333 1334 1652 1653 2131 2132 2295 2296 2297 2298 2625 2626 2970 2971 2972' \ /g/paypal/paypal_201?_??_complet.csv set -v : /g/public_html/imapsync/W/paypal_reply/paypal_bilan \ - --first_in 147 --avoid_numbers '292 293 643 644 731 732 1093 1330 1331 1332 1333 1334 1652 1653 2131 2132 2295 2296 2297 2298 2625 2626 ' \ + --first_in 147 --avoid_numbers '292 293 643 644 731 732 1093 1330 1331 1332 1333 1334 1652 1653 2131 2132 2295 2296 2297 2298 2625 2626 2970 2971 2972' \ /g/paypal/paypal_201?_??_complet.csv set +v @@ -100,12 +105,12 @@ set +v #echo 2012 #set -v : /g/public_html/imapsync/W/paypal_reply/paypal_bilan \ - --first_in 1335 --usdeur 1.2952 --bnc --avoid_numbers '292 293 643 644 731 732 1093 1330 1331 1332 1333 1334 1652 1653 2131 2132 2295 2296 2297 2298' \ + --first_in 1335 --usdeur 1.2952 --bnc --avoid_numbers '1652 1653 2131 2132 2295 2296 2297 2298' \ /g/paypal/paypal_2012_??_complet.csv #set +v -echo 'sh paypal_build_invoices /g/var/paypal_invoices/2???' +echo 'sh paypal_build_invoices /g/var/paypal_invoices/3???' # USD de 147 à 340 # EUR de 341 à ... diff --git a/W/paypal_reply/paypal_send_invoices b/W/paypal_reply/paypal_send_invoices index 2fb5963..3fd5741 100755 --- a/W/paypal_reply/paypal_send_invoices +++ b/W/paypal_reply/paypal_send_invoices @@ -1,6 +1,6 @@ #!/bin/sh -# $Id: paypal_send_invoices,v 1.9 2013/02/08 14:58:22 gilles Exp gilles $ +# $Id: paypal_send_invoices,v 1.10 2013/11/17 06:36:39 gilles Exp gilles $ # usages: # sh paypal_send_invoices /g/var/paypal_invoices/147 @@ -55,5 +55,5 @@ done echo ==== Saving to ks rsync -avHz -P /g/var/paypal_invoices/ \ - imapsync@ks.lamiral.info:var/paypal_invoices + gilles@ks.lamiral.info:var/paypal_invoices diff --git a/W/pkgnames b/W/pkgnames new file mode 100644 index 0000000..b3b3fb6 --- /dev/null +++ b/W/pkgnames @@ -0,0 +1,26 @@ +#!/bin/sh + +# $Id: pkgnames,v 1.2 2013/10/18 03:59:35 gilles Exp gilles $ + +MODULE_LIST=" +Mail/IMAPClient.pm +Digest/MD5.pm +Term/ReadKey.pm +IO/Socket/SSL.pm +Digest/HMAC_MD5.pm +URI/Escape.pm +File/Copy/Recursive.pm +Data/Uniqid.pm +Authen/NTLM.pm +" + +# SEARCH_CMD="urpmf" # Mandriva +SEARCH_CMD=${1:-"apt-file search"} + +for module in $MODULE_LIST; do + echo ==== searching for $module ==== + echo $SEARCH_CMD $module + $SEARCH_CMD $module +done + +# End of pkgnames script. diff --git a/W/test3.bat b/W/test3.bat index e0eb7a8..203e367 100644 --- a/W/test3.bat +++ b/W/test3.bat @@ -5,14 +5,16 @@ cd /D %~dp0 REM E: REM cd .\temp REM cd \ -imapsync.exe --host1 p --user1 tata --passfile1 secret.tata --host2 p --user2 titi --passfile2 secret.titi --usecache --tmpdir "E:\TEMP" --include "blanc" - - -REM perl imapsync --tests_debug -perl imapsync --tests - -PAUSE -perl imapsync --host1 p --user1 tata --passfile1 secret.tata --host2 p --user2 titi --passfile2 secret.titi --usecache --tmpdir "E:\TEMP" +REM imapsync.exe --host1 p --user1 tata --passfile1 secret.tata --host2 p --user2 titi --passfile2 secret.titi --usecache --tmpdir "E:\TEMP" --include "blanc" +REM PAUSE +REM perl imapsync --host1 p --user1 tata --passfile1 secret.tata --host2 p --user2 titi --passfile2 secret.titi --usecache --tmpdir "E:\TEMP" REM perl imapsync --host1 p --user1 tata --passfile1 secret.tata --host2 p --user2 titi --passfile2 secret.titi --usecache -REM rmdir "E:\TEMP\imapsync_cache" /s /q +mkdir "\\?\E:\TEMP\lala" +REM mkdir "\\?\E:\TEMP\01_______\01_______\02_______\03_______\04_______\05_______\06_______\07_______\08_______\09_______\10_______\11_______\12_______\13_______\14_______\15_______\16_______\17_______\18_______\19_______\20_______\21_______\22_______\22_______\24_______\25_______\26_______\27_______\28_______\29_______\30_______\" + + +perl imapsync --tests_debug --tmpdir "\\?\E:\TEMP\long" +perl imapsync --tests --tmpdir "\\?\E:\TEMP\long" + + diff --git a/examples/install_modules_linux.sh b/examples/install_modules_linux.sh new file mode 100644 index 0000000..1cb31aa --- /dev/null +++ b/examples/install_modules_linux.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +# $Id: install_modules_linux.sh,v 1.1 2013/11/02 14:00:19 gilles Exp gilles $ + +perl -MCPAN -e "install Mail::IMAPClient" +perl -MCPAN -e "install Term::ReadKey" +perl -MCPAN -e "install IO::Socket::SSL" +perl -MCPAN -e "install Digest::HMAC_MD5" +perl -MCPAN -e "install URI::Escape" +perl -MCPAN -e "install File::Copy::Recursive" + +perl -MCPAN -e "install Data::Uniqid" +perl -MCPAN -e "install Authen::NTLM" + diff --git a/guestbook/guestbook_2013_11_05_01_19_28 b/guestbook/guestbook_2013_11_05_01_19_28 new file mode 100644 index 0000000..3e12e71 --- /dev/null +++ b/guestbook/guestbook_2013_11_05_01_19_28 @@ -0,0 +1,9 @@ +Bonjour Gilles, + +Just a quick note to say thank you for a great piece of software. It’s good to pay for something that does what it says - nice work! + +All accounts migrated without a hitch. + +Cheers, + +Tim Jones diff --git a/i3 b/i3 index bccf3b6..88c3853 100755 --- a/i3 +++ b/i3 @@ -1,7 +1,7 @@ #!/bin/sh -# $Id: i3,v 1.13 2013/09/28 11:50:16 gilles Exp gilles $ +# $Id: i3,v 1.14 2013/12/25 03:25:18 gilles Exp gilles $ BASE=`dirname $0` -perl -I${BASE}/W/Mail-IMAPClient-3.34/lib ${BASE}/imapsync "$@" +perl -I${BASE}/W/Mail-IMAPClient-3.35/lib ${BASE}/imapsync "$@" diff --git a/imapsync b/imapsync index 4330582..23e17ac 100755 --- a/imapsync +++ b/imapsync @@ -5,11 +5,11 @@ # pragmas # main program # global variables initialisation +# get_options( ) ; # default values # folder loop # subroutines -# IMAPClient 2.2.9 overrides -# IMAPClient 2.2.9 3.xx ads +# IMAPClient 3.xx ads # pod documentation @@ -22,7 +22,7 @@ Synchronises mailboxes between two imap servers. Good at IMAP migration. More than 52 different IMAP server softwares supported with success, few failures. -$Revision: 1.569 $ +$Revision: 1.580 $ =head1 SYNOPSIS @@ -403,7 +403,7 @@ Success stories reported with the following 57 imap servers - Gimap (Gmail imap) - GMX IMAP4 StreamProxy. - Groupwise IMAP (Novell) 6.x and 7.0. Buggy so see the FAQ. - - hMailServer 5.3.3 [host2], 4.4.1 [host1] (see FAQ) + - hMailServer 5.40-B1950 [host12], 5.3.3 [host2], 4.4.1 [host1] (see FAQ) - IceWarp Server 10.4.5 [host1] (http://www.icewarp.com/) - iPlanet Messaging server 4.15, 5.1, 5.2 - IMail 7.15 (Ipswitch/Win2003), 8.12, 11.03 [host1] @@ -541,7 +541,7 @@ Entries for imapsync: Feedback (good or bad) will often be welcome. -$Id: imapsync,v 1.569 2013/10/16 21:58:17 gilles Exp gilles $ +$Id: imapsync,v 1.580 2013/12/25 02:52:36 gilles Exp gilles $ =cut @@ -571,7 +571,7 @@ use Errno qw(EAGAIN EPIPE ECONNRESET) ; use File::Glob qw( :glob ) ; use IO::File ; use Time::Local ; -use Time::HiRes qw( time ) ; +use Time::HiRes qw( time sleep ) ; use Test::More 'no_plan' ; use IPC::Open3 'open3' ; #use Unix::Sysexits ; @@ -581,12 +581,13 @@ use IPC::Open3 'open3' ; my( $rcs, $pidfile, $pidfilelocking, $debug, $debugimap, $debugimap1, $debugimap2, $debugcontent, $debugflags, - $debugLIST, $debugsleep, $debugdev, + $debugLIST, $debugsleep, $debugdev, $debugmemory, $nb_errors, $host1, $host2, $port1, $port2, $user1, $user2, $domain1, $domain2, $password1, $password2, $passfile1, $passfile2, @folder, @include, @exclude, @folderrec, + @folderfirst, @folderlast, $prefix1, $prefix2, @regextrans2, @regexmess, @regexflag, $flagsCase, $filterflags, $syncflagsaftercopy, @@ -665,13 +666,17 @@ my( $maxlinelength, $uidnext_default, $fixcolonbug, + $create_folder_old, + $maxmessagespersecond, + $maxbytespersecond, + $skipcrossduplicates, $debugcrossduplicates, ); # main program # global variables initialisation -$rcs = '$Id: imapsync,v 1.569 2013/10/16 21:58:17 gilles Exp gilles $ '; +$rcs = '$Id: imapsync,v 1.580 2013/12/25 02:52:36 gilles Exp gilles $ '; $total_bytes_transferred = 0; $total_bytes_skipped = 0; @@ -719,19 +724,19 @@ sub EX_USAGE { # @ARGV will be eat by get_options() my @argv_copy = @ARGV; -get_options(); +get_options( ) ; # $SIG{ INT } = \&catch_continue ; local $SIG{ INT } = local $SIG{ QUIT } = local $SIG{ TERM } = \&catch_exit ; $timestart = time( ); $timestart_int = int( $timestart ) ; -$timebefore = $timestart; +$timebefore = $timestart ; my $timestart_str = localtime( $timestart ) ; -print "Transfer started at $timestart_str\n"; - -$modules_version = defined($modules_version) ? $modules_version : 1; +print "Transfer started at $timestart_str\n" ; +print "PID is $PROCESS_ID\n" ; +$modules_version = defined( $modules_version ) ? $modules_version : 1 ; $releasecheck = defined($releasecheck) ? $releasecheck : 1; @@ -784,9 +789,13 @@ $checkmessageexists = 0 if ( not $abletosearch ) ; $showpasswords = defined( $showpasswords ) ? $showpasswords : 0 ; $fixslash2 = defined( $fixslash2 ) ? $fixslash2 : 1 ; $fixInboxINBOX = defined( $fixInboxINBOX ) ? $fixInboxINBOX : 1 ; +$create_folder_old = defined( $create_folder_old ) ? $create_folder_old : 0 ; $delete2duplicates = 1 if ( $delete2 and ( ! defined( $delete2duplicates ) ) ) ; +$maxmessagespersecond = defined( $maxmessagespersecond ) ? $maxmessagespersecond : 0 ; +$maxbytespersecond = defined( $maxbytespersecond ) ? $maxbytespersecond : 0 ; + print banner_imapsync(@argv_copy); print "Temp directory is $tmpdir\n"; @@ -1084,7 +1093,8 @@ if ( scalar( @include ) ) { foreach my $include ( @include ) { my @included_folders = grep { /$include/x } @h1_folders_all ; add_to_requested_folders( @included_folders ) ; - print "Including folders matching pattern '$include': @included_folders\n" ; + my $included_folders = join( " ", map( "[$_]", @included_folders ) ) ; + print "Including folders matching pattern '$include': " . $included_folders . "\n" ; } } @@ -1093,7 +1103,8 @@ if ( scalar( @exclude ) ) { my @requested_folder = sort( keys( %requested_folder ) ) ; my @excluded_folders = grep { /$exclude/x } @requested_folder ; remove_from_requested_folders( @excluded_folders ) ; - print "Excluding folders matching pattern '$exclude': @excluded_folders\n" ; + my $excluded_folders = join( " ", map( "[$_]", @excluded_folders ) ) ; + print "Excluding folders matching pattern '$exclude': " . $excluded_folders . "\n" ; } } @@ -1108,9 +1119,7 @@ $checkselectable and do { } } ; -my @requested_folder = sort(keys(%requested_folder)); - -@h1_folders_wanted = @requested_folder; +@h1_folders_wanted = sort_requested_folders( ) ; #my $h1_namespace = $imap1->namespace() ; #my $h2_namespace = $imap2->namespace() ; @@ -1194,6 +1203,8 @@ my $begin_transfer_time = time ; my %uid_candidate_for_deletion ; my %uid_candidate_no_deletion ; +my %h2_folders_of_md5 = ( ) ; + FOLDER: foreach my $h1_fold ( @h1_folders_wanted ) { last FOLDER if $imap1->IsUnconnected(); @@ -1284,8 +1295,8 @@ FOLDER: foreach my $h1_fold ( @h1_folders_wanted ) { map ( { "$_->$cache_1_2_ref->{$_} " } keys %$cache_1_2_ref ), " ]\n"; } - my %h1_hash = (); - my %h2_hash = (); + my %h1_hash = () ; + my %h2_hash = () ; my ( %h1_msgs, %h2_msgs ) ; @h1_msgs{ @h1_msgs } = (); @@ -1405,6 +1416,13 @@ FOLDER: foreach my $h1_fold ( @h1_folders_wanted ) { push(@h2_msgs_duplicate, $m); } } + + # %h2_folders_of_md5 + foreach my $md5 ( keys( %h2_hash ) ) { + $h2_folders_of_md5{ $md5 }->{ $h2_fold } ++ ; + } + + my $h2_msgs_duplicate_nb = scalar( @h2_msgs_duplicate ) ; $h2{ $h2_fold }{ 'duplicates_nb' } = $h2_msgs_duplicate_nb ; @@ -1547,16 +1565,20 @@ FOLDER: foreach my $h1_fold ( @h1_folders_wanted ) { $debug and print "Host2 uidnext: $h2_uidnext\n" ; $h2_uidguess = $h2_uidnext ; MESS: foreach my $m_id (@h1_hash_keys_sorted_by_uid) { - last FOLDER if $imap1->IsUnconnected(); - last FOLDER if $imap2->IsUnconnected(); + last FOLDER if $imap1->IsUnconnected() ; + last FOLDER if $imap2->IsUnconnected() ; + #print "h1_nb_msg_processed: $h1_nb_msg_processed\n" ; my $h1_size = $h1_hash{$m_id}{'s'}; my $h1_msg = $h1_hash{$m_id}{'m'}; my $h1_idate = $h1_hash{$m_id}{'D'}; - unless (exists($h2_hash{$m_id})) { + if ( ( not exists( $h2_hash{ $m_id } ) ) + and ( not exists( $h2_folders_of_md5{ $m_id } ) + or not $skipcrossduplicates ) ) { # copy my $h2_msg = copy_message( $h1_msg, $h1_fold, $h2_fold, $h1_fir_ref, $permanentflags2, $cache_dir ) ; + $h2_folders_of_md5{ $m_id }->{ $h2_fold } ++ ; if( $delete2 and exists( $h2_folders_from_1_several{ $h2_fold } ) and $h2_msg ) { print "msg $h2_fold/$h2_msg will cancel deletion [fresh copy] on host2\n" ; $uid_candidate_no_deletion{ $h2_fold }{ $h2_msg }++ ; @@ -1566,28 +1588,35 @@ FOLDER: foreach my $h1_fold ( @h1_folders_wanted ) { } else{ # already on host2 - my $h2_msg = $h2_hash{$m_id}{'m'} ; - $debug and print "Host1 found msg $h1_fold/$h1_msg equals Host2 $h2_fold/$h2_msg\n" ; + if ( exists( $h2_hash{ $m_id } ) ) { + my $h2_msg = $h2_hash{$m_id}{'m'} ; + $debug and print "Host1 found msg $h1_fold/$h1_msg equals Host2 $h2_fold/$h2_msg\n" ; + if ( $usecache ) { + $debugcache and print "touch $cache_dir/${h1_msg}_$h2_msg\n" ; + touch( "$cache_dir/${h1_msg}_$h2_msg" ) + or croak( "Couldn't touch $cache_dir/${h1_msg}_$h2_msg" ) ; + } + }elsif( exists( $h2_folders_of_md5{ $m_id } ) ) { + my @folders_dup = keys( %{ $h2_folders_of_md5{ $m_id } } ) ; + ( $debug or $debugcrossduplicates ) and print "Host1 found msg $h1_fold/$h1_msg is also in Host2 folders @folders_dup\n" ; + } $total_bytes_skipped += $h1_size ; $nb_msg_skipped += 1 ; $h1_nb_msg_processed +=1 ; - - if ( $usecache ) { - $debugcache and print "touch $cache_dir/${h1_msg}_$h2_msg\n" ; - touch( "$cache_dir/${h1_msg}_$h2_msg" ) - or croak( "Couldn't touch $cache_dir/${h1_msg}_$h2_msg" ) ; - } - } + } - #$debug and print "MESSAGE $m_id\n"; - my $h2_msg = $h2_hash{$m_id}{'m'}; + if ( exists( $h2_hash{ $m_id } ) ) { + #$debug and print "MESSAGE $m_id\n"; + my $h2_msg = $h2_hash{$m_id}{'m'}; - sync_flags_fir( $h1_fold, $h1_msg, $h2_fold, $h2_msg, $permanentflags2, $h1_fir_ref, $h2_fir_ref ) ; + sync_flags_fir( $h1_fold, $h1_msg, $h2_fold, $h2_msg, $permanentflags2, $h1_fir_ref, $h2_fir_ref ) ; + # Good + my $h2_size = $h2_hash{$m_id}{'s'}; + $debug and print + "Host1 size msg $h1_fold/$h1_msg = $h1_size <> $h2_size = Host2 $h2_fold/$h2_msg\n"; + } last FOLDER if $imap2->IsUnconnected() ; - # Good - my $h2_size = $h2_hash{$m_id}{'s'}; - $debug and print - "Host1 size msg $h1_fold/$h1_msg = $h1_size <> $h2_size = Host2 $h2_fold/$h2_msg\n"; + if( $delete ) { my $expunge_message = '' ; $expunge_message = "and expunged" if ( $expungeaftereach and ( $expunge or $expunge1 ) ) ; @@ -1598,7 +1627,6 @@ FOLDER: foreach my $h1_fold ( @h1_folders_wanted ) { $imap1->expunge() if ( $expungeaftereach and ( $expunge or $expunge1 ) ) ; } } - } # END MESS: loop last FOLDER if $imap1->IsUnconnected(); @@ -1659,6 +1687,9 @@ $debug and print "Time: ", timenext(), " s\n"; if ( $foldersizesatend ) { timenext() ; + # Get all folders on host2 again since new were created + @h2_folders_all = sort $imap2->folders(); + for ( @h2_folders_all ) { $h2_folders_all{ $_ } = 1 } ; ( $h1_nb_msg_end, $h1_bytes_end ) = foldersizes( "Host1", $imap1, $search1, @h1_folders_wanted ) ; ( $h2_nb_msg_end, $h2_bytes_end ) = foldersizes( "Host2", $imap2, $search2, @h2_folders_from_1_wanted ) ; } @@ -1691,6 +1722,9 @@ sub size_filtered_flag { sub sync_flags_fir { my ( $h1_fold, $h1_msg, $h2_fold, $h2_msg, $permanentflags2, $h1_fir_ref, $h2_fir_ref ) = @_ ; + if ( not defined( $h1_msg ) ) { return( ) } ; + if ( not defined( $h2_msg ) ) { return( ) } ; + my $h1_size = $h1_fir_ref->{$h1_msg}->{"RFC822.SIZE"} ; return( ) if size_filtered_flag( $h1_size ) ; @@ -2273,8 +2307,8 @@ sub banner_imapsync { my @argv = @_ ; my $banner_imapsync = join("", '$RCSfile: imapsync,v $ ', - '$Revision: 1.569 $ ', - '$Date: 2013/10/16 21:58:17 $ ', + '$Revision: 1.580 $ ', + '$Date: 2013/12/25 02:52:36 $ ', "\n",localhost_info(), "\n", "Command line used:\n", "$0 ", command_line_nopassword( @argv ), "\n", @@ -2408,10 +2442,10 @@ sub examine_folder { } -sub create_folder { +sub create_folder_old { my( $imap, $h2_fold, $h1_fold ) = @_ ; - print "Creating folder [$h2_fold] on host2\n"; + print "Creating (old way) folder [$h2_fold] on host2\n"; if ( ( 'INBOX' eq uc( $h2_fold) ) and ( $imap->exists( $h2_fold ) ) ) { print "Folder [$h2_fold] already exists\n" ; @@ -2419,7 +2453,7 @@ sub create_folder { } if ( ! $dry ){ if ( ! $imap->create( $h2_fold ) ) { - print( "Couldn't create folder [$h2_fold] from [$h1_fold]: ", + print( "Could not create folder [$h2_fold] from [$h1_fold]: ", $imap->LastError( ), "\n" ); $nb_errors++; # success if folder exists ("already exists" error) @@ -2428,15 +2462,61 @@ sub create_folder { return( 0 ); }else{ #create succeeded + print "Created (old way) folder [$h2_fold] on host2\n"; return( 1 ); } }else{ # dry mode, no folder so many imap will fail, assuming failure + print "Created (old way) folder [$h2_fold] on host2 $dry_message\n"; return( 0 ); } } +sub create_folder { + my( $imap2, $h2_fold, $h1_fold ) = @_ ; + my(@parts, $parent); + + if ( $create_folder_old ) { + return( create_folder_old( $imap2, $h2_fold, $h1_fold ) ) ; + } + print "Creating folder [$h2_fold] on host2\n"; + if ( ( 'INBOX' eq uc( $h2_fold) ) + and ( $imap2->exists( $h2_fold ) ) ) { + print "Folder [$h2_fold] already exists\n" ; + return( 1 ) ; + } + + @parts = split($h2_sep, $h2_fold ); + pop( @parts ); + $parent = join($h2_sep, @parts ); + $parent =~ s/^\s+|\s+$//g ; + if(($parent ne "") and ! $imap2->exists( $parent )) { + create_folder( $imap2 , $parent , $h1_fold); + } + + if ( ! $dry ){ + if ( ! $imap2->create( $h2_fold ) ) { + print( "Could not create folder [$h2_fold] from [$h1_fold]: ", + $imap2->LastError( ), "\n" ); + $nb_errors++; + # success if folder exists ("already exists" error) + return( 1 ) if $imap2->exists( $h2_fold ) ; + # failure since create failed + return( 0 ); + }else{ + #create succeeded + print "Created folder [$h2_fold] on host2\n"; + return( 1 ); + } + }else{ + # dry mode, no folder so many imap will fail, assuming failure + print "Created folder [$h2_fold] on host2 $dry_message\n"; + return( 0 ); + } +} + + sub tests_folder_routines { ok( !is_requested_folder('folder_foo'), 'is_requested_folder folder_foo 1' ); @@ -2449,12 +2529,46 @@ sub tests_folder_routines { ok( @f = add_to_requested_folders('folder_bar', 'folder_toto'), "add result: @f" ); ok( is_requested_folder('folder_bar'), 'is_requested_folder 4' ); ok( is_requested_folder('folder_toto'), 'is_requested_folder 5' ); - ok( remove_from_requested_folders('folder_toto'), 'remove_from_requested_folders' ); + ok( remove_from_requested_folders('folder_toto'), 'remove_from_requested_folders: ' ); ok( !is_requested_folder('folder_toto'), 'is_requested_folder 6' ); + ok( !remove_from_requested_folders('folder_bar'), "remove_from_requested_folders: empty" ) ; + + ok( 0 == compare_lists( [ sort_requested_folders( ) ], [] ), 'sort_requested_folders: all empty' ) ; + ok( add_to_requested_folders('M_55'), 'add_to_requested_folders M_55' ); + ok( 0 == compare_lists( [ sort_requested_folders( ) ], [ 'M_55' ] ), 'sort_requested_folders: middle' ) ; + @folderfirst = ( 'Z_11' ) ; + ok( 0 == compare_lists( [ sort_requested_folders( ) ], [ 'Z_11', 'M_55' ] ), 'sort_requested_folders: first+middle' ) ; + @folderlast = ( 'A_99' ) ; + ok( 0 == compare_lists( [ sort_requested_folders( ) ], [ 'Z_11', 'M_55', 'A_99' ] ), 'sort_requested_folders: first+middle+last 1' ) ; + + ok( add_to_requested_folders('M_55', 'M_44',), 'add_to_requested_folders M_55 M_44' ); + ok( 0 == compare_lists( [ sort_requested_folders( ) ], [ 'Z_11', 'M_44', 'M_55', 'A_99' ] ), 'sort_requested_folders: first+middle+last 2' ) ; + @folderfirst = ( 'Z_22', 'Z_11' ) ; + @folderlast = ( 'A_99', 'A_88' ) ; + ok( 0 == compare_lists( [ sort_requested_folders( ) ], [ 'Z_22', 'Z_11', 'M_44', 'M_55', 'A_99', 'A_88' ] ), 'sort_requested_folders: first+middle+last 3' ) ; + return( ) ; } +sub sort_requested_folders { + my @requested_folders_sorted = () ; + + foreach my $folder ( @folderfirst ) { + remove_from_requested_folders( $folder ) ; + } + + foreach my $folder ( @folderlast ) { + remove_from_requested_folders( $folder ) ; + } + + my @middle = sort( keys( %requested_folder ) ) ; + + @requested_folders_sorted = ( @folderfirst, @middle, @folderlast ) ; + + return( @requested_folders_sorted ) ; +} + sub is_requested_folder { my ( $folder ) = @_; @@ -2474,8 +2588,8 @@ sub add_to_requested_folders { sub remove_from_requested_folders { my @wanted_folders = @_ ; - foreach my $folder (@wanted_folders) { - delete $requested_folder{$folder} ; + foreach my $folder ( @wanted_folders ) { + delete $requested_folder{ $folder } ; } return( keys( %requested_folder ) ) ; } @@ -3376,6 +3490,11 @@ sub copy_message { my ( $string, $string_len ) ; ( $string, $string_len ) = message_for_host2( $h1_msg, $h1_fold, $h1_size, $h1_flags, $h1_idate, $h1_fir_ref ) ; + if ( not defined( $string ) and not defined( $string_len ) ) { + print "- msg $h1_fold/$h1_msg skipped. Could not be fetched\n" ; + return( ) ; + } + # Lines two long => do no copy if ( ( defined ( $maxlinelength ) ) and ( max_line_length( $string ) > $maxlinelength ) ) { @@ -3404,6 +3523,9 @@ sub copy_message { sync_flags_after_copy( $h1_fold, $h1_msg, $h1_flags, $h2_fold, $new_id, $permanentflags2 ) ; } + if ( $debugmemory ) { + printf ("Memory consumption: %.1f MiB\n", memory_consumption( ) / 1024 / 1024) ; + } return( $new_id ) ; } @@ -3600,7 +3722,7 @@ sub append_message_on_host2 { printf( "msg %s/%-19s copied to %s/%-10s %.2f msgs/s %s/s %s\n", $h1_fold, "$h1_msg {$string_len}", $h2_fold, $new_id, $nb_msg_transferred/$time_spent, $rate, $eta ); - + sleep_if_needed( $time_spent, $total_bytes_transferred, $nb_msg_transferred ) ; if ( $usecache and $cacheaftercopy and $new_id =~ m{^\d+$}x ) { $debugcache and print "touch $cache_dir/${h1_msg}_$new_id\n" ; touch( "$cache_dir/${h1_msg}_$new_id" ) @@ -3621,6 +3743,59 @@ sub append_message_on_host2 { return( ) ; } +sub sleep_if_needed { + my( $time_spent, $total_bytes_transferred, $nb_msg_transferred ) = @_ ; + my $sleep_max_messages = sleep_max_messages( $nb_msg_transferred, $time_spent, $maxmessagespersecond ) ; + my $sleep_max_bytes = sleep_max_bytes( $total_bytes_transferred, $time_spent, $maxbytespersecond ) ; + my $sleep_max = max( $sleep_max_messages, $sleep_max_bytes ) ; + if ( $sleep_max > 0 ) { + printf( "sleeping %.2f s\n", $sleep_max ) ; + sleep( $sleep_max ) ; + } +} + +sub sleep_max_messages { + # how long we have to sleep to go under max_messages_per_second + my( $nb_msg_transferred, $time_spent, $maxmessagespersecond ) = @_ ; + if ( ( not defined( $maxmessagespersecond ) ) or $maxmessagespersecond <= 0 ) { return( 0 ) } ; + my $sleep = ( $nb_msg_transferred / $maxmessagespersecond ) - $time_spent ; + # the sleep must be positive + return( max( 0, $sleep ) ) ; +} + + +sub tests_sleep_max_messages { + ok( 0 == sleep_max_messages( 4, 2, undef ), 'sleep_max_messages: maxmessagespersecond = undef') ; + ok( 0 == sleep_max_messages( 4, 2, 0 ), 'sleep_max_messages: maxmessagespersecond = 0') ; + ok( 0 == sleep_max_messages( 4, 2, -1 ), 'sleep_max_messages: maxmessagespersecond = -1') ; + ok( 0 == sleep_max_messages( 4, 2, 2 ), 'sleep_max_messages: maxmessagespersecond = 2 max reached') ; + ok( 2 == sleep_max_messages( 8, 2, 2 ), 'sleep_max_messages: maxmessagespersecond = 2 max over') ; + ok( 0 == sleep_max_messages( 2, 2, 2 ), 'sleep_max_messages: maxmessagespersecond = 2 max not reached') ; + return( ) ; +} + + +sub sleep_max_bytes { + # how long we have to sleep to go under max_bytes_per_second + my( $total_bytes_transferred, $time_spent, $maxbytespersecond ) = @_ ; + if ( ( not defined( $maxbytespersecond ) ) or $maxbytespersecond <= 0 ) { return( 0 ) } ; + my $sleep = ( $total_bytes_transferred / $maxbytespersecond ) - $time_spent ; + # the sleep must be positive + return( max( 0, $sleep ) ) ; +} + + +sub tests_sleep_max_bytes { + ok( 0 == sleep_max_bytes( 4000, 2, undef ), 'sleep_max_bytes: maxbytespersecond = undef') ; + ok( 0 == sleep_max_bytes( 4000, 2, 0 ), 'sleep_max_bytes: maxbytespersecond = 0') ; + ok( 0 == sleep_max_bytes( 4000, 2, -1 ), 'sleep_max_bytes: maxbytespersecond = -1') ; + ok( 0 == sleep_max_bytes( 4000, 2, 2000 ), 'sleep_max_bytes: maxbytespersecond = 2 max reached') ; + ok( 2 == sleep_max_bytes( 8000, 2, 2000 ), 'sleep_max_bytes: maxbytespersecond = 2 max over') ; + ok( 0 == sleep_max_bytes( 2000, 2, 2000 ), 'sleep_max_bytes: maxbytespersecond = 2 max not reached') ; + return( ) ; +} + + # 6 GlobVar: $dry_message $dry $imap1 $h1_nb_msg_deleted $expunge $expunge1 @@ -4063,10 +4238,28 @@ sub tests_clean_cache_2 { sub tests_mkpath { - my $long_path = "123456789/" x 30 ; - ok( (-d "W/tmp/tests/long/$long_path" or mkpath( "W/tmp/tests/long/$long_path" )), 'tests_mkpath: mkpath > 300 char' ) ; - ok( (-d "W/tmp/tests/long/$long_path" and rmtree( "W/tmp/tests/long/" )), 'tests_mkpath: rmtree > 300 char' ) ; + my $long_path_unix = "123456789/" x 30 ; + + + # \\?\C:\TEMP + my $long_path_2_prefix = $tmpdir || '\\\?\\E:\\TEMP\\' ; + print "long_path_2_prefix: $long_path_2_prefix\n" ; + + my $long_path_2 = $long_path_2_prefix . "\\" . "123456789\\" x 30 . 'END'; + + ( 'MSWin32' ne $OSNAME ) and ok( (-d "W/tmp/tests/long/$long_path_unix" or mkpath( "W/tmp/tests/long/$long_path_unix" )), 'tests_mkpath: mkpath > 300 char' ) ; + ( 'MSWin32' ne $OSNAME ) and ok( (-d "W/tmp/tests/long/$long_path_unix" and rmtree( "W/tmp/tests/long/" )), 'tests_mkpath: rmtree > 300 char' ) ; ok( 1 == 1, 'tests_mkpath: 1 == 1' ) ; + + ( 'MSWin32' eq $OSNAME ) and print "$long_path_2\n" ; + ( 'MSWin32' eq $OSNAME ) and ok( ( -d $long_path_2_prefix ), 'tests_mkpath: -d \ small path' ) ; + ( 'MSWin32' eq $OSNAME ) and ok( ( -d $long_path_2_prefix and rmtree( $long_path_2_prefix ) ), 'tests_mkpath: rmtree \ > 300 char' ) ; + + ( 'MSWin32' eq $OSNAME ) and ok( ( -d $long_path_2_prefix or mkpath( "\\\\\?\\E:\\\\TEMP" ) ), 'tests_mkpath: -d \ small path 1' ) ; + ( 'MSWin32' eq $OSNAME ) and ok( ( -d $long_path_2 ), 'tests_mkpath: -d \ > 300 char' ) ; + ( 'MSWin32' eq $OSNAME ) and ok( ( -d $long_path_2_prefix or mkpath( $long_path_2_prefix ) ), 'tests_mkpath: -d \ small path' ) ; + ( 'MSWin32' eq $OSNAME ) and ok( ( -d $long_path_2 or mkpath( $long_path_2 ) ), 'tests_mkpath: mkpath \ > 300 char' ) ; + ( 'MSWin32' eq $OSNAME ) and ok( ( -d $long_path_2_prefix and rmtree( $long_path_2_prefix ) ), 'tests_mkpath: rmtree \ > 300 char' ) ; return( ) ; } @@ -4752,7 +4945,7 @@ sub check_last_release { } sub imapsync_version { - my $rcs_imapsync = '$Id: imapsync,v 1.569 2013/10/16 21:58:17 gilles Exp gilles $ ' ; + my $rcs_imapsync = '$Id: imapsync,v 1.580 2013/12/25 02:52:36 gilles Exp gilles $ ' ; my $imapsync_version ; if ( $rcs_imapsync =~ m{,v\s+(\d+\.\d+)}xo ) { @@ -5548,6 +5741,12 @@ Several options are mandatory. --folder : and this one, etc. --folderrec : Sync this folder recursively. --folderrec : and this one, etc. + +--folderfirst : Sync this folder first. --folderfirst "Work" +--folderfirst : then this one, etc. +--folderlast : Sync this folder last. --folderlast "[Gmail]/All Mail" +--folderlast : then this one, etc. + --include : Sync folders matching this regular expression Blancs like in "foo bar" have to be written "foo\\ bar" --include : or this one, etc. @@ -5605,9 +5804,9 @@ Several options are mandatory. For safety, first try it like this (it is safe): --delete2folders --dry --justfolders --nofoldersizes --delete2foldersonly : Deleted only folders matching regex. - Example: --delete2foldersonly "/Junk$/" + Example: --delete2foldersonly "/^Junk\$|^INBOX.Junk\$/" --delete2foldersbutnot : Do not delete folders matching regex. - Example: --delete2foldersbutnot "/Tasks$|Contacts$|Foo$/" + Example: --delete2foldersbutnot "/Tasks\$|Contacts\$|Foo\$/" --noexpunge : Do not expunge messages on host1. Expunge really deletes messages marked deleted. Expunge is made at the beginning, on host1 only. @@ -5757,7 +5956,8 @@ sub get_options { "debugimap!" => \$debugimap, "debugimap1!" => \$debugimap1, "debugimap2!" => \$debugimap2, - "debugdev!" => \$debugdev, + "debugdev!" => \$debugdev, + "debugmemory!" => \$debugmemory, "host1=s" => \$host1, "host2=s" => \$host2, "port1=i" => \$port1, @@ -5779,6 +5979,8 @@ sub get_options { "folderrec=s" => \@folderrec, "include=s" => \@include, "exclude=s" => \@exclude, + "folderfirst=s" => \@folderfirst, + "folderlast=s" => \@folderlast, "prefix1=s" => \$prefix1, "prefix2=s" => \$prefix2, "fixslash2!" => \$fixslash2, @@ -5874,6 +6076,11 @@ sub get_options { "showpasswords!" => \$showpasswords, "maxlinelength=i" => \$maxlinelength, "fixcolonbug!" => \$fixcolonbug, + "create_folder_old!" => \$create_folder_old, + "maxmessagespersecond=f" => \$maxmessagespersecond, + "maxbytespersecond=i" => \$maxbytespersecond, + "skipcrossduplicates!" => \$skipcrossduplicates, + "debugcrossduplicates!" => \$debugcrossduplicates, ); $debug and print "get options: [$opt_ret]\n"; @@ -5908,9 +6115,9 @@ sub tests_debug { SKIP: { skip "No test in normal run" if ( not $tests_debug ); - tests_filter_forbidden_characters( ) ; - tests_cache_folder( ) ; - tests_tmpdir_has_colon_bug( ) ; + #tests_mkpath( ) ; + tests_sleep_max_messages( ) ; + tests_sleep_max_bytes( ) ; } return( ) ; } @@ -5919,7 +6126,7 @@ sub tests { SKIP: { skip "No test in normal run" if (not $tests); - tests_folder_routines(); + tests_folder_routines( ) ; tests_compare_lists(); tests_regexmess(); tests_flags_regex(); @@ -5963,6 +6170,8 @@ sub tests { tests_subject( ) ; tests_msgs_from_maxmin( ) ; tests_tmpdir_has_colon_bug( ) ; + tests_sleep_max_messages( ) ; + tests_sleep_max_bytes( ) ; } return( ) ; } diff --git a/index.shtml b/index.shtml index ebd146d..5f64f6e 100644 --- a/index.shtml +++ b/index.shtml @@ -5,7 +5,7 @@ Official imapsync migration tool ( release <!--#exec cmd="cat ./VERSION"--> ) - + @@ -29,10 +29,10 @@
@@ -81,13 +81,23 @@ for bidirectionnal (2 ways) synchronizations.

Alternatives to imapsync are listed in the Similar softwares section.

+

Imapsync used to be free, open and gratis, before november 2010. +Now imapsync is free, open and not gratis from the homepage. +It is the best decision I've done about imapsync to continue to maintain it. +See detailed explanation and motivation here when +I looked for a business model. + +"Download and donate if happy" doesn't work well. +"Pay for download and I pay back if unhappy" works well. +

+

Facts and figures for 2011-2013

  • 4000 to 5000 users per month (45000 users a year)
  • 6 to 25 millions mailboxes transfers per month, -total is 93 millions for 2011, 91 millions for 2012, should be 110 millions for end 2013
  • +total is 93 millions for 2011, 91 millions for 2012, should be 140 millions for end 2013
  • Operating systems run by imapsync users:
      @@ -135,7 +145,7 @@ Via the User-agent parameter it also send:

      +
        +
      • 1.580
      • +
      • Enhancement: Added --maxmessagespersecond to limit messages tranfer rate and fix office365 throttle limitation (use --maxmessagespersecond 4).
      • +
      • Enhancement: Added --maxbytespersecond to limit byte transfer rate.
      • +
      • Enhancement: Added --folderfirst string: Sync this folder first. --folderfirst "Work" --folderfirst "Friends"
      • +
      • Enhancement: Added --folderlast string: Sync this folder last. --folderlast "[Gmail]/All Mail" etc.
      • +
      • Enhancement: Added --skipcrossduplicates to avoid copying messages that are already copied in another folder, good from Gmail to X.
      • +
      • Enhancement: Added --debugcrossduplicates to print which messages (UIDs) are skipped with --skipcrossduplicates (and in what other folders they are).
      • +
      • Enhancement: Added --debugmemory option that prints memory consumption after each message is copied.
      • +
      • Bug fix: Create nested folders in the sense of their path, parent first. Thanks to Erik Torsner.
      • +
      • Bug fix: Final statistics were avoided for newly created folders.
      • +
      • Bug fix: Do not try to append message if the fetch failed.
      • +
      +
      • 1.569 Win32 --tmpdir "C:" bugfix
      • Bug fix: On Win32 trailing blanc in cache dir name raized an error. Blanc is now moved to underscore _
      • @@ -544,7 +568,7 @@ lists what may be coded or done in the future.

        Search in the imapsync list archives: - + (change the keywords with your own request and press Enter)

        @@ -623,7 +647,7 @@ I like it.
      • Godaddy IMAP (since Godaddy runs Courier) (http://www.godaddy.com/)
      • Groupwise IMAP (Novell) 6.x and 7.0. Buggy so see the FAQ. (http://www.novell.com/products/groupwise/)
      • -
      • hMailServer 5.3.3 [host2], 4.4.1 [host1], HMAILSERVER 5.3.2-B1769 on windows 2003 [hsot2] +
      • hMailServer 5.40-B1950 [host12], 5.3.3 [host2], 4.4.1 [host1], HMAILSERVER 5.3.2-B1769 on windows 2003 [hsot2] (http://www.hmailserver.com/)
      • IceWarp Server 10.4.5 [host1] (http://www.icewarp.com/)
      • iPlanet Messaging server 4.15, 5.1, 5.2 @@ -742,7 +766,7 @@ alt="Viewable With Any Browser" /> This document last modified on -($Id: index.shtml,v 1.186 2013/10/17 01:49:59 gilles Exp gilles $) +($Id: index.shtml,v 1.189 2013/12/25 11:35:38 gilles Exp gilles $)

        diff --git a/perlcritic_2.out b/perlcritic_2.out index d756517..d316f5d 100644 --- a/perlcritic_2.out +++ b/perlcritic_2.out @@ -5,575 +5,595 @@ Missing "DEPENDENCIES" section in POD at line 1, column 1. See pages 133,138 of Missing "INCOMPATIBILITIES" section in POD at line 1, column 1. See pages 133,138 of PBP. (Severity: 2) Missing "BUGS AND LIMITATIONS" section in POD at line 1, column 1. See pages 133,138 of PBP. (Severity: 2) Missing "LICENSE AND COPYRIGHT" section in POD at line 1, column 1. See pages 133,138 of PBP. (Severity: 2) -Main code has high complexity score (338) at line 1, column 1. Consider refactoring. (Severity: 3) +Main code has high complexity score (350) at line 1, column 1. Consider refactoring. (Severity: 3) Magic punctuation variable used at line 553, column 3. See page 79 of PBP. (Severity: 2) -64 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 715, column 10. Unnamed numeric literals make code less maintainable. (Severity: 2) -Quotes used with an empty string at line 738, column 61. See page 53 of PBP. (Severity: 2) -5 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 766, column 48. Unnamed numeric literals make code less maintainable. (Severity: 2) -5 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 767, column 48. Unnamed numeric literals make code less maintainable. (Severity: 2) -Postfix control "if" used at line 776, column 15. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 777, column 21. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 783, column 25. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 788, column 24. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 795, column 27. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 806, column 17. See pages 93,94 of PBP. (Severity: 2) -100 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 809, column 13. Unnamed numeric literals make code less maintainable. (Severity: 2) -100 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 810, column 13. Unnamed numeric literals make code less maintainable. (Severity: 2) -993 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 813, column 24. Unnamed numeric literals make code less maintainable. (Severity: 2) -143 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 813, column 30. Unnamed numeric literals make code less maintainable. (Severity: 2) -993 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 816, column 24. Unnamed numeric literals make code less maintainable. (Severity: 2) -143 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 816, column 30. Unnamed numeric literals make code less maintainable. (Severity: 2) -Postfix control "if" used at line 818, column 31. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 819, column 12. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 833, column 5. See pages 93,94 of PBP. (Severity: 2) -3 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 858, column 21. Unnamed numeric literals make code less maintainable. (Severity: 2) -Long number not separated with underscores at line 945, column 20. See page 59 of PBP. (Severity: 2) -Postfix control "unless" used at line 947, column 57. See pages 96,97 of PBP. (Severity: 2) -Quotes used with an empty string at line 974, column 19. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 975, column 50. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 977, column 22. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 978, column 22. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 982, column 26. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 989, column 49. See page 53 of PBP. (Severity: 2) -Postfix control "unless" used at line 1014, column 43. See pages 96,97 of PBP. (Severity: 2) -Postfix control "unless" used at line 1016, column 43. See pages 96,97 of PBP. (Severity: 2) -Quotes used with an empty string at line 1019, column 34. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 1020, column 34. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 1023, column 15. See pages 93,94 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 1085, column 33. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 1085, column 33. See page 237 of PBP. (Severity: 2) +64 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 720, column 10. Unnamed numeric literals make code less maintainable. (Severity: 2) +Quotes used with an empty string at line 743, column 61. See page 53 of PBP. (Severity: 2) +5 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 771, column 48. Unnamed numeric literals make code less maintainable. (Severity: 2) +5 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 772, column 48. Unnamed numeric literals make code less maintainable. (Severity: 2) +Postfix control "if" used at line 781, column 15. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 782, column 21. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 788, column 25. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 794, column 24. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 804, column 27. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 815, column 17. See pages 93,94 of PBP. (Severity: 2) +100 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 818, column 13. Unnamed numeric literals make code less maintainable. (Severity: 2) +100 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 819, column 13. Unnamed numeric literals make code less maintainable. (Severity: 2) +993 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 822, column 24. Unnamed numeric literals make code less maintainable. (Severity: 2) +143 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 822, column 30. Unnamed numeric literals make code less maintainable. (Severity: 2) +993 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 825, column 24. Unnamed numeric literals make code less maintainable. (Severity: 2) +143 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 825, column 30. Unnamed numeric literals make code less maintainable. (Severity: 2) +Postfix control "if" used at line 827, column 31. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 828, column 12. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 842, column 5. See pages 93,94 of PBP. (Severity: 2) +3 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 867, column 21. Unnamed numeric literals make code less maintainable. (Severity: 2) +Long number not separated with underscores at line 954, column 20. See page 59 of PBP. (Severity: 2) +Postfix control "unless" used at line 956, column 57. See pages 96,97 of PBP. (Severity: 2) +Quotes used with an empty string at line 983, column 19. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 984, column 50. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 986, column 22. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 987, column 22. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 991, column 26. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 998, column 49. See page 53 of PBP. (Severity: 2) +Postfix control "unless" used at line 1023, column 43. See pages 96,97 of PBP. (Severity: 2) +Postfix control "unless" used at line 1025, column 43. See pages 96,97 of PBP. (Severity: 2) +Quotes used with an empty string at line 1028, column 34. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1029, column 34. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 1032, column 15. See pages 93,94 of PBP. (Severity: 2) Regular expression without "/s" flag at line 1094, column 33. See pages 240,241 of PBP. (Severity: 2) Regular expression without "/m" flag at line 1094, column 33. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 1168, column 15. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1178, column 3. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1186, column 32. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1231, column 3. See page 97 of PBP. (Severity: 2) -"unless" block used at line 1239, column 3. See page 97 of PBP. (Severity: 2) -Quotes used with an empty string at line 1271, column 50. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 1272, column 50. See page 53 of PBP. (Severity: 2) -Double-sigil dereference at line 1282, column 39. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 1284, column 50. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 1294, column 49. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 1295, column 30. See page 228 of PBP. (Severity: 2) -Postfix control "if" used at line 1313, column 57. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1323, column 77. See pages 93,94 of PBP. (Severity: 2) -Double-sigil dereference at line 1326, column 2. See page 228 of PBP. (Severity: 2) -Postfix control "if" used at line 1331, column 5. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1335, column 3. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1338, column 2. See page 97 of PBP. (Severity: 2) -Quotes used with an empty string at line 1341, column 53. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 1376, column 79. See pages 93,94 of PBP. (Severity: 2) -Double-sigil dereference at line 1380, column 2. See page 228 of PBP. (Severity: 2) -Postfix control "if" used at line 1385, column 3. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1389, column 3. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1412, column 10. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1432, column 33. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1433, column 4. See page 97 of PBP. (Severity: 2) -Postfix control "if" used at line 1441, column 39. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1445, column 38. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1454, column 4. See page 97 of PBP. (Severity: 2) -Quotes used with an empty string at line 1456, column 45. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 1457, column 31. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 1457, column 31. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 1459, column 7. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1460, column 32. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1461, column 5. See page 97 of PBP. (Severity: 2) -Postfix control "if" used at line 1469, column 52. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1470, column 4. See page 97 of PBP. (Severity: 2) -Postfix control "if" used at line 1478, column 39. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1482, column 38. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1491, column 4. See page 97 of PBP. (Severity: 2) -Quotes used with an empty string at line 1492, column 49. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 1493, column 31. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 1493, column 31. See page 237 of PBP. (Severity: 2) -"unless" block used at line 1494, column 5. See page 97 of PBP. (Severity: 2) -Postfix control "if" used at line 1523, column 70. See pages 93,94 of PBP. (Severity: 2) -Code structure is deeply nested at line 1524, column 41. Consider refactoring. (Severity: 3) -"unless" block used at line 1524, column 41. See page 97 of PBP. (Severity: 2) -Postfix control "if" used at line 1535, column 39. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1539, column 38. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1557, column 3. See page 97 of PBP. (Severity: 2) -Quotes used with an empty string at line 1592, column 47. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 1593, column 59. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1595, column 4. See page 97 of PBP. (Severity: 2) -Postfix control "if" used at line 1598, column 23. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1633, column 3. See page 97 of PBP. (Severity: 2) -"unless" block used at line 1637, column 3. See page 97 of PBP. (Severity: 2) -Postfix control "unless" used at line 1666, column 20. See pages 96,97 of PBP. (Severity: 2) -Postfix control "unless" used at line 1667, column 20. See pages 96,97 of PBP. (Severity: 2) -Postfix control "if" used at line 1671, column 17. See pages 93,94 of PBP. (Severity: 2) -Too many arguments at line 1691, column 1. See page 182 of PBP. (Severity: 3) -Quotes used with an empty string at line 1698, column 58. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 1699, column 58. See page 53 of PBP. (Severity: 2) -Too many arguments at line 1706, column 1. See page 182 of PBP. (Severity: 3) -Too many arguments at line 1716, column 1. See page 182 of PBP. (Severity: 3) -Quotes used with an empty string at line 1731, column 28. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 1732, column 28. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 1744, column 26. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 1754, column 28. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 1762, column 17. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 1762, column 17. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 1772, column 55. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 1773, column 74. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 1778, column 58. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 1810, column 23. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1838, column 77. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1841, column 65. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1844, column 73. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1847, column 77. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1850, column 76. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1853, column 68. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1856, column 67. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1859, column 77. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1862, column 79. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1865, column 71. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1868, column 69. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1871, column 65. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1874, column 67. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1877, column 67. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1880, column 69. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 1895, column 15. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 1895, column 15. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 1907, column 5. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 1914, column 5. See page 53 of PBP. (Severity: 2) -Too many arguments at line 1950, column 1. See page 182 of PBP. (Severity: 3) -Postfix control "if" used at line 1954, column 19. See pages 93,94 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 1959, column 17. See page 79 of PBP. (Severity: 2) -Postfix control "if" used at line 1964, column 29. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 1972, column 35. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 1975, column 35. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 1989, column 14. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 2001, column 14. See pages 93,94 of PBP. (Severity: 2) -Too many arguments at line 2005, column 1. See page 182 of PBP. (Severity: 3) -Postfix control "if" used at line 2020, column 35. See pages 93,94 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2037, column 17. See page 79 of PBP. (Severity: 2) -Postfix control "if" used at line 2052, column 22. See pages 93,94 of PBP. (Severity: 2) -Too many arguments at line 2061, column 1. See page 182 of PBP. (Severity: 3) -Quotes used with an empty string at line 2072, column 38. See page 53 of PBP. (Severity: 2) -Postfix control "unless" used at line 2075, column 51. See pages 96,97 of PBP. (Severity: 2) -Postfix control "if" used at line 2079, column 32. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 2080, column 35. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 2082, column 32. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 2086, column 2. See page 97 of PBP. (Severity: 2) -Quotes used with an empty string at line 2097, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2140, column 40. See page 53 of PBP. (Severity: 2) -Too many arguments at line 2151, column 1. See page 182 of PBP. (Severity: 3) -Postfix control "if" used at line 2162, column 19. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 2174, column 41. See pages 93,94 of PBP. (Severity: 2) -Numeric escapes in interpolated string at line 2187, column 30. See page 56 of PBP. (Severity: 2) -Quotes used with an empty string at line 2189, column 41. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 2207, column 32. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2207, column 32. See page 237 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2220, column 65. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2223, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2226, column 39. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2235, column 82. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2244, column 32. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2244, column 45. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2244, column 61. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2247, column 22. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2250, column 39. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2261, column 41. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2274, column 29. See page 53 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2280, column 5. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2289, column 26. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2290, column 8. See page 79 of PBP. (Severity: 2) -Return value of "close" ignored at line 2313, column 2. Check the return value of "close" for success. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2333, column 12. See page 79 of PBP. (Severity: 2) -Quotes used with an empty string at line 2341, column 14. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2343, column 79. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2344, column 79. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2355, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2356, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2357, column 6. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2359, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2360, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2361, column 6. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2363, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2364, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2367, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2368, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2371, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2372, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2373, column 6. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2375, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2376, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2377, column 6. See page 53 of PBP. (Severity: 2) -Double-sigil dereference at line 2498, column 28. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 2502, column 26. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 2511, column 36. See page 228 of PBP. (Severity: 2) -Quotes used with an empty string at line 2562, column 32. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2563, column 37. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2645, column 49. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2655, column 21. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2663, column 38. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2664, column 38. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2664, column 42. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2666, column 6. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2666, column 30. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2666, column 34. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2666, column 38. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2667, column 46. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2667, column 50. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2668, column 46. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2668, column 51. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2669, column 48. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2669, column 53. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2670, column 48. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2670, column 53. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2671, column 48. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2671, column 53. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2672, column 50. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2672, column 55. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2674, column 50. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2674, column 55. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2676, column 50. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2676, column 55. See page 53 of PBP. (Severity: 2) -Numeric escapes in interpolated string at line 2686, column 12. See page 56 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 2689, column 14. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2689, column 14. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 2690, column 14. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2690, column 14. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 2691, column 14. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2691, column 14. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 2692, column 21. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2692, column 21. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 2692, column 30. See pages 93,94 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2692, column 49. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2692, column 74. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2699, column 27. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2700, column 11. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2701, column 11. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2712, column 4. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2712, column 28. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2719, column 4. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2719, column 28. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2734, column 4. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2734, column 28. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2741, column 11. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2742, column 11. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2743, column 4. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2743, column 28. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2750, column 14. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 2764, column 13. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2764, column 13. See page 237 of PBP. (Severity: 2) -Postfix control "unless" used at line 2770, column 4. See pages 96,97 of PBP. (Severity: 2) -Use 'eq' or hash instead of fixed-pattern regexps at line 2770, column 62. See pages 271,272 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 2770, column 62. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2770, column 62. See page 237 of PBP. (Severity: 2) -Expression form of "eval" at line 2776, column 13. See page 161 of PBP. (Severity: 5) -Magic punctuation variable used at line 2778, column 49. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2779, column 14. See page 79 of PBP. (Severity: 2) -Quotes used with an empty string at line 2787, column 28. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2787, column 32. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2787, column 57. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2788, column 28. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 2796, column 42. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2796, column 42. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 2797, column 17. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2797, column 21. See page 53 of PBP. (Severity: 2) -"unless" block used at line 2823, column 3. See page 97 of PBP. (Severity: 2) -Double-sigil dereference at line 2835, column 3. See page 228 of PBP. (Severity: 2) -Postfix control "if" used at line 2835, column 35. See pages 93,94 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2838, column 71. See page 53 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2838, column 71. See page 79 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2841, column 100. See page 53 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2841, column 100. See page 79 of PBP. (Severity: 2) -Double-sigil dereference at line 2843, column 15. See page 228 of PBP. (Severity: 2) -Quotes used with an empty string at line 2887, column 5. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2887, column 23. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2891, column 41. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2950, column 5. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2961, column 5. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2961, column 23. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2962, column 5. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2976, column 5. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2976, column 23. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2978, column 5. See page 53 of PBP. (Severity: 2) -Expression form of "eval" at line 2994, column 13. See page 161 of PBP. (Severity: 5) -Magic punctuation variable used at line 2996, column 45. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2997, column 10. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 3008, column 14. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 3010, column 14. See page 79 of PBP. (Severity: 2) -Double-sigil dereference at line 3011, column 37. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3011, column 54. See page 228 of PBP. (Severity: 2) -"unless" block used at line 3017, column 4. See page 97 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 3020, column 16. See page 79 of PBP. (Severity: 2) -Quotes used with an empty string at line 3031, column 5. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3041, column 5. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3049, column 17. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3049, column 17. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3052, column 28. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3052, column 28. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 3053, column 23. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3058, column 17. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3064, column 6. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3077, column 21. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3077, column 21. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 3078, column 44. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3081, column 24. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3089, column 21. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3089, column 21. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 3090, column 40. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3093, column 24. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 3115, column 67. See pages 93,94 of PBP. (Severity: 2) -Subroutine "select_msgs" does not end with "return" at line 3135, column 1. See page 197 of PBP. (Severity: 4) -Long number not separated with underscores at line 3219, column 63. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 3220, column 63. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 3241, column 45. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 3244, column 46. See page 59 of PBP. (Severity: 2) -Double-sigil dereference at line 3255, column 9. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3256, column 9. See page 228 of PBP. (Severity: 2) -"unless" block used at line 3259, column 3. See page 97 of PBP. (Severity: 2) -"unless" block used at line 3260, column 3. See page 97 of PBP. (Severity: 2) -Subroutine "tests_msgs_from_maxmin" does not end with "return" at line 3274, column 1. See page 197 of PBP. (Severity: 4) -Postfix control "if" used at line 3322, column 22. See pages 93,94 of PBP. (Severity: 2) -Subroutine "copy_message" with high complexity score (21) at line 3351, column 1. Consider refactoring. (Severity: 3) -Too many arguments at line 3351, column 1. See page 182 of PBP. (Severity: 3) -Quotes used with an empty string at line 3358, column 54. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3359, column 61. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 3367, column 41. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 3368, column 95. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 3399, column 19. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 3399, column 35. See page 53 of PBP. (Severity: 2) -Too many arguments at line 3411, column 1. See page 182 of PBP. (Severity: 3) -Quotes used with an empty string at line 3416, column 60. See page 53 of PBP. (Severity: 2) -"unless" block used at line 3418, column 2. See page 97 of PBP. (Severity: 2) -Quotes used with an empty string at line 3421, column 24. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 3423, column 34. See pages 93,94 of PBP. (Severity: 2) -Quotes used with a noisy string at line 3448, column 3. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 3451, column 49. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3459, column 16. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3481, column 15. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3481, column 15. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 3486, column 37. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 3487, column 64. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 3494, column 16. See page 53 of PBP. (Severity: 2) -Subroutine "tests_subject" does not end with "return" at line 3505, column 1. See page 197 of PBP. (Severity: 4) -Quotes used with an empty string at line 3506, column 6. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3506, column 21. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3546, column 6. See page 53 of PBP. (Severity: 2) -Too many arguments at line 3568, column 1. See page 182 of PBP. (Severity: 3) -Quotes used with an empty string at line 3577, column 58. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3589, column 20. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3589, column 20. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3604, column 75. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3604, column 75. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 3633, column 28. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 3641, column 10. See page 53 of PBP. (Severity: 2) -Double-sigil dereference at line 3674, column 2. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3674, column 22. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3675, column 2. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3675, column 22. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3677, column 26. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3734, column 37. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3735, column 37. See page 228 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3748, column 23. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3748, column 23. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 3775, column 50. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 3822, column 35. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3822, column 46. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3822, column 57. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3822, column 68. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3822, column 79. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3823, column 35. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3823, column 46. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3823, column 57. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3823, column 68. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3823, column 79. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3823, column 90. See page 53 of PBP. (Severity: 2) -Double-sigil dereference at line 3827, column 37. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3828, column 37. See page 228 of PBP. (Severity: 2) -Quotes used with an empty string at line 3870, column 32. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3870, column 43. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3870, column 54. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3870, column 65. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3870, column 76. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3871, column 32. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3871, column 43. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3871, column 54. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3871, column 65. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3871, column 76. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3871, column 87. See page 53 of PBP. (Severity: 2) -Double-sigil dereference at line 3874, column 34. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3875, column 34. See page 228 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3890, column 16. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3890, column 16. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 3903, column 47. See page 53 of PBP. (Severity: 2) -Double-sigil dereference at line 3935, column 78. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3936, column 21. See page 228 of PBP. (Severity: 2) -Quotes used with an empty string at line 3939, column 102. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 3948, column 29. See page 53 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 3948, column 29. See page 79 of PBP. (Severity: 2) -Quotes used with an empty string at line 3987, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3988, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3992, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3993, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3994, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4038, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4039, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4040, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4044, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4045, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4046, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4104, column 33. See page 53 of PBP. (Severity: 2) -Hard tabs used at line 4139, column 10. See page 20 of PBP. (Severity: 3) -Quotes used with an empty string at line 4174, column 43. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4175, column 44. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4176, column 48. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 4187, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 4188, column 25. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4204, column 21. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4204, column 21. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4206, column 20. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4206, column 20. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4230, column 13. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4230, column 13. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 4236, column 5. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4236, column 32. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 4236, column 36. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 4237, column 46. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 4238, column 54. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 4241, column 54. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 4242, column 60. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4263, column 15. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4264, column 15. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4280, column 15. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4281, column 15. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4284, column 15. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4293, column 15. See page 53 of PBP. (Severity: 2) -Expression form of "eval" at line 4410, column 13. See page 161 of PBP. (Severity: 5) -Magic punctuation variable used at line 4412, column 38. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 4413, column 10. See page 79 of PBP. (Severity: 2) -Long number not separated with underscores at line 4426, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4427, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4429, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4430, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4432, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4433, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4435, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4436, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4438, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4439, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4441, column 49. See page 59 of PBP. (Severity: 2) -Quotes used with an empty string at line 4450, column 23. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 4495, column 65. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 4554, column 31. See pages 93,94 of PBP. (Severity: 2) -Too many arguments at line 4565, column 1. See page 182 of PBP. (Severity: 3) -Double-sigil dereference at line 4569, column 29. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 4580, column 43. See page 228 of PBP. (Severity: 2) -Postfix control "unless" used at line 4603, column 29. See pages 96,97 of PBP. (Severity: 2) -Double-sigil dereference at line 4629, column 29. See page 228 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4640, column 30. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4640, column 30. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4655, column 24. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4655, column 24. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4658, column 24. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4658, column 24. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4661, column 24. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4661, column 24. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4664, column 24. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4664, column 24. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4667, column 98. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4667, column 98. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 4680, column 37. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4680, column 41. See page 53 of PBP. (Severity: 2) -Numeric escapes in interpolated string at line 4685, column 51. See page 56 of PBP. (Severity: 2) -Quotes used with an empty string at line 4695, column 21. See page 53 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 4697, column 52. See page 79 of PBP. (Severity: 2) -Return value of "close" ignored at line 4699, column 9. Check the return value of "close" for success. (Severity: 2) -Magic punctuation variable used in interpolated string at line 4708, column 46. See page 79 of PBP. (Severity: 2) -Return value of "close" ignored at line 4710, column 2. Check the return value of "close" for success. (Severity: 2) -Quotes used with an empty string at line 4711, column 14. See page 53 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 4717, column 67. See page 79 of PBP. (Severity: 2) -Return value of "close" ignored at line 4719, column 2. Check the return value of "close" for success. (Severity: 2) -Regular expression without "/s" flag at line 4734, column 21. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4734, column 21. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4758, column 24. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4758, column 24. See page 237 of PBP. (Severity: 2) -Magic punctuation variable used at line 4775, column 18. See page 79 of PBP. (Severity: 2) -Return value of "close" ignored at line 4798, column 2. Check the return value of "close" for success. (Severity: 2) -Magic punctuation variable used in interpolated string at line 4818, column 20. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used at line 4832, column 23. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used at line 4834, column 7. See page 79 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4834, column 13. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4834, column 13. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 4849, column 20. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4851, column 11. See page 53 of PBP. (Severity: 2) -String delimiter used with "split" at line 4903, column 28. Express it as a regex instead. (Severity: 2) -Quotes used with a noisy string at line 4903, column 34. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4966, column 17. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4966, column 17. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4975, column 17. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4975, column 17. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 5013, column 13. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5016, column 17. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5016, column 17. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 5019, column 16. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 5019, column 30. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 5020, column 22. See pages 93,94 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5025, column 12. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5025, column 12. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 5037, column 38. See pages 93,94 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5037, column 72. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5037, column 72. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 5038, column 38. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 5040, column 46. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 5044, column 30. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 5046, column 34. See pages 93,94 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5051, column 12. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5051, column 12. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5067, column 19. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5067, column 19. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5080, column 12. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5080, column 12. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 5086, column 29. See pages 93,94 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5092, column 12. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5092, column 12. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5103, column 12. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5103, column 12. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 5124, column 5. See page 53 of PBP. (Severity: 2) -Double-sigil dereference at line 5176, column 33. See page 228 of PBP. (Severity: 2) -Expression form of "eval" at line 5197, column 43. See page 161 of PBP. (Severity: 5) -Expression form of "eval" at line 5201, column 45. See page 161 of PBP. (Severity: 5) -Postfix control "if" used at line 5206, column 34. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 5207, column 36. See pages 93,94 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5221, column 33. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5221, column 33. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 5222, column 36. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5260, column 27. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5260, column 27. See page 237 of PBP. (Severity: 2) -Use 'eq' or hash instead of fixed-pattern regexps at line 5264, column 36. See pages 271,272 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5264, column 36. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5264, column 36. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5266, column 31. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5266, column 31. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5272, column 34. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5272, column 34. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 5275, column 65. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 5401, column 17. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5406, column 20. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5406, column 20. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 5412, column 28. See pages 93,94 of PBP. (Severity: 2) -Quotes used with a noisy string at line 5412, column 33. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 5413, column 28. See pages 93,94 of PBP. (Severity: 2) -Quotes used with a noisy string at line 5413, column 33. See page 53 of PBP. (Severity: 2) -Long number not separated with underscores at line 5446, column 55. See page 59 of PBP. (Severity: 2) -"$i" is declared but not used at line 5465, column 9. Unused variables clutter code and make it harder to read. (Severity: 3) -Quotes used with an empty string at line 5476, column 28. See page 53 of PBP. (Severity: 2) -Long number not separated with underscores at line 5484, column 40. See page 59 of PBP. (Severity: 2) -Quotes used with an empty string at line 5496, column 25. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 5497, column 43. See pages 93,94 of PBP. (Severity: 2) -Quotes used with a noisy string at line 5498, column 54. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 5498, column 60. See page 53 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated here-document at line 5499, column 15. See page 79 of PBP. (Severity: 2) -Quotes used with a noisy string at line 5742, column 20. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5747, column 14. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5747, column 14. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 5882, column 49. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 5895, column 12. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 5899, column 32. See pages 93,94 of PBP. (Severity: 2) -Postfix control "unless" used at line 5902, column 30. See pages 96,97 of PBP. (Severity: 2) -Postfix control "if" used at line 5910, column 32. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 5921, column 32. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 5986, column 33. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 1096, column 46. See page 53 of PBP. (Severity: 2) +Expression form of "map" at line 1096, column 51. See page 169 of PBP. (Severity: 4) +Regular expression without "/s" flag at line 1104, column 33. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1104, column 33. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 1106, column 46. See page 53 of PBP. (Severity: 2) +Expression form of "map" at line 1106, column 51. See page 169 of PBP. (Severity: 4) +Postfix control "if" used at line 1177, column 15. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1187, column 3. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1195, column 32. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1242, column 3. See page 97 of PBP. (Severity: 2) +"unless" block used at line 1250, column 3. See page 97 of PBP. (Severity: 2) +Quotes used with an empty string at line 1282, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1283, column 50. See page 53 of PBP. (Severity: 2) +Double-sigil dereference at line 1293, column 39. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 1295, column 50. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 1305, column 49. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 1306, column 30. See page 228 of PBP. (Severity: 2) +Postfix control "if" used at line 1324, column 57. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1334, column 77. See pages 93,94 of PBP. (Severity: 2) +Double-sigil dereference at line 1337, column 2. See page 228 of PBP. (Severity: 2) +Postfix control "if" used at line 1342, column 5. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1346, column 3. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1349, column 2. See page 97 of PBP. (Severity: 2) +Quotes used with an empty string at line 1352, column 53. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 1387, column 79. See pages 93,94 of PBP. (Severity: 2) +Double-sigil dereference at line 1391, column 2. See page 228 of PBP. (Severity: 2) +Postfix control "if" used at line 1396, column 3. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1400, column 3. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1430, column 10. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1450, column 33. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1451, column 4. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 1459, column 39. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1463, column 38. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1472, column 4. See page 97 of PBP. (Severity: 2) +Quotes used with an empty string at line 1474, column 45. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 1475, column 31. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1475, column 31. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 1477, column 7. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1478, column 32. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1479, column 5. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 1487, column 52. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1488, column 4. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 1496, column 39. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1500, column 38. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1509, column 4. See page 97 of PBP. (Severity: 2) +Quotes used with an empty string at line 1510, column 49. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 1511, column 31. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1511, column 31. See page 237 of PBP. (Severity: 2) +"unless" block used at line 1512, column 5. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 1541, column 70. See pages 93,94 of PBP. (Severity: 2) +Code structure is deeply nested at line 1542, column 41. Consider refactoring. (Severity: 3) +"unless" block used at line 1542, column 41. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 1553, column 39. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1557, column 38. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 1621, column 47. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 1622, column 59. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1624, column 4. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 1627, column 23. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1661, column 3. See page 97 of PBP. (Severity: 2) +"unless" block used at line 1665, column 3. See page 97 of PBP. (Severity: 2) +Postfix control "unless" used at line 1697, column 20. See pages 96,97 of PBP. (Severity: 2) +Postfix control "unless" used at line 1698, column 20. See pages 96,97 of PBP. (Severity: 2) +Postfix control "if" used at line 1702, column 17. See pages 93,94 of PBP. (Severity: 2) +Too many arguments at line 1722, column 1. See page 182 of PBP. (Severity: 3) +Quotes used with an empty string at line 1732, column 58. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1733, column 58. See page 53 of PBP. (Severity: 2) +Too many arguments at line 1740, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 1750, column 1. See page 182 of PBP. (Severity: 3) +Quotes used with an empty string at line 1765, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1766, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1778, column 26. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1788, column 28. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 1796, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1796, column 17. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 1806, column 55. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1807, column 74. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 1812, column 58. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 1844, column 23. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1872, column 77. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1875, column 65. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1878, column 73. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1881, column 77. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1884, column 76. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1887, column 68. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1890, column 67. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1893, column 77. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1896, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1899, column 71. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1902, column 69. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1905, column 65. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1908, column 67. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1911, column 67. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1914, column 69. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 1929, column 15. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1929, column 15. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 1941, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1948, column 5. See page 53 of PBP. (Severity: 2) +Too many arguments at line 1984, column 1. See page 182 of PBP. (Severity: 3) +Postfix control "if" used at line 1988, column 19. See pages 93,94 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 1993, column 17. See page 79 of PBP. (Severity: 2) +Postfix control "if" used at line 1998, column 29. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 2006, column 35. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2009, column 35. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 2023, column 14. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 2035, column 14. See pages 93,94 of PBP. (Severity: 2) +Too many arguments at line 2039, column 1. See page 182 of PBP. (Severity: 3) +Postfix control "if" used at line 2054, column 35. See pages 93,94 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2071, column 17. See page 79 of PBP. (Severity: 2) +Postfix control "if" used at line 2086, column 22. See pages 93,94 of PBP. (Severity: 2) +Too many arguments at line 2095, column 1. See page 182 of PBP. (Severity: 3) +Quotes used with an empty string at line 2106, column 38. See page 53 of PBP. (Severity: 2) +Postfix control "unless" used at line 2109, column 51. See pages 96,97 of PBP. (Severity: 2) +Postfix control "if" used at line 2113, column 32. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 2114, column 35. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 2116, column 32. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 2120, column 2. See page 97 of PBP. (Severity: 2) +Quotes used with an empty string at line 2131, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2174, column 40. See page 53 of PBP. (Severity: 2) +Too many arguments at line 2185, column 1. See page 182 of PBP. (Severity: 3) +Postfix control "if" used at line 2196, column 19. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 2208, column 41. See pages 93,94 of PBP. (Severity: 2) +Numeric escapes in interpolated string at line 2221, column 30. See page 56 of PBP. (Severity: 2) +Quotes used with an empty string at line 2223, column 41. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2241, column 32. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2241, column 32. See page 237 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2254, column 65. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2257, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2260, column 39. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2269, column 82. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2278, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2278, column 45. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2278, column 61. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2281, column 22. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2284, column 39. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2295, column 41. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2308, column 29. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2314, column 5. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2323, column 26. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2324, column 8. See page 79 of PBP. (Severity: 2) +Return value of "close" ignored at line 2347, column 2. Check the return value of "close" for success. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2367, column 12. See page 79 of PBP. (Severity: 2) +Quotes used with an empty string at line 2375, column 14. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2377, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2378, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2389, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2390, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2391, column 6. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2393, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2394, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2395, column 6. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2397, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2398, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2401, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2402, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2405, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2406, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2407, column 6. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2409, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2410, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2411, column 6. See page 53 of PBP. (Severity: 2) +Reused variable name in lexical scope: $imap2 at line 2477, column 9. Invent unique variable names. (Severity: 3) +Regular expression without "/s" flag at line 2493, column 20. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/x" flag at line 2493, column 20. See page 236 of PBP. (Severity: 3) +Regular expression without "/m" flag at line 2493, column 20. See page 237 of PBP. (Severity: 2) +Mixed high and low-precedence booleans at line 2494, column 12. See page 70 of PBP. (Severity: 4) +Quotes used with an empty string at line 2494, column 24. See page 53 of PBP. (Severity: 2) +List of quoted literal words at line 2546, column 17. Use 'qw()' instead. (Severity: 2) +List of quoted literal words at line 2547, column 17. Use 'qw()' instead. (Severity: 2) +Double-sigil dereference at line 2612, column 28. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 2616, column 26. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 2625, column 36. See page 228 of PBP. (Severity: 2) +Quotes used with an empty string at line 2676, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2677, column 37. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2759, column 49. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2769, column 21. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2777, column 38. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2778, column 38. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2778, column 42. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2780, column 6. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2780, column 30. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2780, column 34. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2780, column 38. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2781, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2781, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2782, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2782, column 51. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2783, column 48. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2783, column 53. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2784, column 48. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2784, column 53. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2785, column 48. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2785, column 53. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2786, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2786, column 55. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2788, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2788, column 55. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2790, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2790, column 55. See page 53 of PBP. (Severity: 2) +Numeric escapes in interpolated string at line 2800, column 12. See page 56 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2803, column 14. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2803, column 14. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2804, column 14. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2804, column 14. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2805, column 14. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2805, column 14. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2806, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2806, column 21. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 2806, column 30. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2806, column 49. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2806, column 74. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2813, column 27. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2814, column 11. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2815, column 11. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2826, column 4. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2826, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2833, column 4. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2833, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2848, column 4. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2848, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2855, column 11. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2856, column 11. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2857, column 4. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2857, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2864, column 14. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2878, column 13. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2878, column 13. See page 237 of PBP. (Severity: 2) +Postfix control "unless" used at line 2884, column 4. See pages 96,97 of PBP. (Severity: 2) +Use 'eq' or hash instead of fixed-pattern regexps at line 2884, column 62. See pages 271,272 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2884, column 62. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2884, column 62. See page 237 of PBP. (Severity: 2) +Expression form of "eval" at line 2890, column 13. See page 161 of PBP. (Severity: 5) +Magic punctuation variable used at line 2892, column 49. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2893, column 14. See page 79 of PBP. (Severity: 2) +Quotes used with an empty string at line 2901, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2901, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2901, column 57. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2902, column 28. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2910, column 42. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2910, column 42. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 2911, column 17. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2911, column 21. See page 53 of PBP. (Severity: 2) +"unless" block used at line 2937, column 3. See page 97 of PBP. (Severity: 2) +Double-sigil dereference at line 2949, column 3. See page 228 of PBP. (Severity: 2) +Postfix control "if" used at line 2949, column 35. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2952, column 71. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2952, column 71. See page 79 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2955, column 100. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2955, column 100. See page 79 of PBP. (Severity: 2) +Double-sigil dereference at line 2957, column 15. See page 228 of PBP. (Severity: 2) +Quotes used with an empty string at line 3001, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3001, column 23. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3005, column 41. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3064, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3075, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3075, column 23. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3076, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3090, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3090, column 23. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3092, column 5. See page 53 of PBP. (Severity: 2) +Expression form of "eval" at line 3108, column 13. See page 161 of PBP. (Severity: 5) +Magic punctuation variable used at line 3110, column 45. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 3111, column 10. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 3122, column 14. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 3124, column 14. See page 79 of PBP. (Severity: 2) +Double-sigil dereference at line 3125, column 37. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3125, column 54. See page 228 of PBP. (Severity: 2) +"unless" block used at line 3131, column 4. See page 97 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 3134, column 16. See page 79 of PBP. (Severity: 2) +Quotes used with an empty string at line 3145, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3155, column 5. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3163, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3163, column 17. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3166, column 28. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3166, column 28. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 3167, column 23. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3172, column 17. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3178, column 6. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3191, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3191, column 21. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 3192, column 44. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3195, column 24. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3203, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3203, column 21. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 3204, column 40. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3207, column 24. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 3229, column 67. See pages 93,94 of PBP. (Severity: 2) +Subroutine "select_msgs" does not end with "return" at line 3249, column 1. See page 197 of PBP. (Severity: 4) +Long number not separated with underscores at line 3333, column 63. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 3334, column 63. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 3355, column 45. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 3358, column 46. See page 59 of PBP. (Severity: 2) +Double-sigil dereference at line 3369, column 9. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3370, column 9. See page 228 of PBP. (Severity: 2) +"unless" block used at line 3373, column 3. See page 97 of PBP. (Severity: 2) +"unless" block used at line 3374, column 3. See page 97 of PBP. (Severity: 2) +Subroutine "tests_msgs_from_maxmin" does not end with "return" at line 3388, column 1. See page 197 of PBP. (Severity: 4) +Postfix control "if" used at line 3436, column 22. See pages 93,94 of PBP. (Severity: 2) +Subroutine "copy_message" with high complexity score (24) at line 3465, column 1. Consider refactoring. (Severity: 3) +Too many arguments at line 3465, column 1. See page 182 of PBP. (Severity: 3) +Quotes used with an empty string at line 3472, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3473, column 61. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 3481, column 41. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 3482, column 95. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 3518, column 19. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 3518, column 35. See page 53 of PBP. (Severity: 2) +Too many arguments at line 3533, column 1. See page 182 of PBP. (Severity: 3) +Quotes used with an empty string at line 3538, column 60. See page 53 of PBP. (Severity: 2) +"unless" block used at line 3540, column 2. See page 97 of PBP. (Severity: 2) +Quotes used with an empty string at line 3543, column 24. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 3545, column 34. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 3570, column 3. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 3573, column 49. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3581, column 16. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3603, column 15. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3603, column 15. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 3608, column 37. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 3609, column 64. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 3616, column 16. See page 53 of PBP. (Severity: 2) +Subroutine "tests_subject" does not end with "return" at line 3627, column 1. See page 197 of PBP. (Severity: 4) +Quotes used with an empty string at line 3628, column 6. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3628, column 21. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3668, column 6. See page 53 of PBP. (Severity: 2) +Too many arguments at line 3690, column 1. See page 182 of PBP. (Severity: 3) +Quotes used with an empty string at line 3699, column 58. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3711, column 20. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3711, column 20. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3726, column 75. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3726, column 75. See page 237 of PBP. (Severity: 2) +Subroutine "sleep_if_needed" does not end with "return" at line 3746, column 1. See page 197 of PBP. (Severity: 4) +Reused variable name in lexical scope: $total_bytes_transferred at line 3747, column 2. Invent unique variable names. (Severity: 3) +Reused variable name in lexical scope: $nb_msg_transferred at line 3747, column 2. Invent unique variable names. (Severity: 3) +Reused variable name in lexical scope: $nb_msg_transferred at line 3759, column 9. Invent unique variable names. (Severity: 3) +Reused variable name in lexical scope: $maxmessagespersecond at line 3759, column 9. Invent unique variable names. (Severity: 3) +Reused variable name in lexical scope: $total_bytes_transferred at line 3780, column 9. Invent unique variable names. (Severity: 3) +Reused variable name in lexical scope: $maxbytespersecond at line 3780, column 9. Invent unique variable names. (Severity: 3) +Postfix control "if" used at line 3808, column 28. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 3816, column 10. See page 53 of PBP. (Severity: 2) +Double-sigil dereference at line 3849, column 2. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3849, column 22. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3850, column 2. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3850, column 22. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3852, column 26. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3909, column 37. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3910, column 37. See page 228 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3923, column 23. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3923, column 23. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 3950, column 50. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 3997, column 35. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3997, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3997, column 57. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3997, column 68. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3997, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3998, column 35. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3998, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3998, column 57. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3998, column 68. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3998, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3998, column 90. See page 53 of PBP. (Severity: 2) +Double-sigil dereference at line 4002, column 37. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 4003, column 37. See page 228 of PBP. (Severity: 2) +Quotes used with an empty string at line 4045, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4045, column 43. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4045, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4045, column 65. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4045, column 76. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4046, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4046, column 43. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4046, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4046, column 65. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4046, column 76. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4046, column 87. See page 53 of PBP. (Severity: 2) +Double-sigil dereference at line 4049, column 34. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 4050, column 34. See page 228 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4065, column 16. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4065, column 16. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 4078, column 47. See page 53 of PBP. (Severity: 2) +Double-sigil dereference at line 4110, column 78. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 4111, column 21. See page 228 of PBP. (Severity: 2) +Quotes used with an empty string at line 4114, column 102. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4123, column 29. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 4123, column 29. See page 79 of PBP. (Severity: 2) +Quotes used with an empty string at line 4162, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4163, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4167, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4168, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4169, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4213, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4214, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4215, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4219, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4220, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4221, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4248, column 49. See page 53 of PBP. (Severity: 2) +Mismatched operator at line 4248, column 75. Numeric/string operators and operands should match. (Severity: 3) +Quotes used with an empty string at line 4297, column 33. See page 53 of PBP. (Severity: 2) +Hard tabs used at line 4332, column 10. See page 20 of PBP. (Severity: 3) +Quotes used with an empty string at line 4367, column 43. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4368, column 44. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4369, column 48. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4380, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4381, column 25. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4397, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4397, column 21. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4399, column 20. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4399, column 20. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4423, column 13. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4423, column 13. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 4429, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4429, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4429, column 36. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4430, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4431, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4434, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4435, column 60. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4456, column 15. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4457, column 15. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4473, column 15. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4474, column 15. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4477, column 15. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4486, column 15. See page 53 of PBP. (Severity: 2) +Expression form of "eval" at line 4603, column 13. See page 161 of PBP. (Severity: 5) +Magic punctuation variable used at line 4605, column 38. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 4606, column 10. See page 79 of PBP. (Severity: 2) +Long number not separated with underscores at line 4619, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4620, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4622, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4623, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4625, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4626, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4628, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4629, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4631, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4632, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4634, column 49. See page 59 of PBP. (Severity: 2) +Quotes used with an empty string at line 4643, column 23. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 4688, column 65. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 4747, column 31. See pages 93,94 of PBP. (Severity: 2) +Too many arguments at line 4758, column 1. See page 182 of PBP. (Severity: 3) +Double-sigil dereference at line 4762, column 29. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 4773, column 43. See page 228 of PBP. (Severity: 2) +Postfix control "unless" used at line 4796, column 29. See pages 96,97 of PBP. (Severity: 2) +Double-sigil dereference at line 4822, column 29. See page 228 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4833, column 30. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4833, column 30. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4848, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4848, column 24. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4851, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4851, column 24. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4854, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4854, column 24. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4857, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4857, column 24. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4860, column 98. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4860, column 98. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 4873, column 37. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4873, column 41. See page 53 of PBP. (Severity: 2) +Numeric escapes in interpolated string at line 4878, column 51. See page 56 of PBP. (Severity: 2) +Quotes used with an empty string at line 4888, column 21. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 4890, column 52. See page 79 of PBP. (Severity: 2) +Return value of "close" ignored at line 4892, column 9. Check the return value of "close" for success. (Severity: 2) +Magic punctuation variable used in interpolated string at line 4901, column 46. See page 79 of PBP. (Severity: 2) +Return value of "close" ignored at line 4903, column 2. Check the return value of "close" for success. (Severity: 2) +Quotes used with an empty string at line 4904, column 14. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 4910, column 67. See page 79 of PBP. (Severity: 2) +Return value of "close" ignored at line 4912, column 2. Check the return value of "close" for success. (Severity: 2) +Regular expression without "/s" flag at line 4927, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4927, column 21. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4951, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4951, column 24. See page 237 of PBP. (Severity: 2) +Magic punctuation variable used at line 4968, column 18. See page 79 of PBP. (Severity: 2) +Return value of "close" ignored at line 4991, column 2. Check the return value of "close" for success. (Severity: 2) +Magic punctuation variable used in interpolated string at line 5011, column 20. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used at line 5025, column 23. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used at line 5027, column 7. See page 79 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5027, column 13. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5027, column 13. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 5042, column 20. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 5044, column 11. See page 53 of PBP. (Severity: 2) +String delimiter used with "split" at line 5096, column 28. Express it as a regex instead. (Severity: 2) +Quotes used with a noisy string at line 5096, column 34. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5159, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5159, column 17. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5168, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5168, column 17. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 5206, column 13. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5209, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5209, column 17. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 5212, column 16. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 5212, column 30. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 5213, column 22. See pages 93,94 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5218, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5218, column 12. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 5230, column 38. See pages 93,94 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5230, column 72. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5230, column 72. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 5231, column 38. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 5233, column 46. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 5237, column 30. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 5239, column 34. See pages 93,94 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5244, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5244, column 12. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5260, column 19. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5260, column 19. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5273, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5273, column 12. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 5279, column 29. See pages 93,94 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5285, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5285, column 12. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5296, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5296, column 12. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 5317, column 5. See page 53 of PBP. (Severity: 2) +Double-sigil dereference at line 5369, column 33. See page 228 of PBP. (Severity: 2) +Expression form of "eval" at line 5390, column 43. See page 161 of PBP. (Severity: 5) +Expression form of "eval" at line 5394, column 45. See page 161 of PBP. (Severity: 5) +Postfix control "if" used at line 5399, column 34. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 5400, column 36. See pages 93,94 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5414, column 33. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5414, column 33. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 5415, column 36. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5453, column 27. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5453, column 27. See page 237 of PBP. (Severity: 2) +Use 'eq' or hash instead of fixed-pattern regexps at line 5457, column 36. See pages 271,272 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5457, column 36. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5457, column 36. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5459, column 31. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5459, column 31. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5465, column 34. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5465, column 34. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 5468, column 65. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 5594, column 17. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5599, column 20. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5599, column 20. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 5605, column 28. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5605, column 33. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 5606, column 28. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5606, column 33. See page 53 of PBP. (Severity: 2) +Long number not separated with underscores at line 5639, column 55. See page 59 of PBP. (Severity: 2) +"$i" is declared but not used at line 5658, column 9. Unused variables clutter code and make it harder to read. (Severity: 3) +Quotes used with an empty string at line 5669, column 28. See page 53 of PBP. (Severity: 2) +Long number not separated with underscores at line 5677, column 40. See page 59 of PBP. (Severity: 2) +Quotes used with an empty string at line 5689, column 25. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 5690, column 43. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5691, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5691, column 60. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated here-document at line 5692, column 15. See page 79 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5941, column 20. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5946, column 14. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5946, column 14. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 6089, column 49. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 6102, column 12. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 6106, column 32. See pages 93,94 of PBP. (Severity: 2) +Postfix control "unless" used at line 6109, column 30. See pages 96,97 of PBP. (Severity: 2) +Postfix control "if" used at line 6117, column 32. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 6128, column 32. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 6195, column 33. See pages 93,94 of PBP. (Severity: 2) diff --git a/perlcritic_3.out b/perlcritic_3.out index 6f847d0..48ebaff 100644 --- a/perlcritic_3.out +++ b/perlcritic_3.out @@ -1,24 +1,37 @@ -Main code has high complexity score (338) at line 1, column 1. Consider refactoring. (Severity: 3) -Code structure is deeply nested at line 1524, column 41. Consider refactoring. (Severity: 3) -Too many arguments at line 1691, column 1. See page 182 of PBP. (Severity: 3) -Too many arguments at line 1706, column 1. See page 182 of PBP. (Severity: 3) -Too many arguments at line 1716, column 1. See page 182 of PBP. (Severity: 3) -Too many arguments at line 1950, column 1. See page 182 of PBP. (Severity: 3) -Too many arguments at line 2005, column 1. See page 182 of PBP. (Severity: 3) -Too many arguments at line 2061, column 1. See page 182 of PBP. (Severity: 3) -Too many arguments at line 2151, column 1. See page 182 of PBP. (Severity: 3) -Expression form of "eval" at line 2776, column 13. See page 161 of PBP. (Severity: 5) -Expression form of "eval" at line 2994, column 13. See page 161 of PBP. (Severity: 5) -Subroutine "select_msgs" does not end with "return" at line 3135, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_msgs_from_maxmin" does not end with "return" at line 3274, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "copy_message" with high complexity score (21) at line 3351, column 1. Consider refactoring. (Severity: 3) -Too many arguments at line 3351, column 1. See page 182 of PBP. (Severity: 3) -Too many arguments at line 3411, column 1. See page 182 of PBP. (Severity: 3) -Subroutine "tests_subject" does not end with "return" at line 3505, column 1. See page 197 of PBP. (Severity: 4) -Too many arguments at line 3568, column 1. See page 182 of PBP. (Severity: 3) -Hard tabs used at line 4139, column 10. See page 20 of PBP. (Severity: 3) -Expression form of "eval" at line 4410, column 13. See page 161 of PBP. (Severity: 5) -Too many arguments at line 4565, column 1. See page 182 of PBP. (Severity: 3) -Expression form of "eval" at line 5197, column 43. See page 161 of PBP. (Severity: 5) -Expression form of "eval" at line 5201, column 45. See page 161 of PBP. (Severity: 5) -"$i" is declared but not used at line 5465, column 9. Unused variables clutter code and make it harder to read. (Severity: 3) +Main code has high complexity score (350) at line 1, column 1. Consider refactoring. (Severity: 3) +Expression form of "map" at line 1096, column 51. See page 169 of PBP. (Severity: 4) +Expression form of "map" at line 1106, column 51. See page 169 of PBP. (Severity: 4) +Code structure is deeply nested at line 1542, column 41. Consider refactoring. (Severity: 3) +Too many arguments at line 1722, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 1740, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 1750, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 1984, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 2039, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 2095, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 2185, column 1. See page 182 of PBP. (Severity: 3) +Reused variable name in lexical scope: $imap2 at line 2477, column 9. Invent unique variable names. (Severity: 3) +Regular expression without "/x" flag at line 2493, column 20. See page 236 of PBP. (Severity: 3) +Mixed high and low-precedence booleans at line 2494, column 12. See page 70 of PBP. (Severity: 4) +Expression form of "eval" at line 2890, column 13. See page 161 of PBP. (Severity: 5) +Expression form of "eval" at line 3108, column 13. See page 161 of PBP. (Severity: 5) +Subroutine "select_msgs" does not end with "return" at line 3249, column 1. See page 197 of PBP. (Severity: 4) +Subroutine "tests_msgs_from_maxmin" does not end with "return" at line 3388, column 1. See page 197 of PBP. (Severity: 4) +Subroutine "copy_message" with high complexity score (24) at line 3465, column 1. Consider refactoring. (Severity: 3) +Too many arguments at line 3465, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 3533, column 1. See page 182 of PBP. (Severity: 3) +Subroutine "tests_subject" does not end with "return" at line 3627, column 1. See page 197 of PBP. (Severity: 4) +Too many arguments at line 3690, column 1. See page 182 of PBP. (Severity: 3) +Subroutine "sleep_if_needed" does not end with "return" at line 3746, column 1. See page 197 of PBP. (Severity: 4) +Reused variable name in lexical scope: $total_bytes_transferred at line 3747, column 2. Invent unique variable names. (Severity: 3) +Reused variable name in lexical scope: $nb_msg_transferred at line 3747, column 2. Invent unique variable names. (Severity: 3) +Reused variable name in lexical scope: $nb_msg_transferred at line 3759, column 9. Invent unique variable names. (Severity: 3) +Reused variable name in lexical scope: $maxmessagespersecond at line 3759, column 9. Invent unique variable names. (Severity: 3) +Reused variable name in lexical scope: $total_bytes_transferred at line 3780, column 9. Invent unique variable names. (Severity: 3) +Reused variable name in lexical scope: $maxbytespersecond at line 3780, column 9. Invent unique variable names. (Severity: 3) +Mismatched operator at line 4248, column 75. Numeric/string operators and operands should match. (Severity: 3) +Hard tabs used at line 4332, column 10. See page 20 of PBP. (Severity: 3) +Expression form of "eval" at line 4603, column 13. See page 161 of PBP. (Severity: 5) +Too many arguments at line 4758, column 1. See page 182 of PBP. (Severity: 3) +Expression form of "eval" at line 5390, column 43. See page 161 of PBP. (Severity: 5) +Expression form of "eval" at line 5394, column 45. See page 161 of PBP. (Severity: 5) +"$i" is declared but not used at line 5658, column 9. Unused variables clutter code and make it harder to read. (Severity: 3) diff --git a/tests.sh b/tests.sh index f5b1351..4b9036b 100644 --- a/tests.sh +++ b/tests.sh @@ -1,9 +1,9 @@ #!/bin/sh -# $Id: tests.sh,v 1.227 2013/09/28 11:11:16 gilles Exp gilles $ +# $Id: tests.sh,v 1.233 2013/12/25 03:25:18 gilles Exp gilles $ # Example 1: -# CMD_PERL='perl -I./W/Mail-IMAPClient-3.34/lib' sh -x tests.sh +# CMD_PERL='perl -I./W/Mail-IMAPClient-3.35/lib' sh -x tests.sh # Example 2: # To select which Mail-IMAPClient within arguments: @@ -23,7 +23,7 @@ echo HOST2=$HOST2 # few debugging tests use: CMD_PERL_2xx='perl -I./W/Mail-IMAPClient-2.2.9' -CMD_PERL_3xx='perl -I./W/Mail-IMAPClient-3.34/lib' +CMD_PERL_3xx='perl -I./W/Mail-IMAPClient-3.35/lib' CMD_PERL=${CMD_PERL:-$CMD_PERL_3xx} @@ -78,19 +78,12 @@ no_args() { $CMD_PERL ./imapsync } -# list of accounts on plume : +# list of accounts on petite : -# mailbox toto used on first_sync() -# bad_login() -# bad_host() +# mailboxes toto -> titi used on first_sync() -# mailbox titi used on first_sync() -# bad_host() -# locallocal() - -# mailbox tata used on locallocal() - -# mailbox tata titi on most ll_*() tests +# mailboxes tata -> titi used on locallocal() +# mailboxes tata -> titi on most ll_*() tests # mailbox tete@est.belle used on big size tests: # big_folder() @@ -185,6 +178,16 @@ ll_debug() { --debug --nofoldersizes } +ll_debugmemory() { + can_send && sendtestmessage + $CMD_PERL ./imapsync \ + --host1 $HOST1 --user1 tata \ + --passfile1 ../../var/pass/secret.tata \ + --host2 $HOST2 --user2 titi \ + --passfile2 ../../var/pass/secret.titi \ + --debugmemory --nofoldersizes +} + ll_nofoldersizes() @@ -327,6 +330,24 @@ ll_star() { --folder 'INBOX.backstar\*' --dry --justfolders --debugimap1 --regextrans2 's#\\|\*#_#g' } +ll_doublequote() { + $CMD_PERL ./imapsync \ + --host1 $HOST1 --user1 tata \ + --passfile1 ../../var/pass/secret.tata \ + --host2 ks.lamiral.info --user2 tata \ + --passfile2 ../../var/pass/secret.tata \ + --folder 'INBOX."uni"' --debugimap2 --nofoldersizes --justfolders --ssl1 --ssl2 +} + +ll_doublequote_rev() { + $CMD_PERL ./imapsync \ + --host1 ks.lamiral.info --user1 tata \ + --passfile1 ../../var/pass/secret.tata \ + --host2 $HOST2 --user2 tata \ + --passfile2 ../../var/pass/secret.tata \ + --foldersizes --ssl1 --ssl2 --justfolders +} + ll_folder_noexist() { @@ -526,7 +547,17 @@ ll_justfolders() { --host2 $HOST2 --user2 titi \ --passfile2 ../../var/pass/secret.titi \ --justfolders --nofoldersizes - echo "rm -rf /home/vmail/titi/.new_folder/" + echo "sudo rm -rf /home/vmail/titi/.new_folder/" +} + +ll_justfolders_foldersizes() { + $CMD_PERL ./imapsync \ + --host1 $HOST1 --user1 tata \ + --passfile1 ../../var/pass/secret.tata \ + --host2 $HOST2 --user2 titi \ + --passfile2 ../../var/pass/secret.titi \ + --justfolders + echo "sudo rm -rf /home/vmail/titi/.new_folder/" } @@ -1464,7 +1495,7 @@ ll_sep2() ll_bad_login() { ! $CMD_PERL ./imapsync \ - --host1 $HOST1 --user1 toto \ + --host1 $HOST1 --user1 tata \ --passfile1 ../../var/pass/secret.toto \ --host2 $HOST2 --user2 notiti \ --passfile2 ../../var/pass/secret.titi @@ -1474,8 +1505,8 @@ ll_bad_login() ll_bad_host() { ! $CMD_PERL ./imapsync \ - --host1 badhost --user1 toto \ - --passfile1 ../../var/pass/secret.toto \ + --host1 badhost --user1 tata \ + --passfile1 ../../var/pass/secret.tata \ --host2 badhost --user2 titi \ --passfile2 ../../var/pass/secret.titi @@ -2003,6 +2034,8 @@ ll_delete2_reverse() { --delete2 --expunge2 } + + ll_delete_reverse() { $CMD_PERL ./imapsync \ --host1 $HOST1 --user1 titi \ @@ -2013,6 +2046,28 @@ ll_delete_reverse() { --delete --minage 100 --maxage 300 --noexpungeaftereach } +ll_maxmessagespersecond() { + ll_delete_reverse + $CMD_PERL ./imapsync \ + --host1 $HOST1 --user1 tata \ + --passfile1 ../../var/pass/secret.tata \ + --host2 $HOST2 --user2 titi \ + --passfile2 ../../var/pass/secret.titi \ + --folder INBOX \ + --maxmessagespersecond 3.3 +} + +ll_maxbytespersecond() { + ll_delete_reverse + $CMD_PERL ./imapsync \ + --host1 $HOST1 --user1 tata \ + --passfile1 ../../var/pass/secret.tata \ + --host2 $HOST2 --user2 titi \ + --passfile2 ../../var/pass/secret.titi \ + --folder INBOX \ + --maxbytespersecond 10000 +} + ll_delete2_minage() { @@ -2061,6 +2116,20 @@ ll_delete2duplicates() { --delete2duplicates --uidexpunge2 } +ll_duplicates_across_folders() { + $CMD_PERL ./imapsync \ + --host1 $HOST1 --user1 tata \ + --passfile1 ../../var/pass/secret.tata \ + --host2 $HOST2 --user2 titi \ + --passfile2 ../../var/pass/secret.titi \ + --folder INBOX.zz_1 \ + --folder INBOX.zz_2 \ + --folder INBOX.zz_3 \ + --skipcrossduplicates --debugcrossduplicates +} + + + ll_delete2_dev() { can_send && sendtestmessage titi @@ -2208,6 +2277,16 @@ ll_change_characters_gmail() { } +ll_blanc_vs_hyphen_gmail() { + $CMD_PERL ./imapsync \ + --host1 $HOST1 --user1 tata \ + --passfile1 ../../var/pass/secret.tata \ + --host2 $HOST2 --user2 titi \ + --passfile2 ../../var/pass/secret.titi \ + --folder "INBOX.A-B" --folder "INBOX.A B" --folder "INBOX.A.B" --justfolders +} + + xxxxx_gmail() { @@ -2390,7 +2469,7 @@ gmail_xxxxx() { --user2 tata \ --passfile2 ../../var/pass/secret.tata \ --nofoldersizes \ - --dry --justfolders --exclude Gmail + --dry --justfolders --exclude Gmail --exclude "blanc\ $" } @@ -2404,9 +2483,23 @@ gmail() { --host2 $HOST2 \ --user2 tata \ --passfile2 ../../var/pass/secret.tata \ - --exclude Gmail + --exclude Gmail --exclude "blanc\ $" } +gmail_l_tata() { + + ! ping -c1 imap.gmail.com || $CMD_PERL ./imapsync \ + --host1 imap.gmail.com \ + --ssl1 \ + --user1 gilles.lamiral@gmail.com \ + --passfile1 ../../var/pass/secret.gilles_gmail \ + --host2 $HOST2 \ + --user2 tata \ + --passfile2 ../../var/pass/secret.tata \ + --folder INBOX +} + + gmail_justfolders() { ! ping -c1 imap.gmail.com || $CMD_PERL ./imapsync \ @@ -2417,7 +2510,7 @@ gmail_justfolders() { --host2 $HOST2 \ --user2 tata \ --passfile2 ../../var/pass/secret.tata \ - --justfolders --exclude Gmail + --justfolders --exclude Gmail --exclude "blanc\ $" } @@ -2447,12 +2540,58 @@ gmail_gmail() { --ssl2 \ --user2 imapsync.gl@gmail.com \ --passfile2 ../../var/pass/secret.imapsync.gl_gmail \ - --justfolders --exclude Gmail + --justfolders --exclude Gmail --exclude "blanc\ $" + +} + +gmail_gl_gl2() { + + ! ping -c1 imap.gmail.com || $CMD_PERL ./imapsync \ + --host1 imap.gmail.com \ + --ssl1 \ + --user1 imapsync.gl@gmail.com \ + --passfile1 ../../var/pass/secret.imapsync.gl_gmail \ + --host2 imap.gmail.com \ + --ssl2 \ + --user2 imapsync.gl2@gmail.com \ + --passfile2 ../../var/pass/secret.imapsync.gl_gmail \ + --justfolders --exclude Gmail --exclude "blanc\ $" --dry +} + +gmail_gl_gl2_create_folder_old() { + + ! ping -c1 imap.gmail.com || $CMD_PERL ./imapsync \ + --host1 imap.gmail.com \ + --ssl1 \ + --user1 imapsync.gl@gmail.com \ + --passfile1 ../../var/pass/secret.imapsync.gl_gmail \ + --host2 imap.gmail.com \ + --ssl2 \ + --user2 imapsync.gl2@gmail.com \ + --passfile2 ../../var/pass/secret.imapsync.gl_gmail \ + --justfolders --exclude Gmail --exclude "blanc\ $" \ + --create_folder_old --dry --nofoldersizes +} + + +gmail_gmail_folderfirst() { + + ! ping -c1 imap.gmail.com || $CMD_PERL ./imapsync \ + --host1 imap.gmail.com \ + --ssl1 \ + --user1 gilles.lamiral@gmail.com \ + --passfile1 ../../var/pass/secret.gilles_gmail \ + --host2 imap.gmail.com \ + --ssl2 \ + --user2 imapsync.gl@gmail.com \ + --passfile2 ../../var/pass/secret.imapsync.gl_gmail \ + --exclude "blanc\ $" --exclude Gmail \ + --justfolders --folderfirst INBOX --folderfirst zz --folderlast "[Gmail]/All Mail" } -gmail_gmail_2() { +gmail_gmail_INBOX() { ! ping -c1 imap.gmail.com || $CMD_PERL ./imapsync \ --host1 imap.gmail.com \ --ssl1 \ @@ -2818,6 +2957,17 @@ ll_nofastio() --folder INBOX --nofastio1 --nofastio2 } +l_office365() +{ + $CMD_PERL ./imapsync \ + --host1 $HOST1 --user1 tata \ + --passfile1 ../../var/pass/secret.tata \ + --host2 imap-mail.outlook.com --ssl2 --user2 gilles.lamiral@outlook.com \ + --passfile2 ../../var/pass/secret.outlook.com \ + --folder INBOX --regextrans2 's/INBOX/tata/' --debugflags +} + + ########################## # specific tests ########################## @@ -3439,7 +3589,8 @@ xxxxx_gmail gmail_xxxxx gmail gmail_gmail -gmail_gmail_2 +gmail_gmail_INBOX +gmail_gmail_folderfirst yahoo_xxxx ll_unknow_option ll_ask_password