diff options
Diffstat (limited to 'camel')
211 files changed, 0 insertions, 54534 deletions
diff --git a/camel/.cvsignore b/camel/.cvsignore deleted file mode 100644 index 521f6065df..0000000000 --- a/camel/.cvsignore +++ /dev/null @@ -1,8 +0,0 @@ -.deps -Makefile -Makefile.in -.libs -.deps -*.lo -*.la -temp-test diff --git a/camel/CODING.STYLE b/camel/CODING.STYLE deleted file mode 100644 index 58e9c68bbe..0000000000 --- a/camel/CODING.STYLE +++ /dev/null @@ -1,19 +0,0 @@ -Note to hackers ---------------- - -When hacking on camel (and on the gnome mailer in general), -be sure to follow the same coding style as the initial authors. -Please read the file HACKING in gnumeric and follow the -general guidelines explained in it. - -Please take a look at camel source files and try to exactly -imitate the coding style. We are perfectly aware that this -is not the best and unique style, but it is absolutely -mandatory that Camel is homogeneous. If you find the current -coding style to have some weaknesses, please contact the -authors to discuss this matter. - -Thanks. - - Bertrand. - diff --git a/camel/ChangeLog b/camel/ChangeLog deleted file mode 100644 index 1c413b0ab0..0000000000 --- a/camel/ChangeLog +++ /dev/null @@ -1,7150 +0,0 @@ -2000-11-03 Radek Doulik <rodo@helixcode.com> - - * camel-mime-utils.c (header_msgid_generate): new function, - generates simple message/content id - -2000-11-04 Not Zed <NotZed@HelixCode.com> - - * camel-mime-part-utils.c - (camel_mime_part_construct_content_from_parser): Set the - preface/postface from the parser into the multipart object. - - * camel-multipart.c (camel_multipart_set_postface): Function to - set the postface text on a multipart. - (camel_multipart_set_preface): Similarly for preface text. - - * camel-mime-parser.c (folder_scan_content): If we scan until a - boundary, then we do not include the \n that starts the boundary - line in the content. - (struct _header_scan_stack): Added a ByteArray to store the - multipart pre/post-text as we're scanning. - (folder_pull_part): Free pre/posttext if they are allocated. - (folder_scan_step): Build into the pre/posttext arrays as we - encounter data. - (camel_mime_parser_preface): REturn the multipart preface text, if - there is any scanned. - (camel_mime_parser_postface): Likewise for postface text. - (byte_array_to_string): helper function for above. - - * providers/mbox/camel-mbox-folder.c (mbox_append_message): Change - the from line to be "\nFrom ..." always, so no need to - check/append a \n to messages. - (mbox_append_message): Open the output stream with append mode - [assuming this is more efficient than seeking to the end] - And dont prepend \n on the From line if its the first in the - mbox. - (mbox_append_message): Pass the offset of the real start of the - "From " line when we perform the update (which may != 'seek') - - * camel-mime-filter-charset.c (complete): Removed the terminating - NUL 'fix'. - - * camel-stream-filter.c (do_read): Added some debug. - (do_flush): And here. - (do_write): And here too. - (do_write): ARGH!!! ARGH! Ok, so the filter stream was writing a - different number of bytes than the requester was asking it to - write (because of filtering, of course!). So instead of returning - the true number of written bytes, we'll return what they asked us - to write - unless there is an error in which case we return -1. - - * camel-mime-utils.c (base64_encode_close): Sigh, forgot to make - it unsigned. I think this is actually a gcc bug as (48 >> 2) - somehow ended up negative, when it obviously should not, even if - the data load was signed. - -2000-11-03 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-url.c: Undo my incorrect fix - I misunderstood danw - - sorry! - -2000-11-03 Dan Winship <danw@helixcode.com> - - * providers/pop3/camel-pop3-store.c (camel_pop3_store_expunge): - Unbreak this. - -2000-11-03 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-url.c (camel_url_to_string): If show_pass, then base64 the - password before writing it to the output string. - (camel_url_new): Assume password has been base64 encoded and - decode accordingly. - -2000-11-03 Dan Winship <danw@helixcode.com> - - * camel-provider.h: Add an "url_flags" field to CamelProvider. - Move the CAMEL_SERVICE_URL_* defines here and remove the SERVICE_ - part of the name. - - * camel-service.h: Remove CAMEL_SERVICE_URL_* flags and - service->url_flags field. - - * camel-service.c (check_url, get_path): Get URL flags from - service->provider, update for changed flag names. - - * providers/*/camel-*-provider.c: Add URL flags to provider - structures. - - * providers/*/camel-*-{store,transport}.c, camel-remote-store.c: - Remove service->url_flags initialization. - -2000-11-02 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c (get_folder_info): Quote - foldernames when sending to the IMAP server because the folder - name might contain spaces. - -2000-11-02 Not Zed <NotZed@HelixCode.com> - - * Merged in camel-incremental-branch. - -2000-11-01 Dan Winship <danw@helixcode.com> - - * providers/imap/camel-imap-store.c (get_folder_info): Remove old - subbed folders from hash table after freeing them. - - * providers/imap/camel-imap-folder.c (imap_get_full_name): Deal - correctly with namespace == "" - -2000-11-01 Gediminas Paulauskas <menesis@delfi.lt> - - * camel-charset-map.c, camel-charset-map-private.h: synced all charsets - with ones found in libunicode. Just include more "iso/*.h" and rebuild - ...private.h with this. - -2000-10-31 Dan Winship <danw@helixcode.com> - - * camel-service.c (service_disconnect): Add a new argument, clean, - that says whether or not to try to disconnect cleanly. - - * camel-remote-store.c (remote_send_string, remote_send_stream, - remote_recv_line): disconnect uncleanly on failure to prevent - infinite loops when providers would normally send commands from - disconnect(). Remove some unneeded CamelException goo. - - * providers/smtp/camel-smtp-transport.c (smtp_disconnect): - * providers/pop3/camel-pop3-store.c (pop3_disconnect): - * providers/nntp/camel-nntp-store.c (nntp_store_disconnect): - * providers/imap/camel-imap-store.c (imap_disconnect): Don't send - QUIT/LOGOUT if !clean. - -2000-10-30 Dan Winship <danw@helixcode.com> - - * providers/imap/camel-imap-auth.c: New file with code for IMAP - authentication mechanisms. (Currently just krb4, and without - integrity/privacy protection). - - * providers/imap/Makefile.am: Add camel-imap-auth.[ch] and krb4 - CFLAGS/LDFLAGS - - * providers/imap/camel-imap-store.c (connect_to_server): Split out - from imap_connect. Just does the basic connect and CAPABILITY - check. Redo the CAPABILITY code more robustly. - (query_auth_types_connected): Do this right rather than punting to - query_auth_types_generic. Check for KERBEROS_V4 if compiled with - krb4 support. - (query_auth_types_generic): Mention KERBEROS_V4 if compiled with - krb4 support. - (imap_connect): Use connect_to_server(). - - * camel-mime-utils.c (base64_encode_step, base64_encode_close): - Take an additional argument, "break_lines", saying whether or not - to add '\n's to the output. - - * camel-multipart.c (set_boundary): - * camel-mime-filter-basic.c (filter, complete): Update for base64 - api change. - -2000-10-29 Dan Winship <danw@helixcode.com> - - Improved IMAP namespace handling: leave the namespace in the - folder names rather than constantly prepending it and stripping it - off. Also some subscription fixes. - - * camel-store.c (camel_folder_info_build): Fix for the case where - @top isn't in @folders. - - * providers/imap/camel-imap-folder.c (camel_imap_folder_new): Add - a "short_name" argument rather than figuring it out ourselves. - (imap_get_full_name): Implementation of CamelFolder::get_full_name - that strips off namespace so the user doesn't have to see it. - (imap_append_message, imap_copy_message_to, imap_move_message_to): - Use folder->full_name rather than calling - camel_imap_store_get_folder_path. - - * providers/imap/camel-imap-utils.c (imap_parse_list_response): - Update this: make @flags a bitmask and @sep a char rather than a - string. Make all of the out arguments optional. Handle literals in - the server response. - - * providers/imap/camel-imap-store.c (imap_connect): Do a better - job of getting the correct dir_sep for the namespace we're using. - Construct a base_url here that will be used by get_folder_info. - (camel_imap_store_folder_path): Removed - (imap_folder_exists): Add an argument to return the short name of - the folder (parsed out of the LIST response). Update for - imap_parse_list_response change. - (get_folder): Update for the various other changes. - (get_folder_info): Update for the various other changes. Be more - consistent about the returned layout: put everything underneath - the "namespace" directory, including INBOX, even if it doesn't - belong there. Don't destroy the list of subscribed folders until - we've actually gotten the new list. - (folder_subscribed, subscribe_folder, unsubscribe_folder): Use - folder_name directly rather than camel_imap_store_folder_Path. - - * providers/imap/camel-imap-command.c (camel_imap_command): Update - for folder name changes. - -2000-10-29 Dan Winship <danw@helixcode.com> - - * camel.h: Remove md5-utils.h include since it's not part of Camel - any more. - - * camel-charset-map.c: Kill some warnings. - - * providers/nntp/camel-nntp-grouplist.c - (camel_nntp_get_grouplist_from_file, camel_nntp_grouplist_save): - Clean up warnings about time_t casts. - - * providers/smtp/camel-smtp-transport.c: Remove unused md5-utils.h - include. - - * providers/pop3/camel-pop3-store.c: Undefine the "_" macro - defined by krb4's des.h when compiling with krb support. - Fix md5-utils.h include. - -2000-10-27 Dan Winship <danw@helixcode.com> - - * camel-mime-utils.c (header_param_list_format_append): Only quote - Content-type parameters when the quoting is mandatory, and deal - with embedded quotes/backslashes when quoting. - -2000-10-27 <jpr@helixcode.com> - - * providers/pop3/Makefile.am: Tidy up build - - * providers/smtp/Makefile.am: ditto - - * Makefile.am: Move md5-utils.[hc] to e-util because the - addressbook is going to use md5 hashes for pilot syncing. - Maybe the calendar conduits as well because this is a good idea - Chris had. - -2000-10-26 Kjartan Maraas <kmaraas@gnome.org> - - * camel-exceptions-list.def: Add newline to kill warnings. - -2000-10-25 Dan Winship <danw@helixcode.com> - - * providers/imap/camel-imap-store.c (get_folder_info): Fix folder - listing code infinite loop. - - * camel-store.h: Add a "parent" field to CamelFolderInfo. - - * camel-store.c (camel_folder_info_build): Deal with "parent" - (camel_store_folder_subscribed, camel_store_subscribe_folder, - camel_store_unsubscribe_folder): Add g_return_if_fails checking - that the folder supports subscriptions. - - * providers/imap/camel-imap-store.c (folder_subscribed, - subscribe_folder, unsubscribe_folder): Remove "+ 1"s since the - mail subscribe UI won't prepend / to the folder names now. - (get_folder_info): Clear the "parent" field of the folderinfos - when removing an empty top level. - - * providers/nntp/camel-nntp-store.c (nntp_store_folder_subscribed, - nntp_store_subscribe_folder, nntp_store_unsubscribe_folder): - Remove "+ 1"s since the mail subscribe UI won't prepend / to the - folder names now. - -2000-10-24 Chris Toshok <toshok@helixcode.com> - - * providers/imap/camel-imap-store.h: add subscribed_folders. - - * providers/imap/camel-imap-store.c (camel_imap_store_class_init): - fill in vtable entries for subscription functions. - (camel_imap_store_finalize): new function, so we can free up our - subscribed_folders hashtable. - (camel_imap_store_init): set CAMEL_STORE_SUBSCRIPTIONS in the - CamelStore flags, and create our subscribed_folders hashtable. - (camel_imap_store_get_type): camel_imap_store_finalize is our - finalize function. - (get_folder_info): if we're looking at subscribed_only, clear out - the subscribed_folders hashtable, use LSUB instead of LIST, and - insert folder paths (prepended by their namespace if there is one) - into subscribed_folders. INBOX subscription support needs work, - since we always show it, regardless of it's subscribed state. - (folder_subscribed): new function. just look up the folder_path - in the hashtable. - (subscribe_folder): new function. use the imap SUBSCRIBE command, - and if successful add it to the hashtable. - (unsubscribe_folder): new function. use the imap UNSUBSCRIBE - command, and if successful remove it from the hashtable. - -2000-10-24 Dan Winship <danw@helixcode.com> - - * providers/imap/camel-imap-store.c (get_folder_info): Fill in the - message_count and unread_message_count flags (if !fast). - -2000-10-23 Dan Winship <danw@helixcode.com> - - * camel-object.h: #include gnome-i18n.h (and gnome-defs.h since - the former depends on it.) - - * *: Add lots of _() and N_(). - -2000-10-23 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/Makefile.am (libcamelnntpinclude_HEADERS): add - camel-nntp-types.h. - -2000-10-23 Dan Winship <danw@helixcode.com> - - * providers/imap/camel-imap-command.c (imap_read_untagged): Fix a - "how could this have been working before" memory overrun bug - found by Vlad. - - * camel-op-queue.[ch], camel-thread-proxy.[ch]: These should have - gone away a long time ago. - -2000-10-20 Chris Toshok <toshok@helixcode.com> - - * providers/Makefile.am (SUBDIRS): re-enable the nntp provider. - -2000-10-20 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/camel-nntp-store.c (build_folder_info): add - function to build a tree from the nntp group names (using '.' as a - heirarchy separator.) #ifdefed INFO_AS_TREE only. - (build_folder_info_from_grouplist): if INFO_AS_TREE is selected, - call build_folder_info instead of appending a new CamelFolderInfo - to our list. - (ensure_news_dir_exists): use e_mkdir_hier instead of failing if a - parent directory (~/evolution/news generally) isn't there. - -2000-10-19 Chris Toshok <toshok@helixcode.com> - - * camel-folder-search.c: #include <sys/types.h> before <regex.h> - -2000-10-19 Dan Winship <danw@helixcode.com> - - * providers/imap/camel-imap-utils.c (imap_parse_list_response): - Fix a bug with "INBOX" (or anything else with NIL hierarchy - separator) as the namespace. - - * providers/imap/camel-imap-folder.c (imap_refresh_info): Emit - message_changed and folder_changed as appropriate. - -2000-10-19 Dan Winship <danw@helixcode.com> - - * camel-folder.c (camel_folder_refresh_info): Update comment here - so refresh_info isn't just for reconnects any more. Make the - default implementation a no-op rather than an error. - - * providers/nntp/camel-nntp-folder.c: Move refresh_info impl into - camel_nntp_folder_new, since it would have leaked memory and not - done anything useful if it was called later. - - * providers/mbox/camel-mbox-folder.c: Remove no-longer-necessary - refresh_info impl. - - * providers/imap/camel-imap-folder.c (camel_imap_folder_changed): - Update imap_folder->exists, but don't actually load the new - messages. This is a temporary workaround to deal with the IMAP - provider stealing the message list focus at annoying times. - (imap_copy_message_to, imap_move_message_to): Emit a - folder_changed by hand, for now. - -2000-10-19 Ettore Perazzoli <ettore@helixcode.com> - - * providers/imap/Makefile.am (libcamelimapinclude_HEADERS): Add - `camel-imap-stream.h'. - - * Makefile.am (libcamelinclude_HEADERS): Add `camel-charset-map.h' - and `camel-charset-map-private.h'. - -2000-10-18 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-mime-part.c (camel_mime_part_set_description): The correct - fix this time - the description should be encoded here and not in - the camel-medium layer. - -2000-10-30 Not Zed <NotZed@HelixCode.com> - - * camel-folder.c (camel_folder_change_info_add_update): Fixed the - changeset logic, which was completely wrong. - -2000-10-27 Not Zed <NotZed@HelixCode.com> - - * camel-mime-utils.c (quoted_encode_step): Removed is_blank() stuff. - (header_decode_init): When we set the 'space' bit, dont clear all - the others. - (quoted_encode): Put back the safemask. Yes we totally need it, - see rfc 2047 section 5, parts (1) and (3). - (CHARS_PSPECIAL): Remove '=' and '_' from the list of allowed - characters (this is an allowed list, not a not-allowed list, like - the ESPECIAL). - (camel_mime_special_table): Updated for fixes to definitions. - (CHARS_ESPECIAL): Added '_' to list of characters that should be - encoded. - -2000-10-26 Not Zed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-summary.c (camel_mbox_summary_update): - Use the new camel_folder_change_info_* stuff to build the update - diff, rather than doing it ourselves. - - * camel-folder.c (camel_folder_change_info_add_source): Add a - 'source' list, used to create change lists. - (camel_folder_change_info_add_source_list): Add a list of uid's, - convenience function. - (camel_folder_change_info_add_update): Add a uid to the list of - uid's in the new updated list. - (camel_folder_change_info_add_update_list): Add a bunch of uid's - at once for the same purpose. - (camel_folder_change_info_build_diff): Take the source list, the - update list, and find the differences, building on the added or - removed list as appropriate. - -2000-10-20 Not Zed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-summary.c (removed_uids): REnamed from - add_uid. - (camel_mbox_summary_update): Oops, fix the reversed logic for - determining the uid changesets. - - * camel-folder.c (message_changed): Oops, we want to change the - uid, not add it. - -2000-10-19 Not Zed <NotZed@HelixCode.com> - - * providers/mh/camel-mh-summary.c (camel_mh_summary_sync): Added a - change list argument, and add expunged uid's to it. - - * providers/mh/camel-mh-folder.c (mh_init): Setup the change list. - (mh_finalize): And free it. - (mh_sync): Track changes, and send a folder_changed signal as - appropriate. - (mh_expunge): Likewise. - (mh_append_message): Add the new uid to the change list and - trigger a folder_changed event. - - * providers/mbox/camel-mbox-folder.c (camel_mbox_folder_new): - Setup a mbox list of changes structure. - (mbox_finalize): And free it. - (mbox_expunge): Include the change list with the folder_changed - event, and clear it off. - (mbox_sync): And the same for when we are just syncing the folder. - (mbox_append_message): And do the same here, after we've updated - the folder. - - * providers/mbox/camel-mbox-summary.c - (camel_mbox_summary_build_from): Use gmtime_r to get the time - thread-safely. - (camel_mbox_summary_sync): Added a changeinfo argument. Add any - removed or changed messages to the changelists as appropriate. - (camel_mbox_summary_update): Added a changeinfo argument. - Genereate a list of added/removed uid's based on the difference - before and after rebuilding the summary. - - * camel-folder.c (camel_folder_change_info_new): - (camel_folder_change_info_add_uid): - (change_info_add_uid): - (camel_folder_change_info_remove_uid): - (camel_folder_change_info_change_uid): - (change_info_clear): - (camel_folder_change_info_clear): - (camel_folder_change_info_free): - (change_info_cat): - (camel_folder_change_info_cat): Bunch of utility functions for - working with change info lists. - (camel_folder_init): Init the change info list. - (camel_folder_finalize): And free it. - (thaw): Changed to pass through a list of changes, or to get the - changed message uids from the camelfolderchangeinfo struct, and - reset it. - (folder_changed): Add the changed lists to the frozen change list - if we are frozen. - (message_changed): Add the message to the changed list if we are - in the frozen state. - - * camel-folder.h (CamelFolderChangeInfo): New structure to hold - information for the folder_changed event. - -2000-10-18 Ettore Perazzoli <ettore@helixcode.com> - - * camel-mime-filter-charset.c (complete): Put a zero at the start - of the outbuf. - -2000-10-18 Not Zed <NotZed@HelixCode.com> - - * camel-mime-part.c (add_header): No, we must not encode the - headers here. These interfaces ARE raw interfaces as they are - defined in camel_medium. Also removed a bogus/meaningless FIXME. - (set_header): Likewise here, we must not. - (process_header): Removed another bogus comment. - - * camel-object.c (shared_is_of_type): Comment out the spitting of - a big warning when we're trying to determine types from code. - - * providers/mbox/camel-mbox-summary.c - (message_info_new_from_parser): Only call ibex funcitons if we - have an index. - - * providers/mh/camel-mh-summary.c (camel_mh_summary_add): Only - call ibex functions if we have an index. - (remove_summary): Likewise. - (camel_mh_summary_check): Likewise. - - * providers/nntp/camel-nntp-store.c (nntp_store_get_folder): - get_folder -> flags argument. - - * providers/vee/camel-vee-store.c (vee_get_folder): create->flags. - - * providers/pop3/camel-pop3-store.c (get_folder): Changed create - -> flags. - - * providers/imap/camel-imap-store.c (get_folder): Added flags - argument. - - * providers/mh/camel-mh-folder.c (camel_mh_folder_new): Added - flags argument, and fixed code appropriately. - - * providers/mh/camel-mh-store.c (get_folder): Added flags argument. - - * camel-folder-search.c (message_body_contains): Perform a regex - match on the contents of messages. This wont quite work yet as - message contents are encoded when written to a stream. - (build_match_regex): Converts a number of strings into a regex - matching pattern, escaping special chars. - (match_message): match a single message from a folder, by uid. - Slow. - (search_body_contains): Changed to support matching where no index - is supplied. Matches are performed by retrieving message - contents, etc. - () WTF? camel should not be including any widget headers. - - * providers/mbox/camel-mbox-folder.c (camel_mbox_folder_new): - Added flags argument. - (mbox_refresh_info): Changed into a NOP, the refresh info code - moved into the new function. - (camel_mbox_folder_new): If we have an index requested, build one, - otherwise, remove an old one, or just dont do anything. - - * providers/mbox/camel-mbox-store.c (get_folder): Changed create - to flags, changed code to suit. - - * camel-store.c (camel_store_get_folder): Changed create to flags. - (get_folder_internal): And here. - (get_folder): And here too. - - * camel-store.h (camel_store_get_folder): Change the create - argument to be a flags argument. - -2000-10-17 Dan Winship <danw@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_refresh_info): Remove - cached info at the end of the summary when the folder shrinks - between sessions. Also remove an untrue comment. - (camel_imap_folder_new): Move the summary creation to after the - folder selection again, since it depends on the uidvalidity - having been set. - - * providers/imap/camel-imap-store.c (get_folder): Fix up - summary_file to not include the namespace twice. - -2000-10-17 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-mime-part.c (set_header): Encode the header value. - (add_header): Same. - -2000-10-17 Not Zed <NotZed@HelixCode.com> - - * camel-mime-filter.c: Added some malloc check debugging stuff. - - * camel-mime-parser.c - (struct _header_scan_state): Removed top_part, top_start, and - pending. I can't even remember why they were there, and they're - not used anymore. - - * camel-mime-filter-basic.c (filter): Forgot to up the space here - too. - -2000-10-14 Not Zed <NotZed@HelixCode.com> - - * camel-mime-filter-basic.c (complete): Ok, so we hit a fixme, 3x - just wasn't enough for some sequences. - -2000-10-16 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-command.c - (imap_read_response): Don't imap_next_word(respbuf + 2), instead - use imap_next_word(respbuf) or else we'll skip over the second - token. - -2000-10-16 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-command.c - (camel_imap_response_extract): Don't free 'resp' as it doesn't - point to the beginning of the allocated data, instead free - response->untagged->pdata[i]. Also, if '*resp' is equal to a space - character, then set resp = imap_next_word (resp) rather than - expecting resp++ to work (there's a list broken IMAP daemons that - like to put extra spaces between tokens). - (imap_read_response): Don't expect 'respbuf+2' to be where the - untagged number response to start (see above fix for an - explanation). - -2000-10-16 Chris Toshok <toshok@helixcode.com> - - * camel-service.c (get_path): when using the construct (flags & - CAMEL_SERVICE_URL_NEED_*) make sure to do ((flags & - CAMEL_SERVICE_URL_NEED_*) == CAMEL_SERVICE_URL_NEED_*) - (check_url): same. - -2000-10-16 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c (imap_disconnect): Only send - the LOGOUT command if the store is connected. - (imap_connect): Set the 'connected' state to TRUE when we - successfully connect. - (get_folder_info): if (!topfi), 'topfi' was allocated but then - 'fi' was set. I think Dan meant to set topfi since fi is an - uninitialized value at this point. - - * providers/imap/camel-imap-command.c (imap_read_response): Check - for the untagged BYE response and set the 'connected' state to - FALSE if we receive the BYE response. Return NULL if we get a BYE - response. - -2000-10-16 Dan Winship <danw@helixcode.com> - - * providers/imap/camel-imap-store.c (get_folder_info): Deal with - the possibility of not getting a LIST response back for the top - level. - -2000-10-12 Dan Winship <danw@helixcode.com> - - * providers/imap/camel-imap-summary.c: Simple subclass of - CamelFolderSummary that also keeps a UIDVALIDITY value (and - doesn't, for the moment, build content info). - - * providers/imap/camel-imap-folder.c: - (various): Use a CamelImapSummary to store/fetch summary info. - (camel_imap_folder_new): Take a path to a file to use for the - summary. Set the folder's permanent_flags correctly according to - the server response. Read in the summary (checking the - UIDVALIDITY) and update it if it's out of date. - (imap_refresh_info): Just fetch UIDs and flags. If the UIDs all - match, update the flags as needed and be done with it. Otherwise, - delete messages that have been expunged from the server and fetch - full summary info for any new messages. - (imap_sync): Save the summary to disk. - (imap_update_summary): Renamed from imap_get_summary_internal. Can - now be told to get summary for only a subset of messages. Use - camel-mime-utils functions rather than rolling our own header - parsing. - (imap_get_message_info_internal): Merged into imap_update_summary. - (imap_set_message_flags): Don't marked the message FOLDER_FLAGGED - if we're not actually changing the value of any of the flags. - (camel_imap_folder_changed): Deal with EXISTS rather than RECENT. - - * providers/imap/camel-imap-store.c (imap_connect): Call - camel_session_get_storage_path and save the value. - (get_folder): Create a local directory to store summary - information and pass a summary file name to camel_imap_folder_new. - Don't call camel_folder_refresh_info from here any more since - camel_imap_folder_new does it again. - - * providers/imap/camel-imap-command.c (camel_imap_command): Add a - special case to this to make it possible to get the repsonses from - a SELECT and still have store->current_folder be updated - correctly. - (imap_read_response): parse EXISTS rather than RECENT - - * camel-session.c (camel_session_get_storage_path): Use - e_mkdir_hier. - - * camel-folder-summary.c (camel_folder_summary_remove_index): New - function. - - * camel-mime-utils.c (header_raw_append_parse): fix this. - (camel-mime-parser.c doesn't use this code because of the MEMPOOL - optimization, so nothing was ever actually calling it before.) - -2000-10-11 Not Zed <NotZed@HelixCode.com> - - * camel-mime-part.h (struct _CamelMimePart): Removed - temp_message_buffer, and content_input_stream fields which seem to - have come from nowhere, and are unused. - - * camel-mime-utils.c: Added a note about touching this file. - Nobody is to touch it without asking me first. That goes for you - too Jeff. - (header_decode_text): In what way is this broken? - -2000-10-10 Not Zed <NotZed@HelixCode.com> - - * providers/imap/camel-imap-folder.c (imap_get_summary_internal): - Fix camel_summary_* function rename - (imap_get_message_info_internal): Likewise. - - * camel-mime-parser.c (camel_mime_parser_finalise): Fixed a spelling mistake. - - * camel-folder-summary.c (camel_summary_format_address): Uh, why - do we encode and then decode here ... sigh. This is not the way - to fix this. - (camel_folder_summary_format_address): Renamed to a proper name, - this was only supposed to be a private function. - (camel_folder_summary_format_string): Likewise. Oh i see why it - was made public, code reuse by cut & paste. Joy. - -2000-10-11 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/camel-nntp-store.c (nntp_store_unsubscribe_folder): remove the leading '/'. - (nntp_store_subscribe_folder): same. - (nntp_store_folder_subscribed): same. - -2000-10-11 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_move_message_to): Quote - the mailbox name as it may contain spaces. - (imap_copy_message_to): Same. - -2000-10-10 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/camel-nntp-store.c - (build_folder_info_from_grouplist): fill in message_count and - unread_message_count properly. - - * providers/nntp/camel-nntp-newsrc.h: reformat. - - * providers/nntp/camel-nntp-grouplist.c - (camel_nntp_get_grouplist_from_file): remove spew. - - * providers/nntp/camel-nntp-newsrc.c - (camel_nntp_newsrc_group_get_num_articles_read): new function. - (camel_nntp_newsrc_group_get_highest_article_read): robustification. - -2000-10-10 Joe Shaw <joe@helixcode.com> - - * providers/imap/camel-imap-store.c - (parse_list_response_as_folder_info): Check before dereferencing the - sep pointer. - -2000-10-10 Jacob "Ulysses" Berkman <jacob@helixcode.com> - - * camel-*.c: teach camel about "its" vs. "it's" - -2000-10-09 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/camel-nntp-store.c (finalize): write out the - newsrc. - (nntp_store_get_name): if @brief, just return host. - - * providers/nntp/camel-nntp-newsrc.c: robustification and bug - fixes. - -2000-10-06 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-folder-summary.c (camel_summary_format_address): Decode - the resulting string. - -2000-10-06 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/camel-nntp-grouplist.c: new file. - - * providers/nntp/camel-nntp-grouplist.h: new file. - - * providers/nntp/camel-nntp-types.h: new file. - -2000-10-06 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-mime-utils.c (quoted_encode): Fix so that we don't encode - every single char in the word. Also, do we need a safemask? I - don't see why we would. - (header_encode_string): Don't strip off the last char!! - -2000-10-06 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/Makefile.am (libcamelnntpinclude_HEADERS): add - camel-nntp-grouplist.h - (libcamelnntp_la_SOURCES): add camel-nntp-grouplist.c - - * providers/nntp/camel-nntp-provider.c: add our own hash functions - for nntp urls. - - * providers/nntp/camel-nntp-newsrc.c - (camel_nntp_newsrc_group_is_subscribed): new function. - (camel_nntp_newsrc_subscribe_group): new function. - (camel_nntp_newsrc_unsubscribe_group): new function. - - * providers/nntp/camel-nntp-newsrc.h: add prototypes for - _group_is_subscribed, _subscribe_group, and _unsubscribe_group. - - * providers/nntp/camel-nntp-store.c - (build_folder_info_from_grouplist): new function. - (nntp_store_get_folder_info): add subscribed_only_parameter. if - it's FALSE, load the grouplist and call - build_folder_info_from_grouplist. - (nntp_store_folder_subscribed): implement. - (nntp_store_subscribe_folder): implement. - (nntp_store_unsubscribe_folder): implement. - (camel_nntp_store_init): add CAMEL_STORE_SUBSCRIPTIONS to the - store's flags. - - * providers/mh/camel-mh-store.c (get_folder_info): add - subscribed_only parameter. - - * providers/mbox/camel-mbox-store.c (get_folder_info): add - subscribed_only parameter. - - * providers/imap/camel-imap-store.c (get_folder_info): add - subscribed_only parameter. - - * camel-store.c (camel_store_supports_subscriptions): new function. - (camel_store_folder_subscribed): new function. - (camel_store_subscribe_folder): new function. - (camel_store_unsubscribe_folder): new function. - - * camel-store.h: add prototypes and virtual functions for the - subscribe implementation. also, add a subscribed_only argument to - camel_store_get_folder_info. - -2000-10-05 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-mime-utils.c (header_address_list_format_append): Encode - the name part of the address and don't quote the name. - (header_decode_text): Rewrote from scratch, the old code was badly - broken. - -2000-10-05 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-mime-message.c (camel_mime_message_set_reply_to): Use the - camel_address_encode function again. - (camel_mime_message_set_from): Same. - -2000-10-05 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-mime-utils.c (quoted_encode_step): Modified to not encode - space chars in the middle of a line. - (isblank): New macro if we're not on a system with the GNU isblank - extension. - - * camel-mime-message.c (camel_mime_message_set_from): Reversed my - changes, don't header_encode_phrase - it generates broken headers. - (camel_mime_message_set_reply_to): Same. - -2000-10-04 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/camel-nntp-utils.c (camel_nntp_get_headers): - revert to old method (only use XOVER if OVER is supported.) - - * providers/nntp/camel-nntp-store.c - (camel_nntp_store_get_overview_fmt): handle the case where the - OVER extension isn't listed but LIST OVERVIEW.FMT works (again, - INN 2.2). enable the OVER extension in this case. - -2000-10-04 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/camel-nntp-utils.c (get_XOVER_headers): return a - gboolean so we can tell if this command worked. we can't key off - the OVER extension being present because at least one server (INN - 2.2) doesn't report the OVER extension but implements the XOVER - command. This could of course just be because I'm a loser for - thinking they were related in the first place. - (camel_nntp_get_headers): always try XOVER first, and if it fails - revert to the slow method. - -2000-10-04 Dan Winship <danw@helixcode.com> - - * providers/mbox/camel-mbox-store.c (get_folder): Fix a case where - a variable was free'd and then possibly used in an error message. - -2000-10-04 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/camel-nntp-provider.c - (camel_provider_module_init): news: -> nntp:. - -2000-10-04 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/camel-nntp-store.c (nntp_store_get_folder_info): - use "nntp:" instead of "news:" since "news:" urls aren't supposed - to have host/user/port info in them. also, if there's a user - defined in the url, put it in the urls for our folders. - -2000-10-04 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/camel-nntp-auth.c (camel_nntp_auth_authenticate): - borrow some code from the imap provider to query the user for - their password, and pass the user/passwd to nntp. be extra - paranoid and zero out the password before freeing it. - - * providers/nntp/camel-nntp-store.c (camel_nntp_store_init): add - ALLOW_USER/ALLOW_PASSWORD/ALLOW_AUTH to the url flags. - (nntp_store_query_auth_types_generic): return our list of - auth_types. - (nntp_store_query_auth_types_connected): broken, return same as in - query_auth_types_generic. - -2000-10-04 Dan Winship <danw@helixcode.com> - - * providers/imap/camel-imap-store.c (imap_connect): IMAP4 - (pre-rev1) doesn't support the 'LIST "" ""' idiom, so don't use - it. Just assume the dir_sep is '/'. Shrug. - -2000-10-04 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-mime-message.c (camel_mime_message_set_reply_to): Use - header_encode_phrase instead. - (camel_mime_message_set_from): Same. - -2000-10-04 Not Zed <NotZed@HelixCode.com> - - * camel-mime-utils.c (header_content_type_is): Handle the case - where ct != NULL, but type and subtype are, and also match that - against text/plain. - - * camel-folder-summary.c: Bump summary file version. - (message_info_save): Save the size from the messageinfo. - (message_info_load): Load the size from the summary file. - (message_info_load): Fixed up the time_t saving/loading. There - was a reason the warning was left there ... obviously nobody could - read the comment "/* warnings, leave them here */", why do i even - bother. - (camel_folder_summary_decode_time_t): Decode a time_t value from - the summary file. - (camel_folder_summary_encode_time_t): Encode a time_t value to the - summary file. - -2000-10-03 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-command.c (camel_imap_command): Quote - the mailbox name when sending a SELECT request otherwise mailboxes - with spaces in their names will cause problems. - - * camel-mime-message.c (camel_mime_message_set_reply_to): encode - before setting. - (camel_mime_message_set_from): Same. - -2000-10-03 Dan Winship <danw@helixcode.com> - - * providers/imap/camel-imap-command.c: New file containing - camel_imap_command and friends. Major camel_imap_command rewrite - to remove duplicated code, make the parsing of literals be - more safe/correct, deal with RECENT/EXPUNGE responses more - consistently, and make it possible to implement the AUTHENTICATE - command. - - * providers/imap/camel-imap-utils.c (imap_parse_nstring): New - function, to parse an IMAP "nstring". - - * providers/imap/camel-imap-store.c: Move command stuff to - camel-imap-command.c. Update for camel_imap_command changes. - - * providers/imap/camel-imap-folder.c: Update for - camel_imap_command changes. - (imap_append_message): CRLF filter the message before sending it. - - * providers/imap/Makefile.am: Add camel-imap-command.[ch], remove - camel-imap-stream.[ch] for now. - -2000-10-02 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-mime-message.c (camel_mime_message_has_8bit_parts): New - convenience function to determine if there are any 8bit mime parts - in a mime message. - (camel_mime_message_encode_8bit_parts): New convenience function - to recursively reencode all 8bit mime parts to either - quoted-printable or base64 depending on which would be the best - encoding for that part. - - * providers/smtp/camel-smtp-transport.c (smtp_data): If the mime - message contains 8bit parts and the server doesn't support 8bit - transfers, reencode those parts before proceding with the send. - (smtp_mail): If the mime message contains 8bit parts and the - server supports the 8BITMIME extension to SMTP, notify the server - that we'll be sending it 8bit mime parts. - (_send_to): Find out if the message contains 8bit parts. - -2000-10-02 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/smtp/camel-smtp-transport.c (_send_to): Use the - CamelInternetAddress parser. - (smtp_get_email_addr_from_text): deprecated. - -2000-10-02 Dan Winship <danw@helixcode.com> - - * camel-provider.h: Remove default_ports. - - * camel-remote-store.c (remote_connect): Get default_port from - CamelRemoteStore rather than CamelProvider. - - * providers/{imap,nntp,pop3}/camel-*-store.c: Initialize - CamelRemoteStore::default_port - - * providers/*/camel-*-provider.c: Remove default_ports. - -2000-10-02 Dan Winship <danw@helixcode.com> - - * camel-folder.[ch]: Remove - camel_folder_{get,free}_subfolder_info, as we want to be able to - scan the whole subfolder tree without having to open any folders, - so this needs to be in CamelStore. Remove can_hold_folders and - can_hold_messages flags; things that don't hold messages are no - longer considered CamelFolders. - - * camel-folder-summary.[ch]: Remove CamelFolderInfo stuff. - - * camel-store.[ch]: Add camel_store_{get,free}_folder_info, as - well as camel_store_free_folder_info_full and ..._nop for default - implementations, and camel_folder_info_free and - camel_folder_info_build as convenience functions. Turn - CamelFolderInfo into a tree structure and also add an "url" - member. - - * providers/*/camel-*-folder.c: Remove subfolder_info and can_hold - stuff. - * providers/*/camel-*-store.c: Add folder_info stuff. - - * providers/imap/camel-imap-folder.c (imap_summary_free): Free the - summary elements with camel_message_info_free, not - camel_folder_info_free. Oops. - - * providers/imap/camel-imap-utils.c: const poison - -2000-09-28 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/smtp/camel-smtp-transport.c: Fixed some memory leaks. - (camel_smtp_transport_init): Initialize supports_8bit to FALSE. - (smtp_helo): If server supports 8bit, set supports_8bit to TRUE. - - * camel-transport.h (struct _CamelTransport): Added variable - gboolean supports_8bit (we'll need this eventually? - see bugzilla - bug #53) - - * providers/smtp/camel-smtp-transport.c - (smtp_get_email_addr_from_text): Ugh, no wonder people were - getting illegal seek warnings *sigh*. I guess I can only blame - myself for this one though :-( - -2000-09-28 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/smtp/camel-smtp-transport.c (_send_to): Don't send the - recipient data through smtp_get_email_addr_from_text - this is a - complete waste. In fact, we don't want to have to use that - function ever. - - * camel-internet-address.c, camel-address.c: Added some gtk-doc - comments. - -2000-09-28 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-mime-utils.c (header_encode_string): Make sure to add the - space char after an encoded word when the encoding is iso-8859-1. - -2000-09-28 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_get_message): When - getting a literal string response, don't include the \r\n after - the closing } (as in: "... {798}\r\n...") - - * providers/imap/camel-imap-stream.c (stream_read): Same. - -2000-09-28 Not Zed <NotZed@HelixCode.com> - - * camel-mime-utils.c (header_fold): New function to fold headers. - -2000-09-27 Not Zed <NotZed@HelixCode.com> - - * camel-mime-parser.c (folder_scan_header): If we had an empty - header, then it must be end of the headers too. - (folder_scan_init): No we dont need to init the outbuf with a nul - terminator. - - * camel-folder-summary.c (camel_folder_summary_set_uid): New - function to reset the uid to a higher value. - - * providers/mbox/camel-mbox-summary.c (camel_mbox_summary_sync): - "something failed (yo!)" what sort of crap is this? Fixed all the - indenting again, what wanker keeps running stuff through indent? - (message_info_new): Check the uid we loaded off the disk, if it - existed already, assign a new one. If it didn't then make sure - the nextuid is higher. - - * camel-charset-map.c: New file, used to build a large unicode - decoding mapping table, and use it to determine what is the - lowest charset a given word can be encoded with. Uses tables from - libunicode's source. - - * camel-internet-address.c (internet_encode): Use - header_phrase_encode to properly encode the fullname, as required. - refixed indenting. Who keeps doing that? - (camel_internet_address_find_address): Changed fatal return/warnings - into assertions. - - * camel-mime-utils.c (header_raw_append_parse): Check : explicitly - (removed from is_fieldname() macro). - (camel_mime_special_table): Changed to short, so we can represent - more bit types. - (quoted_encode): Take a mask of the safe chars for this encoding. - (header_address_decode): Removed a #warning that makes no sense - anymore. - (header_decode_date): Fixed the 'broken date' parser code, if it - ever decoded it it just threw away the result. - (header_encode_string): Use better charset matching for encoding - strings as well. - -2000-08-31 Not Zed <NotZed@HelixCode.com> - - * providers/mh/camel-mh-summary.c (camel_mh_summary_sync): Save - the index if we do a sync. - (camel_mh_summary_check): Save the index here too. Probably. - -2000-09-27 Dan Winship <danw@helixcode.com> - - * providers/imap/camel-imap-store.c (camel_imap_command_extended): - Return untagged data in a GPtrArray rather than a string, since it - saves processing time and is much easier to deal with for several - commands. Update for camel_imap_folder_changed change. - (camel_imap_fetch_command): Update for camel_imap_folder_changed - change. - (imap_connect, imap_folder_exists): Update for - camel_imap_command_extended change. - - * providers/imap/camel-imap-folder.c - (imap_get_message_count_internal, - imap_get_subfolder_info_internal, imap_search_by_expression): - Update for camel_imap_command_extended change. - - (imap_get_summary_internal, imap_get_message_info_internal): Use - camel_imap_fetch_command here now to get around the - camel_imap_command_extended change. - - (camel_imap_folder_changed): turn expunged into a GArray of ints - rather than a GPtrArray of strings representing ints. - -2000-09-26 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c - (imap_get_message_count_internal): Quote the folder name as it may - contain spaces. - (imap_get_subfolder_info_internal): Same. - - * providers/imap/camel-imap-utils.c (imap_parse_list_response): Do - proper unquoting for folder names. - (func_get_current_date): Implemented. - - * providers/imap/camel-imap-store.c - (imap_folder_exists): Quote the folder name as it may have spaces. - (imap_create): Same. - (check_current_folder): Same. - -2000-09-22 Dan Winship <danw@helixcode.com> - - * providers/imap/camel-imap-folder.c - (imap_get_subfolder_info_internal): The root folder's name is "", - not the namespace. - (camel_imap_folder_new): constify folder_name. - - * providers/imap/camel-imap-store.c (get_folder): Create the - folder with folder_name, not folder_path. - (camel_imap_command_preliminary): Don't free cmdid here. - -2000-09-21 Dan Winship <danw@helixcode.com> - - * providers/imap/camel-imap-utils.c (imap_create_flag_list): New - function to convert Camel flags to an IMAP flag_list. - (imap_parse_flag_list): Contrariwise. - - * providers/imap/camel-imap-store.c (camel_imap_command_*): Make - the @ret arg actually optional, as (mostly) documented. - (various): Don't pass "&result" to camel_imap_command_* if we're - just going to immediately free it. Don't record status if we're - not going to look at it. - - * providers/imap/camel-imap-folder.c: Likewise. - (imap_summary_free): Use camel_folder_info_free. - (imap_sync): Use imap_create_flag_list. Clear - CAMEL_MESSAGE_FOLDER_FLAGGED after syncing so we don't keep - re-syncing. - (imap_append_message): Use imap_create_flag_list. Don't leak the - memstream if the append fails. - (imap_move_message_to): Use camel_folder_delete_message rather - than doing it by hand. - (imap_get_summary_internal, imap_get_message_info_internal): Use - imap_parse_flag_list and header_raw_clear. - (camel_imap_folder_changed): Use camel_message_info_free. - -2000-09-21 Dan Winship <danw@helixcode.com> - - * providers/imap/camel-imap-store.c (get_folder_name): INBOX is - case-insensitive. - (get_root_folder_name): Make the root folder "" rather than "/". - (get_folder): Update for root folder name change. - (camel_imap_store_get_toplevel_dir): Removed. (Unused, unneeded.) - (camel_imap_store_folder_path): New function to turn a Camel - folder name into the corresponding namespaced IMAP path. - (imap_folder_exists): Make this take a store and a path rather - than a folder. - (imap_create): Likewise - (get_folder): Update for camel_imap_store_folder_path and other - changes. - (check_current_folder): Likewise. - - * providers/imap/camel-imap-folder.c: Change a bunch of CamelStore - variables to CamelImapStore (and add a few more) to prevent excess - gratuitous casting. Use camel_imap_store_folder_path where - appropriate. - (camel_imap_folder_new): Update for root folder name change. - -2000-09-19 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/smtp/camel-smtp-transport.c (smtp_data): Use the - linewrap filter to achieve full RFC0821 compliance. - - * camel-mime-filter-linewrap.[c,h]: New mime-filter to word-wrap. - -2000-09-19 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-internet-address.c (internet_encode): When encoding the - internet address, quote the name as the name may have commas or - any other token which may later confuse our address parser. - -2000-09-19 Dan Winship <danw@helixcode.com> - - * providers/imap/camel-imap-folder.c - (imap_get_subfolder_info_internal): Fix the case where INBOX - isn't returned in the folder listing. - -2000-09-19 Dan Winship <danw@helixcode.com> - - * camel-folder.c: (init): Removed - (camel_folder_init, camel_folder_construct): New object init - function and public object constructor to replace the old init - method in a more Gtk-like fashion. - - (get_parent_folder, camel_folder_get_parent_folder): Removed. No - CamelFolder subclass was ever setting the parent_folder member, no - code has ever needed to look at it, and fixing it would actually - be pretty hard. - - (get_subfolder_info, camel_folder_get_subfolder_info): Renamed - from ..._names. Deals in CamelFolderInfo now. - (free_subfolder_info, camel_folder_free_subfolder_info): Likewise. - - (get_subfolder, camel_folder_get_subfolder): Removed. - CamelFolderInfo contains the subfolder's full name, so this is - unnecessary now, and removing it lets us get rid of the - CamelFolder separator member, which is needed for the default - implementation of this function, but not otherwise needed for most - providers. - - Also, lots of code style fixes. - - * providers/*: Update CamelFolder subclasses for changes, although - none of them fill in the message counts in the CamelFolderInfo - yet. - -2000-09-18 Christopher James Lahey <clahey@helixcode.com> - - * camel-folder-search.c, camel-folder-search.h, - camel-remote-store.c, providers/imap/camel-imap-folder.c, - providers/imap/camel-imap-store.c: Fixed the #include lines to - deal properly with gal. - -2000-09-17 Dan Winship <danw@helixcode.com> - - * camel-folder-summary.h: update CamelFolderInfo - * camel-folder-summary.c (camel_folder_info_free): New function to - free the contents of a CamelFolderInfo - -2000-09-15 Dan Winship <danw@helixcode.com> - - * camel.c (camel_init): Set camel_verbose_debug to TRUE if - CAMEL_VERBOSE_DEBUG is set in the environment. - - * camel-remote-store.c (remote_send_line, remote_recv_line): only - log if camel_verbose_debug is TRUE. - -2000-09-14 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c (get_folder): Don't use - dir_sep as top-level directory, use "/". - - * providers/imap/camel-imap-folder.c (imap_expunge): Get rid of - unused variable. - -2000-09-13 Dan Winship <danw@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_expunge): Don't look at - the response of the command. camel_imap_command_extended() - processes EXPUNGE responses itself, so if we do it here too we - remove twice as many summary items as we should. - -2000-09-13 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c (imap_folder_exists): Rewrote - to take a third argument (gboolean *selectable) so that we can - find out if the folder is selectable or not as we look to see if - it exists. Also, don't use EXAMINE because that will not work on - non-selectable folders, so use LIST instead. - (get_folder): Check to see if the folder exists even vefore - calling imap_create as this will save time. If the folder does - exist, find out if it's selectable. Moved the call to refresh_info - here. - - * providers/imap/camel-imap-folder.c (imap_get_uids): Check for a - NULL summary. - (camel_imap_folder_new): Don't call refresh_info here - call it in - get_folder() because we don't know if this folder even exists on - the server yet! And even if it does, we don't know if it can hold - messages or not yet. - -2000-09-12 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-mime-parser.c (folder_scan_step): Make sure *datalength is - > 0 before calling camel_mime_filter_filter otherwise we will get - a segfault if the filter calls iconv(). - -2000-09-08 Christopher James Lahey <clahey@helixcode.com> - - * providers/nntp/camel-nntp-auth.c, - providers/nntp/camel-nntp-auth.h: Fixed a warning. - -2000-09-07 Dan Winship <danw@helixcode.com> - - * camel-session.c (camel_session_get_storage_path): Make this not - leak. - -2000-09-07 Dan Winship <danw@helixcode.com> - - * camel-session.c (camel_session_new): Make this take a path to a - directory that Camel can use for its own nefarious purposes. - (camel_session_get_storage_path): New function to return a path - that a service can use for its own nefarious sub-purposes. - - * camel-service.c (camel_service_get_path): New method (and - useful default implementation) to get a (relative) pathname - corresponding to the service. - -2000-09-06 Dan Winship <danw@helixcode.com> - - * providers/pop3/camel-pop3-store.c (connect_to_server): Make KPOP - work again. - -2000-09-06 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-mime-message.c (camel_mime_message_get_received_date): - Implemented (someone added these to camel-mime-message.h but never - implemented them!!) - though it may not be right. - (camel_mime_message_get_sent_date): Same. - -2000-09-05 Dan Winship <danw@helixcode.com> - - * camel-mime-part.c (camel_mime_part_get_filename): If a MIME part - has no Content-Disposition, but does have a "name" on the - Content-Type, return that as the filename. - (process_header): strstrip the Content-Description - -2000-09-05 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/camel-nntp-utils.c (get_OVER_headers): care about - response code. - (get_HEAD_headers): same. - (camel_nntp_get_headers): same. - - * providers/nntp/camel-nntp-store.h: get rid of - CAMEL_NNTP_OK/ERR/FAIL. - - * providers/nntp/camel-nntp-store.c - (camel_nntp_store_get_extensions): take CamelException arg and - pass along to camel_nntp_command. - (camel_nntp_store_get_overview_fmt): same. - (nntp_store_connect): convert to using constants in - camel-nntp-resp-codes.h - (nntp_store_get_folder): make use of camel_nntp_folder_new. - (camel_nntp_command_send_recv): new function to deal with auth - challenge. - (camel_nntp_command): split out most of this function into - camel_nntp_command_send_recv. also, return the actual response - code instead of CAMEL_NNTP_OK/ERR/FAIL. - - * providers/nntp/camel-nntp-resp-codes.h: new file. - - * providers/nntp/camel-nntp-folder.h: prototype for - camel_nntp_folder_new. - - * providers/nntp/camel-nntp-folder.c (camel_nntp_folder_new): new - convenience function. - (nntp_folder_get_message): care more about the actual response - code. - - * providers/nntp/Makefile.am (libcamelnntp_la_SOURCES): add - camel-nntp-auth.c. - (libcamelnntpinclude_HEADERS): add camel-nntp-auth.h. - - * providers/nntp/camel-nntp-auth.h: new file. - - * providers/nntp/camel-nntp-auth.c: new file. - -2000-09-05 Peter Williams <peterw@helixcode.com> - - * providers/imap/camel-imap-store.c (imap_folder_exists): Don't free the - result on error; the exception will have the relevant info. - - * providers/imap/camel-imap-folder.c (camel_imap_folder_new): Check for - exceptions here. - - * providers/imap/camel-imap-store.c (imap_connect): Check the exception - on the refresh_folders call. - - * providers/imap/camel-imap-store.h: Clean up some now-unused fields. - - * camel.c (camel_init): Call unicode_init again, now that libunicode - will not initialize itself twice. - -2000-09-02 Lauris Kaplinski <lauris@helixcode.com> - - * camel-folder-search (search_header_contains): Use e_utf8_strstrcase - -2000-09-01 Christopher James Lahey <clahey@helixcode.com> - - * providers/imap/camel-imap-utils.c: Removed some unused - functions. - -2000-09-01 Peter Williams <peterw@helixcode.com> - - * providers/nntp/camel-nntp-store.c (camel_nntp_command): Initialize - the statically-allocated CamelException so that it doesn't contain - junk data that camel_exception_set() may try to free. - (camel_nntp_store_get_extensions): Same. - (camel_nntp_store_get_overview_fmt): Same. - - * providers/pop3/camel-pop3-store.c (camel_pop3_command): Typo - fix (if (*ret) -> if (ret)). - - * providers/pop3/camel-pop3-store.c (pop3_connect): Set the - port # back to what was specified ASAP, so that the hash of - the URL doesn't change (which causes a failure in - service_cache_remove that leads to a segfault). - - * providers/imap/camel-imap-store.c (imap_connect): Clear the - exception after a failed LOGIN so that it doesn't pass through - to the upper level and make mail think that the login failed. - - * providers/pop3/camel-pop3-store.c (pop3_connect): As above. - -2000-08-31 Peter Williams <peterw@helixcode.com> - - * providers/pop3/camel-pop3-store.c (camel_pop3_store_get_type): - Implement POP3 with the CamelRemoteStore now. - (connect_to_server): Hack this a bit to get KPOP to work. Obey - the new connection semantics of the remote store (implicitly). - (query_auth_types_connected): Clear exceptions after attempts - to connect; the code at the bottom will catch hard errors. - Use camel_service_connect. - (camel_pop3_command): Take a CamelException; now, when an error - occurs, ret is set to NULL and the exception passes back the - appropriate information. - (pop3_get_response): Same as above. - (pop3_try_authenticate): Give camel_pop3_command its exception - and handle it properly. - (pop3_connect): Call the parent classfuncs. Don't disconnect - on error (done for us). - - * providers/pop3/camel-pop3-folder.c: Obey the camel_pop3_command - semantics. - - * camel-remote-store.c (remote_query_auth_types_connected): Don't - warn; just return NULL. - (remote_query_auth_types_generic): Same. - (remote_send_string): Filter out passwords in debugging output. - - * providers/pop3/camel-pop3-store.c (camel_pop3_store_init): Also - set the ALLOW_AUTH flag. - - * providers/imap/camel-imap-store.c (camel_imap_store_init): Same. - -2000-08-31 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/camel-nntp-store.c (camel_nntp_store_class_init): - remove get_folder_name. - (nntp_store_get_folder_name): remove. - -2000-08-31 Lauris Kaplinski <lauris@helixcode.com> - - * camel-mime-part.c (write_to-stream): Use filter only if we have one - -2000-08-31 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/camel-nntp-utils.c (get_OVER_headers): use - camel_remote_store_recv_line. - - * providers/nntp/camel-nntp-folder.c (nntp_folder_get_message): - use camel_remote_store_recv_line to build message. also, free our - buffer so we don't leak like mad. - - * providers/nntp/camel-nntp-store.c: - (camel_nntp_store_get_additional_data) remove. - (camel_nntp_store_get_extensions): use - camel_remote_store_recv_line. - (camel_nntp_store_get_overview_fmt): same. also, don't rely on - _get_additional_data anymore since it's easier to parse without. - (camel_nntp_command): use camel_remote_store_send_string and - camel_remote_store_recv_line. - - * providers/nntp/camel-nntp-store.h: CamelRemoteStore is the - parent class now. remove istream/ostream since CamelRemoteStore - takes care of that for us. also remove the prototype for - camel_nntp_store_get_additional_data. - - * providers/nntp/camel-nntp-newsrc.c (camel_nntp_newsrc_write): - make sure to clear dirty bit. - (camel_nntp_newsrc_read_for_server): don't worry about continually - trying to open the file - if it fails we just return an - unpopulated .newsrc file. - -2000-08-31 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/camel-nntp-newsrc.c - (camel_nntp_newsrc_read_for_server): make this a bit more robust. - try to create an empty .newsrc file for the server if we can't - open it for reading. also, don't allocate everything until we've - opened the file. - - * providers/nntp/camel-nntp-utils.c (get_OVER_headers): make use - of our overview field indices. - (camel_nntp_get_headers): only call get_OVER_headers if the - extension is present. warn if it's not - since get_HEAD_headers - needs work before it works. - - * providers/nntp/camel-nntp-store.c - (camel_nntp_store_get_extensions): new function - query the server - for it's extensions. - (camel_nntp_store_get_overview_fmt): new function - query the - server for the overview format and build our table of the indices - we care about. support the "full" suffix on fields. - (nntp_store_connect): call camel_nntp_store_get_extensions and - camel_nntp_store_get_overview_fmt. - - * providers/nntp/camel-nntp-store.h: add codes for extensions - found on news.mozilla.org. only one that we care about is OVER. - also, add CamelNNTPOverField and an enum of the overview fields - that we care about. - -2000-08-31 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-utils.c (imap_translate_sexp): - Reimplemented. It should now work correctly for most possible - VFolder rules. - -2000-08-31 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c (camel_imap_command_extended): - Don't save any exceptions caused by camel_imap_folder_changed - (camel_imap_fetch_command): Same. - - * providers/imap/camel-imap-folder.c (camel_imap_folder_changed): - Using a new way of calculating the first recent message that seems - more accurate. Also added code to make sure we don't accidently - add a duplicate summary. - -2000-08-31 Not Zed <NotZed@HelixCode.com> - - * camel-mime-part.c (write_to_stream): Use the proper type - checking function to check for text types. - (write_to_stream): If we have a charset on a text type that - isn't us-ascii or utf-8, then we need to reencode it, so add a - filter to do that too. - (write_to_stream): Fix some warnings/use the right constructor, - oops. - (write_to_stream): Rearrange the logic so it always does charset - conversion, and not just if we have a qp/base64 block. - - * camel-mime-utils.c (append_latin1): New function - even though - its broken, we'll assume mailers send latin1 headers instead of - us-ascii. We just have to encode high chars into utf-8. - (header_decode_text): Call append_latin1 for appending unencoded - text segments. - (append_latin1): Do an additional mask for account for c's - undefined behaviour for sign extension whilst shifting right. - -2000-08-30 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c (camel_imap_fetch_command): - Rewrote to ignore strings that look like server responses until it - is sure that it has finished reading the literal string response. - -2000-08-30 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-remote-store.c (remote_send_string): Don't wrap printed - strings in quotes, makes things messy - - * providers/imap/camel-imap-folder.c (imap_get_message): Updated - to use the camel_imap_fetch_command - - * providers/imap/camel-imap-stream.c (stream_read): Updated to use - camel_imap_fetch_command - - * providers/imap/camel-imap-store.c (camel_imap_command_extended): - No longer handles FETCH requests so no longer needs to be - concerned with checking to make sure that server responses are - valid (they have to be). - (camel_imap_fetch_command): New convenience function that handles - all FETCH requests - -2000-08-30 Peter Williams <peterw@helixcode.com> - - * camel-remote-store.c (remote_connect): Unify with remote_post_connect. - (remote_disconnect): Unify with remote_pre_disconnect. - (camel_remote_store_class_init): Don't use the post_connect and - pre_disconnect classfuncs anymore ; they weren't especially useful. - - * providers/imap/camel-imap-store.c (imap_connect): Use this again - instead of implementing post_connect. - (imap_disconnect): Analogous to above. - - * camel-session.c (camel_session_get_service_connected): New function. - Like camel_session_get_service() but also connects to the service - if needed. camel_session_get_{store,transport} (defined in the header) - used this now, preventing annoying when-to-connect problems. - - * camel-service.c (camel_service_new): Revert to the old behavior - of not connecting until told to do so. Otherwise doing auth - testing correctly is really hard. - (camel_service_connect): Fix behavior here (set the connected - flag). - (camel_service_disconnect): Unset the connected flag. - -2000-08-30 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c: General cleanup / moving - stuff around to make things easier to follow. - -2000-08-30 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-remote-store.c: Prevent exceptions from being overwritten - - * providers/imap/camel-imap-folder.c (imap_expunge): Beautified - (imap_get_subfolder_names_internal): Removed old code as the - replacement code has now been tested and proven to work - -2000-08-29 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-utils.c: Removed old code that will - never be needed again - - * providers/imap/camel-imap-store.c: Removed old code for - try_connect - will never need this code - (slurp_response): Update to make sure we aren't falsely detecting - EXPUNGE flags - -2000-08-29 Peter Williams <peterw@helixcode.com> - - * camel-service.c (camel_service_connect): Uncomment this. - (camel_service_disconnect): Same. - - * camel-remote-store.[ch]: New files. Abstract remote storages - (IMAP, POP3, NNTP) and hides the lower-level networky stuff. - - * camel-service.c (camel_service_new): Take an extra argument, the - provider that created us, cause it's useful. - (camel_service_finalize): Unref our new provider member. - - * camel-session.c (camel_session_get_service): Pass the proper number of - arguments to camel_service_new(). - - * camel-imap-store.c: Massive update: 1) use the CamelRemoteService to - make our life Very Easy (TM). 2) Change the semantics of all - camel_imap_command* functions to take exceptions, centralize tons of - duplicate code, and use the handy RemoteStore utility functions - - * camel-imap-folder.c: Use the new semantics of camel_imap_command* - - * camel-imap-stream.c: Same. - -2000-08-29 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c (camel_imap_command_extended): - Updated to check for EXPUNGE notifications - - * providers/imap/camel-imap-folder.c (camel_imap_folder_changed): - Updated to account for messages which have been expunged (now - takes a new arg, a GPtrArray of message id's that have been - expunged) - (imap_expunge): Updated (we may want to just use the code in - folder_changed now instead of doing our own summary - expunging...but that can be fixed later) - (imap_append_message): Updated. - (imap_copy_message_to): Updated. - (imap_move_message_to): Updated. - -2000-08-28 Peter Williams <peterw@helixcode.com> - - * camel-folder.c (camel_folder_refresh_info): New member function, - refresh_info, used for rereading folder state after its state has - somehow become unknown. Tries to preserve last-known status of - messages. - - * providers/mbox/camel-mbox-folder.c (mbox_refresh_info): Implement - ::refresh_info (split up ::init) - - * providers/mbox/camel-mbox-store.c (get_folder): Call ::refresh_info. - - * providers/imap/camel-imap-folder.c (camel_imap_folder_new): Call - ::refresh_info once initialized. - (imap_refresh_info): New member function; reads the summary from - the server (used to be in camel_imap_folder_new; split out). - - * providers/imap/camel-imap-store.c (imap_connect): Set - CamelService::connected a little early so that - camel_imap_command won't try to connect while already - connnecting. - (camel_imap_command*): Try to connect if not connected already. - - * providers/pop3/camel-pop3-folder.c (pop3_refresh_info): Same as above. - - * providers/pop3/camel-pop3-folder.c (camel_pop3_folder_new): Same - as above. - - * providers/pop3/camel-pop3-store.c (pop3_connect): Set - CamelService::connected a little early so that - camel_pop3_command won't try to connect while already - connecting - (connect_to_server): Same. - - * providers/nntp/camel-nntp-folder.c (nntp_folder_refresh_info): Same - as above. - -2000-08-28 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_get_message): Fixed the - hack around quoted string responses - should now handle them - according to the specifications in the RFC - - * providers/imap/camel-imap-stream.c (stream_read): Updated to - match the code currently used in camel-imap-folder.c - -2000-08-28 Ettore Perazzoli <ettore@helixcode.com> - - * providers/mbox/camel-mbox-summary.c (camel_mbox_summary_sync): - Never ever free `tmpname' as it comes from `alloca()'! - -2000-08-26 Ettore Perazzoli <ettore@helixcode.com> - - * camel-mime-utils.c (header_decode_text): Use `g_free()', not - `free()', to free `decword'. - -2000-08-25 Peter Williams <peterw@helixcode.com> - - * camel.c (camel_init): Don't call unicode_init; code in e-util - will do it, and if unicode_init is called twice, you get an - infinite loop when looking up nonexistant encodings (patch - has been submitted to libunicode's maintainer). - - * camel-provider.h: Add a new field, default_ports, which - helps the configuration code guess about how to make CamelURL's - from providers. - - * providers/*/camel-*-provider.c: Specify default ports. - -2000-08-25 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c - (imap_get_subfolder_names_internal): If the url path is "/" and - the folder path is "/", just LIST "" "*" (this should fix some - cyrus imapd problems). Also, INBOX is case insensitive so use - g_strcasecmp - -2000-08-24 Lauris Kaplinski <lauris@helixcode.com> - - * camel-folder-summary.c (summary_build_content_info): - Use UTF-8 as default - * camel-mime-part-utils.c (simple_data_wrapper_construct_from_parser): - Use UTF-8 as default - * camel-mime-utils.c (rfc2047_decode_word): Use UTF-8 - -2000-08-17 Not Zed <NotZed@HelixCode.com> - - * providers/mh/camel-mh-folder.c (mh_finalize): And here too. - - * providers/mbox/camel-mbox-folder.c (mbox_finalize): Close index - on exit. - -2000-08-23 Dan Winship <danw@helixcode.com> - - * camel-mime-utils.c (header_address_list_format_append): put - commas between addresses. - -2000-08-22 Dan Winship <danw@helixcode.com> - - * providers/imap/camel-imap-folder.c - (imap_protocol_get_summary_specifier): use BODY.PEEK, not BODY, so - we don't set the message \Seen. - -2000-08-22 Christopher James Lahey <clahey@helixcode.com> - - * providers/pop3/camel-pop3-store.c: Fixed a small warning. - -2000-08-22 Peter Williams <peterw@helixcode.com> - - * camel-service.c (camel_service_new): Connect automatically if the - URL is not empty. - (finalize): Disconnect automatically if connected. - (camel_service_query_auth_types): Split into two functions; one to - be called if we're connected to an actual server (_connected), one - to be called if we're just gauging the general authtypes supported - (_generic). - (is_connected): Remove. - - * camel-store.c (camel_store_get_folder): Don't connect explicitly to - the service. - - * providers/nntp/camel-nntp-store.c (query_auth_types_generic): Split - the query_auth_types function. Hook it up in _new. - (finalize): Don't try to disconnect here. - - * providers/pop3/camel-pop3-store.c (query_auth_types_generic): Same. - (finalize): Don't try to disconnect here. - - * providers/imap/camel-imap-store.c (query_auth_types_generic): Same. - (finalize): Don't try to disconnect here. - - * providers/smtp/camel-smtp-transport.c (query_auth_types_generic): Split - the query_auth_types (dummy, in this case) function. Hook it up in _new. - (finalize): Don't try to disconnect here. - -2000-08-21 JP Rosevear <jpr@helixcode.com> - - * providers/nntp/camel-nntp-folder.c (nntp_folder_get_subfolder_names): - Make sure newsrc is not null - (nntp_folder_get_subfolder_names): ditto - - * providers/nntp/camel-nntp-newsrc.c - (camel_nntp_newsrc_get_subscribed_group_names): Programming check - for newsrc == NULL - (camel_nntp_newsrc_get_all_group_names): ditto - (camel_nntp_newsrc_write_to_file): ditto - (camel_nntp_newsrc_write): ditto - -2000-08-21 JP Rosevear <jpr@helixcode.com> - - * providers/nntp/camel-nntp-store.c (camel_nntp_command): - Make sure respbuffer is not null before manipulating it. - If it is null, return CAMEL_NNTP_FAIL and a decent error - message. - -2000-08-18 Peter Williams <peterw@helixcode.com> - - * camel-internet-address.c (internet_encode): If the name is "" we - weren't outputting anything; output the address at least. - -2000-08-16 Peter Williams <peterw@helixcode.com> - - * camel-internet-address.c (internet_encode): Fix a leak when - name = "". It's a single-byte leak, but it's the little things - that count. - - * camel-object.c (camel_type_lock_up): Don't leave the type - system locked when a bad unlock happens. - - * providers/mbox/camel-mbox-store.c (get_folder): Fix a leak. - -2000-08-15 Peter Williams <peterw@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_copy_message_to): Typo fix. - -2000-08-14 Peter Williams <peterw@helixcode.com> - - * camel-folder-search.c (search_get_sent_date): New search function; - returns the time_t when the message was sent. - (search_get_receive_date): Same for when it was received. - (search_get_current_date): Gets the current time for use with the - above two. Is this in the right place? - - * camel-folder-search.h: Add the new functions above to the class. - -2000-08-13 Dan Winship <danw@helixcode.com> - - * providers/nntp/Makefile.am (libcamelnntpinclude_HEADERS): Add - camel-nntp-utils.h - - * providers/imap/camel-imap-folder.c - (imap_get_subfolder_names_internal): do a strcasecmp rather than - just a strcmp when checking if a folder is "INBOX", since it is - a case-insensitive name. - -2000-08-12 Dan Winship <danw@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_get_summary_internal): - Don't assume the FETCH results will come back in the order they - were requested. - (imap_get_subfolder_names_internal): Add "INBOX" to the list as - g_malloc'ed memory, not a static string. - -2000-08-12 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c - (camel_imap_command_continuation): Now takes a char * parameter - rather than a stream - (camel_imap_command_continuation_with_stream): Same function as - above but takes a stream parameter instead - - * providers/imap/camel-imap-folder.c (imap_append_message): Use - camel_imap_command_continuation_with_stream - -2000-08-12 Dan Winship <danw@helixcode.com> - - * providers/pop3/camel-pop3-store.c (pop3_try_authenticate): New - function to do one round of attempted authentication. - (pop3_connect): Move a bunch of code out into - pop3_try_authenticate and fix some bugs in the edge cases. - -2000-08-12 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c (query_auth_types): No longer - calls try_connect() to get authtypes - -2000-08-11 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c - (camel_imap_command_continuation): Changed param order a bit and - fixed some logic - - * providers/imap/camel-imap-folder.c (imap_append_message): Use - the new multi-transactional convenience functions - -2000-08-11 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c - (camel_imap_command_preliminary): New convenience function for - multi-transactional commands (opening request) - (camel_imap_command_continuation): New convenience function for - multi-transactional commands (followup data) - -2000-08-11 Christopher James Lahey <clahey@helixcode.com> - - * providers/mh/camel-mh-folder.c: Fixed a warning. - -2000-08-11 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/camel-nntp-folder.c - (camel_nntp_folder_class_init): remove get_name and get_full_name - assignments, since the camel-folder.c implementation does what we - need. - -2000-08-11 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/camel-nntp-store.c - (camel_nntp_store_get_toplevel_dir): use g_get_home_dir, since - evolution_dir isn't available in the providers. - -2000-08-11 Peter Williams <peterw@helixcode.com> - - * camel-folder.c (thaw): Fix a bug where the message_changed - signal wasn't being emitted. - -2000-08-11 Not Zed <NotZed@HelixCode.com> - - * providers/mh/camel-mh-folder.c (mh_set_message_user_tag): - Implement. - (mh_get_message_user_tag): Implement. - - * providers/mbox/camel-mbox-folder.c (mbox_get_message_user_tag): - (mbox_set_message_user_tag): Implement. - - * camel-folder.c (move_message_to): Yay so lets fix an already - fixed fix, again. - (copy_message_to): and here too ... update for api change to append(). - And removed another warning. - (camel_folder_set_message_user_tag): Routine to set message tags. - (camel_folder_get_message_user_tag): And accessor. - -2000-08-10 Christopher James Lahey <clahey@helixcode.com> - - * camel-folder-search.c, camel-folder-summary.c, camel-medium.c, - camel-mime-filter-charset.c, camel-mime-filter.c, - camel-mime-filter.h, camel-mime-message.c, camel-mime-parser.c, - camel-mime-part-utils.c, camel-mime-part.c, camel-mime-utils.c, - camel-movemail.c, camel-multipart.c, camel-object.c, - camel-stream-mem.c, providers/mbox/camel-mbox-folder.c, - providers/mbox/camel-mbox-summary.c, - providers/mh/camel-mh-folder.c, - providers/smtp/camel-smtp-transport.c: Fixed some warnings. - -2000-08-11 Not Zed <NotZed@HelixCode.com> - - * providers/vee/camel-vee-folder.c (vee_folder_build_folder): Free - the search properly. - (vee_folder_build): And here too. - -2000-08-10 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (camel_imap_folder_changed): - If we go over the max number of messages, don't keep requesting - new message summaries, just break. - -2000-08-11 Not Zed <NotZed@HelixCode.com> - - * camel-mime-parser.c (folder_scan_header): A better way to - compress leading whitespace. The code is probably invalid anyway, - I dont think it will work across buffer boundaries. - - * providers/mbox/camel-mbox-folder.c (mbox_append_message): And - write out proper format From lines here too. - - * providers/mbox/camel-mbox-summary.c - (camel_mbox_summary_build_from): New function to build a more - compatible mbox "From " line. - (camel_mbox_summary_sync): Write From lines in the proper format. - -2000-08-10 Not Zed <NotZed@HelixCode.com> - - * providers/mh/camel-mh-store.c (get_folder): Remove warnin g. - - * providers/mbox/camel-mbox-store.c (xrename): Kill some warnings - with constification. - - * providers/imap/camel-imap-folder.c (imap_append_message): Fixed - for append api change. Eek this routine seriously wastes memory. - - * providers/mh/camel-mh-folder.c (mh_search_free): Impelemnt. - (mh_append_message): Fix for api change, and include user flags - and tags in new message. - - * providers/vee/camel-vee-folder.c (vee_search_by_expression): Fix - for search api change. - - * camel-folder.c (camel_folder_search_free): New function for - freeing search results. - (search_free): Changed my mind, implement a default that actually - does something. Free as to the old interface. - (camel_folder_append_message): Changed to accept a - camelmessageinfo rather than flags, which just doesn't have enough - info in it. - (copy_message_to): Change for append_message api change. - (move_message_to): Likewise. - - * providers/mbox/camel-mbox-folder.c (mbox_search_free): - Implement. - (mbox_append_message): Fix for api change, and also copy user - flags/tags across to new summary. - - * camel-folder-search.c (search_user_tag): A search expression - that returns the current use flag by name. - (camel_folder_search_free_result): New function to free the result - of a search. - - * camel-folder-summary.c: Bump summary version. - (message_info_new): - (message_info_load): - (message_info_save): - (camel_message_info_dup_to): - (camel_message_info_free): Added support for arbitrary tag/value - pairs (CamelTag's). - (camel_tag_get): - (camel_tag_set): - (camel_tag_list_size): - (camel_tag_list_free): Operations for working with CamelTags. - -2000-08-09 Peter Williams <peterw@helixcode.com> - - * camel-store.c (camel_store_get_folder): Connect beforehand, if - necessary. - - * providers/imap/camel-imap-store.c (camel_imap_store_init): Default - the dir_sep to "/" so that certain functions can safely assume that - dir_sep is valid (at least, nonnull). - -2000-08-09 Ettore Perazzoli <ettore@helixcode.com> - - * providers/nntp/camel-nntp-folder.c - (nntp_folder_set_message_flags): Get rid of an unused variable. - - * providers/nntp/Makefile.am (INCLUDES): Fix includes so that we - don't use installed headers anymore. [I copied this over from the - IMAP provider, that does not seem to have this problem.] - -2000-08-09 Not Zed <NotZed@HelixCode.com> - - * camel-folder-search.c (camel_folder_search_execute_expression): - Reorder search result in summary order if we searched with a - summary. - -2000-08-08 Dan Winship <danw@helixcode.com> - - * camel-uid-cache.c: New code to keep an on-disk cache of what - UIDs have been seen in a folder. - - * camel-provider.h: Add new flags CAMEL_PROVIDER_IS_SOURCE (mail - can arrive in it by non-Camel means) and CAMEL_PROVIDER_IS_STORAGE - (you can work with mail directly without needing to copy it local). - - * providers/*/camel-*-provider.c: Add flags as needed: imap and - mbox are SOURCE and STORAGE. mh and nntp are just STORAGE, pop3 is - just SOURCE. - - * camel-mime-message.c (process_header): Add another subject - g_strstrip that fejj's earlier commit missed. - -2000-08-08 Peter Williams <peterw@helixcode.com> - - * camel-provider.h: Remove some GTK stuff that I missed. - - * providers/imap/camel-imap-store.c (imap_noop): Turn this - back on with the new timeout interface in CamelSession. - - * camel-session.[ch] (camel_session_register_timeout): New - interface for Camel to register timeouts. Basically the - GTK timeout interface is copied. We do this because Camel isn't - allowed to use GTK anymore. - -2000-08-07 Not Zed <NotZed@HelixCode.com> - - * providers/mh/camel-mh-folder.c (mh_append_message): Only retry - another uid if we had a name clash, otherwise fail. - -2000-08-07 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c - (imap_get_subfolder_names_internal): If we are trying to get a - subfolder listing of the root folder, always make sure INBOX is - there... - - * providers/imap/camel-imap-utils.c (imap_parse_list_response): - Check for NIL as a directory separator. - -2000-08-07 Peter Williams <peterw@helixcode.com> - - * providers/nntp/Makefile.am: Reorder the INCLUDES to pull - in the camel headers from the local source tree before - the ones in $(includedir). This was causing compile problems - because the installed, Gtk-based camel-object.h was included - before the uninstall Camel-based one. - -2000-08-07 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-utils.c (imap_translate_sexp): Strip - all \n's from the expression - - * string-utils.c (strip): New convenience function to strip - occurences of a single char from a string - - * camel-mime-message.c (camel_mime_message_set_subject): Do a - g_strstrip on the subject so we can stop getting those annoying - leading spaces - -2000-08-07 Dan Winship <danw@helixcode.com> - - * camel-folder.c (camel_folder_free_deep): Fix this to not require - NULL-termination of the array. - -2000-08-04 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c (imap_connect): If we fail to - get a dir_sep, then supply the default of "/". - (get_folder): Undo changes by Peter - -2000-08-04 Peter Williams <peterw@helixcode.com> - - * providers/imap/camel-imap-store.c (get_folder): Prevent a coredump - when get_folder()ing from a store with dir_sep = NULL. - -2000-08-04 Peter Williams <peterw@helixcode.com> - - * camel-store.h: Include camel-object.h. Ettore said this wasn't - compiling. - -2000-08-04 Not Zed <NotZed@HelixCode.com> - - * camel-url.c (camel_url_set_protocol): - (camel_url_set_host): - (camel_url_set_path): - (camel_url_set_port): Url editing functions. - -2000-08-04 Dan Winship <danw@helixcode.com> - - * providers/pop3/camel-pop3-folder.c (pop3_set_message_flags): - (pop3_sync): Indexes into the flags array are message_number minus - 1, not just message_number. - - * providers/pop3/camel-pop3-store.c: add a debugging macro for - doing protocol tracing. - -2000-08-03 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (camel_imap_folder_new): Only - call imap_get_summary_internal if the folder can hold messages - - * providers/nntp/camel-nntp-provider.c (camel_provider_module_init): - Initialize the service_cache for the news/nntp providers - -2000-08-03 Peter Williams <peterw@helixcode.com> - - * providers/nntp/Makefile.am (INCLUDES): Add -I$(top_srcdir) to - pull in libibex/ibex.h - -2000-08-02 Not Zed <NotZed@HelixCode.com> - - * providers/mh/camel-mh-summary.c (camel_mh_summary_sync): Expunge - from the end, so the index isn't messed up when you remove a - message. - - * providers/mh/camel-mh-folder.c (mh_append_message): Fix a bug - where it would never open an output file/uid. - - * providers/mbox/camel-mbox-store.c (rename_folder): - Implementation for mbox as well. - - * camel-store.c (camel_store_rename_folder): New method to rename folders. - (rename_folder): Default implementation. - - * providers/mh/camel-mh-store.c (delete_folder): Implement this. - (rename_folder): Implement a rename operation. - -2000-08-02 Dan Winship <danw@helixcode.com> - - * providers/MH: Kill this. It doesn't have any code to do anything - the new mh provider doesn't do better. - - * providers/Makefile.am: Remove reference to MH subdir, and - promote nntp to fully-supported status, since it does compile and - all. - - * camel-mime-message.c (camel_mime_message_set_subject): Trim - trailing space from the subject. I've now seen replies from two - different people that tricked the threading code by (a) not having - References/In-Reply-To, and (b) adding an extra space to the end - of the subject line so the subject-based threading fails too. Who - writes these broken mailers anyway? - -2000-08-01 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/smtp/camel-smtp-transport.c (smtp_helo): When forced - to use the IP, place it in square brackets. - - * providers/imap/camel-imap-utils.c (imap_translate_sexp): New and - improved sexp parser. An honest try at using e-sexp is wrapped in - a #ifdef at the bottom of the file but is currently not used - - * providers/imap/camel-imap-folder.c (imap_search_by_expression): - We want to do a UID SEARCH so we get UIDs back instead of sequence - numbers - -2000-08-01 Not Zed <NotZed@HelixCode.com> - - * providers/mh: New mh provider implementation. - - * providers/Makefile.am (SUBDIRS): Added mh provider. - -2000-07-31 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_get_message_info_internal): - Some IMAP servers don't wrap the UID in ()'s so don't depend on that - (imap_get_summary_internal): Same - - * providers/imap/camel-imap-utils.c (free_sexp_node): Oops, forgot to - free node->function - not good. - -2000-07-31 Peter Williams <peterw@helixcode.com> - - * providers/vee/camel-vee-folder.c (vee_search_by_expression): Add - a NULL to the matches pointer array so that g_strfreev knows where - the end is. - -2000-07-31 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-utils.c (imap_translate_sexp): New - convenience function to translate a Camel sexp into the equivalent - IMAP sexp. - - * providers/imap/camel-imap-store.c: More places now use - imap_next_word - - * providers/imap/camel-imap-folder.c (imap_search_by_expression): - Implemented initial version (this may or may not work quite right) - -2000-07-28 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_expunge): Make sure - the third word/token (whatever) is "EXPUNGE" and not something - else like "EXISTS" or "RECENT". When removing the message from - the summary also make sure to free that data to avoid leakage. - Also make sure to subtract 1 from the 'id' since IMAP starts - at 1 and our summary starts at 0 :-) - -2000-07-28 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c (camel_imap_status): Cleaned - up a bit, now uses imap_next_word() - (camel_imap_command_extended): Now uses imap_next_word(). When - checking for RECENT, allow the first digit of the recent-count - be between 0 and 9 inclusive instead of exclusive. - - * providers/imap/camel-imap-folder.c (imap_expunge): Optimized. - No longer will it need to reload the summary as it now instead - removes the appropriate message summaries from the cache. - (camel_imap_folder_changed): If recent == 0 then return. If - recent < 0 then just emit the folder_changed signal, don't reload - summaries. - -2000-07-28 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c - (imap_get_message_count_internal): Get message count when STATUS - is not available. - (imap_init): folder->has_search_capability is required for IMAP so - should always be set to TRUE (is currently being set to FALSE as - I've not yet implemented SEARCH support). - (camel_imap_folder_changed): Seem to have fixed my optimization - hack - -2000-07-28 Jon K Hellan <hellan@acm.org> - - * providers/imap/camel-imap-store.h (CamelImapServerLevel): New - enum. - (CamelImapStore): Added server_level and has_status_capability - members. - - * providers/imap/camel-imap-store.c (imap_connect): Detect - IMAP4REV1, IMAP4 and STATUS in capability response. - - * providers/imap/camel-imap-folder.c - (imap_get_message_count_internal): Use STATUS only if server - supports it. TODO: Get message count when STATUS not supported. - (imap_get_message, imap_get_summary_internal, - imap_get_message_info_internal): Handle IMAP4 as well. - (imap_protocol_get_summary_specifier): New function: Make a data - item specifier for the header lines we need, appropriate to the - server level. - -2000-07-27 Peter Williams <peterw@helixcode.com> - - * camel-mime-utils.c (header_decode_lwsp): More - checks for end of string. - - * providers/imap/camel-imap-store.c: - (imap_command_extended): Free the elements of our - array (huge mem leak) - - * providers/imap/camel-imap-folder.c: - (summary_get_internal): Same as above. - - -2000-07-27 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (camel_imap_folder_changed): - Fixed my routine to only fetch new headers, my IDs were off by 1 - on the high end, so when it would fetch the last newly arrived - message it would fail and end up fetching all of the summaries - because of the corruption. - -2000-07-27 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-url.c (camel_url_to_string): If the path doesn't begin - with a / and there is a host, prepend a / to the path. - -2000-07-27 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/Makefile.am: Added camel-imap-utils.[c,h] - - * providers/imap/camel-imap-utils.[c,h]: Utilities for parsing - server responses for use in both camel-imap-store.c and - camel-imap-folder.c - - * providers/imap/camel-imap-folder.c (imap_get_summary_internal): - Free all the pointers in the headers array. - (imap_get_subfolder_names_internal): Updated to use - imap_parse_list_response - (imap_parse_subfolder_list): Removed in favor of - imap_parse_list_response - - * providers/imap/camel-imap-store.c (camel_imap_command_extended): - Free all the pointers in the data array. - (imap_connect): Updated to use imap_parse_list_response and fixed - a leak - (folder_is_selectable): Updated. - -2000-07-27 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_get_message_info): Now - uses a hash table for looking up message info rather than a linear - search :) - -2000-07-27 Peter Williams <peterw@helixcode.com> - - * providers/*/Makefile.am: Don't specify SUBDIRS = - [nothing]. Messes up distcheck. - -2000-07-26 Peter Williams <peterw@helixcode.com> - - * camel-mime-parser.c (folder_scan_init): Initialize - outbuf to be "" -- it's not guaranteed to be zeroed. - - * camel-mime-utils.c (header_references_decode): Return - if the header is NULL -> or "" <-. Don't do our stupid - mailer trick if we point to \0. - (header_decode_quoted_string): Don't rip past end of - string! - -2000-07-26 Dan Winship <danw@helixcode.com> - - * camel-movemail.c (movemail_external): routine to call an - external movemail program. - (camel_movemail): Nuke return value, use movemail_external when - available and useful, and don't delete "dest" on errors, since - it might have started non-empty. - -2000-07-26 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-url.c (camel_url_to_string): Should now always prepend a '/' - before the path if it doesn't already exist. - - * providers/imap/camel-imap-folder.c: Fixed a few compiler warnings - -2000-07-25 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_summary_free): Fixed the - real problem that Peter was running into. - -2000-07-25 Dan Winship <danw@helixcode.com> - - * camel-mime-message.c (write_to_stream): Don't add a Mime-Version - header to a message that already has one. - - * camel-internet-address.c (internet_encode): Don't put <>s around - addresses with no name part. - -2000-07-25 Peter Williams <peterw@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_expunge): Set - imap_folder->summary to NULL after calling imap_summary_free, - so we don't get stuck with a junk summary pointer. Should - we free it at all? - -2000-07-25 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (camel_imap_folder_changed): - Optimized to try and get the new message headers without reloading - the entire summary from scratch. - (imap_get_summary_internal): Will now sync() before attempting to - reload the summary so that flags are set in the reloaded summary - as well. - -2000-07-24 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c (get_folder): Updated to give - special attention to the root folder. - - * providers/imap/camel-imap-folder.c - (imap_get_subfolder_names_internal): Updated to handle the root - folder - (imap_get_message_count_internal): return 0 if folder can't hold - messages - (camel_imap_folder_new): Change so that root folder gets special - attention and always gets can_hold_messages set to FALSE - -2000-07-24 Dan Winship <danw@helixcode.com> - - * camel-folder.c: Remove exceptions from a number of methods that - work on what ought to be static data: get_parent_folder, - get_parent_store, get_message_count, get_unread_message_count, - get_permanent_flags, get_message_flags, set_message_flags, - get_message_user_flag, set_message_user_flag, get_uids, - get_summary, get_subfolder_names. Turn camel_folder_delete_message - into a macro. (Mostly a pull-up from the camel-async branch.) - - * providers/{imap,mbox,nntp,pop3,vee}: Update for CamelFolder - changes - -2000-07-24 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_get_message_info): Updated - to port easily to the new Camel API - (imap_init): Don't SELECT INBOX, we don't need to do that - -2000-07-24 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (camel_imap_folder_new): - Initialize the summary and subfolder listing. - (imap_summary_free): Now takes a GPtrArray arg rather than a - CamelImapFolder as it increases it's usefullness for free()'ing - temporary summaries. - (imap_get_message_count_internal): A new convenience function for - getting the actual message count on a server to be used by - imap_get_summary_internal) - (imap_get_message_count): Since the Camel API is on the move again, - the future version of this function will not be able to make a - call to the store, it must only access previously fetched data (thus - the creation of the _internal function) - (imap_get_subfolder_names_internal): Again, because the future version - of imap_get_subfolder_names will not take an exception, we must rename - this function which will be called by camel_imap_folder_new() - (imap_get_subfolder_names): We now return the previously collected - subfolder listing that the _internal function fetched previously - (imap_get_summary_internal): Again, same idea as the previous _internal - functions... - (imap_get_summary): Again... now returns a previously aquired summary - - * providers/imap/camel-imap-store.c (imap_noop): This will hopefully - prevent the imap store from disconnecting. - (imap_connect): Modified to add a gtk timeout event that will call - imap_noop() every 10 minutes (we may want to change this time value) - (imap_disconnect): Modified to remove the NOOP timeout event from the - store. - (camel_imap_command_extended): Commented out the code that would try - and detect if the store was disconnected and then reconnect if it was - needed. - -2000-07-24 Dan Winship <danw@helixcode.com> - - * camel-folder.[ch]: Remove camel_folder_get_message_uid, which - was not used, and not implemented by any provider. - - * providers/nntp/camel-nntp-folder.c: Remove get_message_uid - non-implementation. - - * camel-folder-pt-proxy.[ch], camel-arg-collector.c, - camel-marshal-utils.[ch]: Bye bye bye. - - * Makefile.am: remove reference to camel-arg-collector.c - -2000-07-23 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c (imap_disconnect): Made it a - little more forgiving. Also set current_folder to NULL as there is - no selected folder after a disconnect. - (stream_is_alive): Detects whether or not a socket is "alive" - (camel_imap_command_extended): Use stream_is_alive() to aid in the - detection of a disconnected state. - -2000-07-22 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c (get_folder): Clear - CamelExceptions when appropriate (eg when folder is marked as - \NoSelect). Still needs some cleanup and perhaps Dan will have a - better way of doing this as this seems like a messy way of - handling this. - - * providers/imap/camel-imap-folder.c (imap_get_uids): Took out - some debug statements as they are no longer needed. - -2000-07-21 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_get_subfolder_names): - Updated to not strip out subfolders that are marked as \NoSelect - because this will be correctly handled in store->get_folder from - now on. - - * providers/imap/camel-imap-store.c (folder_is_selectable): New - convenience function for use in get_folder(). - (parse_list_response): Now takes a char **flags argument which is - needed by folder_is_selectable(). - (imap_connect): Updated to reflect changes to - parse_list_response(). - -2000-07-21 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-stream.c (stream_read): Updated with - some of the same fixes I've made to camel-imap-folder.c like - recalculating message part lengths. - - * providers/imap/camel-imap-store.c (camel_imap_command_extended): - Rewrote the code to check for "* %d RECENT". Still needs to be - modified, but should no longer cause an infinite loop by detecting - mis-detecting RECENT messages. - -2000-07-20 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_get_summary): - (imap_get_message_info): Oops. Fix UID parser to allow 0 and 9 to - be in the range of valid UID chars. - -2000-07-20 Peter Williams <peterw@helixcode.com> - - * camel-object.c (camel_object_unref): Add a new global mutex - 'refcount' held when refcounting operations occur. - -2000-07-19 Peter Williams <peterw@helixcode.com> - - * camel-object.c (camel_type_lock_up): Correct the recursiveness; - the locklevel is stored as a private, so each thread has its own - idea of the locklevel. Thus one thread can relock, but a different - one will think that it's a level 0 and try to lock the type_system - mutex. - -2000-07-19 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c: General cleanup working - towards getting Actions->Expunge working correctly. - - * providers/imap/camel-imap-store.c - (cammel_imap_command_extended): Added code to look for "* %d - RECENT" and to emit the folder_changed signal if there are any - recent messages. Note: this is a hack and needs to be rewritten - badly. - -2000-07-19 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_get_summary): If the - folder's message count is not the same as the number of summaries, - free the old summary and create a new summary. - -2000-07-18 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c - (camel_imap_folder_class_init): Added in - imap_[g,s]et_message_user_flag() methods - (imap_get_message_info): Rewrote to use the more efficient way of - downloading summary information and also added a UID comparison so - that if the UID requested doesn't match the UID received, it - returns NULL. FIXME: When the mailer gets NULL when it requested - message info, it seems that it displays a row for that message and - when you try and select the blank row, it segfaults. - - * providers/imap/camel-imap-store.c (get_folder): Oops, this - should not be checking against "/", it should be checking against - dir_sep. - - * providers/imap/camel-imap-folder.c (imap_parse_subfolder_line): - Updated to trim out the leading namespace. - (imap_get_subfolder_names): Let the subfolder parser trim the - namespace off the folder name. - -2000-07-17 Peter Williams <peterw@helixcode.com> - - * camel-object.c (camel_type_lock_up): New function; the - Camel type_system lock is now fakey-recursive, being controlled - by a semaphore that goes up and down and is protected by another - lock. Theoretically all we need is the lock on the semaphore, - but this we catch exceptions "better" (by deadlocking). - (camel_type_lock_down): Corresponding to above. - (all functions): s,G_LOCK,camel_type_lock_up, etc. - -2000-07-17 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c (imap_disconnect): Send a - "LOGOUT" command. - - * providers/imap/camel-imap-folder.c (imap_get_message): Hacks to - get IMAP code to work with CommunigatePro and MS Exchange (and any - other servers that send back a UID at the end of each FETCH inside - of the main body of the message part). - (imap_sync): Un-#if 0 the code that sets the flags on the IMAP - server for messages that have changed. Oops, don't mask with - DELETED to find out if the message has been answered ;-) - (imap_expunge): sync before expunging. - -2000-07-16 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c: All SELECT calls now pass - a NULL folder argument to camel_imap_command_extended() since it's - not needed. - (imap_connect): Moved service_class->connect() to the point right - after a connection is established with the server rather than - waiting until the end of the function. - (camel_imap_command): Updated the documentation comment - (camel_imap_command_extended): Before sending a command, first - check to make sure we are connected; if we aren't, then reconnect. - Don't strncmp() command with "SELECT" as it's redundant. - - * providers/imap/camel-imap-folder.c: All SELECT calls now pass - a NULL folder argument to camel_imap_command_extended() since it's - not needed. Also s/camel_imap_command/camel_imap_command_extended as - I will probably be doing away with camel_imap_command() or at least - only using it for LOGIN and similar commands where the server won't - notify us of any recent messages. - -2000-07-15 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (camel_imap_folder_new): - One last fix to get rid of hard-coded "/" directory separators - -2000-07-14 Peter Williams <peterw@helixcode.com> - - * camel-object.c : Implement 'events', which are suspiciously - like signals except without all the marshalling baggage, and - with quasi-thread-safety. - (camel_object_class_declare_event): New func. - (camel_object_hook_event): Ditto. - (camel_object_trigger_event): Ditto. - (obj_class_init): Declare the "finalize" event. - (obj_class_finalize): Free the hashtable of events->preps - (obj_finalize): Free the hashtable of events->hooklists - (camel_object_unref): Trigger the finalize event (ourselves, - to prevent massively unpleasant looping things.) - -2000-07-14 Peter Williams <peterw@helixcode.com> - - * camel-object.c (make_global_classfuncs): Change to return - a CamelObjectClass. Change parents to a GSList and free it - when done. - (camel_object_new): Don't allocate a classfuncs for every object; - merely give it a reference to the global_classfuncs. Convert - parents to a GSList and free it when done. - (camel_object_unref): Don't free the classfuncs. Free the parents - list, which is changed to a GSList. - -2000-07-14 Jeffrey Stedfast <fejj@helixcode.com> - - * string-utils.c (string_unquote): New convenience function - to unquote a string if it's encapsulated by "'s - - * providers/imap/camel-imap-folder.c: - * providers/imap/camel-imap-store.c: Made the necessary changes - to stop using hard coded directory separators. - -2000-07-13 Dan Winship <danw@helixcode.com> - - * providers/mbox/camel-mbox-summary.c (camel_mbox_summary_load): - If the summary is for a smaller mbox, and rebuilding from the - last-known end position fails, try rebuilding from the beginning. - Deals with the case where the user edits the mbox and makes it - bigger, without adding new messages. - -2000-07-13 Peter Williams <peterw@helixcode.com> - - * camel-object.c: Rewritten to not be based on GtkObject, - but a tiny threadsafe ripoff thereof. Objects still cannot - be shared across threads, but ref/unref/destroy/new/etc - will work. Signals are not implemented because doing it - robustly would be a major pain in the butt, but class - functions are. There's a small demonstration that it doesn't - crash in ./temp-test.c: build it with ./make-test.sh. - * camel-stream.c, camel-seekable-stream.c, camel-stream-mem.c: - moved over to CamelObject. Proof of concept: two levels of - subclass and class functions, all working without coredumps. - To port to CamelObject: - - s,GTK_,CAMEL_,g in the cast checks - - s,gtk_type_new,camel_object_new,g - - s,GtkType,CamelType,g - - Change get_type function over to camel_type_declare - - instead of hooking to finalize function, it goes into the - type declaration. - - remove signals. - - instead of GTK_OBJECT(so)->klass, CAMEL_OBJECT_GET_CLASS(so) - - s,gtk_type_class,camel_type_get_global_classfuncs,g - - don't chain finalize handlers; it will be done for you - -2000-07-13 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c: - * providers/imap/camel-imap-store.c: If a SELECT fails, set - imap_store->current_folder to NULL so a SELECT is forced before - any message/folder operations are requested. Also, because some - users don't use a namespace, make sure that if the url->path is - "/" we don't use it when creating the folder_path. - (camel_imap_command[_extended]): Since we allow the passing of - a NULL folder which we can use to bypass a forced SELECT, no need - to check for the individual commands that don't require a folder - to be selected. - -2000-07-13 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c: - * providers/imap/camel-imap-store.c: Updated to use CAMEL_IMAP_OK, - CAMEL_IMAP_NO, CAMEL_IMAP_BAD, and CAMEL_IMAP_FAIL rather than the - ones copied from the POP3 provider. - -2000-07-13 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_get_summary): Oops. - If the number of messages in the folder is 0, don't fetch - summaries 1 thru 0, just return an empty summary. - (imap_copy_message_to): Fixed to use message UID and also send - the source folder as an arg to camel_imap_command rather than NULL. - (imap_move_message_to): Same. - (imap_init): If SELECT is successful, we need to set the current - folder to the one selected, this was causing problems with move/copy - -2000-07-13 Dan Winship <danw@helixcode.com> - - * camel-service.h: define a set of CAMEL_SERVICE_URL_ALLOW_* flags - parallel to the _NEED_* flags, and make the _NEED_* flags imply - the _ALLOW_* ones. - - * providers/imap/camel-imap-store.c (camel_imap_store_init): imap - urls ALLOW_PATH - -2000-07-13 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_get_summary): New - and improved approach to fetching an entire folder summary - that should be much much faster than the old way as it gets - the entire folder summary in 1 shot rather than requesting - message by message. As with the last update, this version - also only fetches the minimum number of header fields. - (imap_get_summary): Oops, forgot to free the temp - GPtrArray *headers - -2000-07-13 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_get_summary): Don't - fetch the entire RFC822 header, just fetch the fields we want. - (imap_get_message_info): Same. - -2000-07-13 Not Zed <NotZed@HelixCode.com> - - * camel-mime-filter-basic.c (camel_mime_filter_basic_new_type): - Reset filter on setup. - (reset): When resetting qp encoding, set the state to -1, instead - of 0. - - * camel-mime-utils.c (quoted_encode_step): Actually count the - characters output sofar (it never counted any). Bunch of other - fixes. - (quoted_encode_close): Also flush out final character, if there's - one. - -2000-07-12 Jeffrey Stedfast <fejj@helixcode.com> - - Chris forgot to add #include <e-util/e-util.h> to the source files - - * providers/imap/camel-imap-store.c (imap_connect): Fixed Peter's - fix, we don't want to send a string to a %d. - -2000-07-12 Christopher James Lahey <clahey@helixcode.com> - - * camel-folder-search.c, providers/imap/camel-imap-store.c: - Changed from strstrcase to e_strstrcase. - - * string-utils.c, string-utils.h: Removed strstrcase (in favor of - e_strstrcase in e-util/e-util.c.) - -2000-07-12 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/camel-nntp-folder.c - (nntp_folder_set_message_flags): get the article num out of our - uid and mark it read in the newsrc. - (nntp_folder_get_message): get the message id out of the uid to - fetch the article. - - * providers/nntp/camel-nntp-utils.c (get_XOVER_headers): the uid - is now <article-num>,<messageid> - (get_HEAD_headers): same. - - * camel-mime-parser.c (folder_scan_step): go to HSCAN_MESSAGE - state when ct->subtype is "news" as well as "rfc822". this makes - attachments of type "message/news" display properly. - -2000-07-12 Dan Winship <danw@helixcode.com> - - * camel-folder.c (camel_folder_free_deep, - camel_folder_free_shallow, camel_folder_free_nop): Useful default - implementations for free_{uids,subfolder_names,summary}. - (free_subfolder_names, free_uids): Make these g_warning-ing - default implementations. - - * providers/*/camel-*-folder.c: Use the new functions where - appropriate, remove duplicated code. - -2000-07-12 Peter Williams <peterw@helixcode.com> - - * providers/imap/camel-imap-store.c (query_auth_types): Check for - NULL parameters when setting the exception so as to not crash on - Solaris (can't handle a %s passed NULL). - (imap_connect): Same. - -2000-07-12 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/mbox/camel-mbox-folder.c (mbox_delete_message): Use - mbox_set_message_flags () instead of setting the flags by hand. This - fixes the problem of the "message_changed" signal not being emitted - at the correct time. - - * providers/imap/camel-imap-folder.c: "folder_changed" signals should - pass a third argument (which is ignored). - - * camel-folder.c: Undo gtk signal emits done in set_flags and - expunge. - (move_message_to): - (copy_message_to): Create info as a const CamelMessageInfo - -2000-07-12 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/Makefile.am: don't add test-newsrc to the build - since it needs libcamel (which isn't built at the time test-newsrc - needs linking.) - - * providers/nntp/camel-nntp-utils.c (get_HEAD_headers): fill in - MessageInfo->message_id. - (get_XOVER_headers): same. - - * providers/nntp/camel-nntp-folder.c (nntp_folder_init): move - summary loading here. - (nntp_folder_sync): summary/newsrc changes should be stored here. - put a comment to that effect. - (nntp_folder_set_message_flags): don't save the newsrc here. - (nntp_folder_get_uids): use g_ptr_array_index instead of the - cast/addition. - (nntp_folder_get_summary): no need to check if we should generate - the summary here. already done. - (nntp_folder_get_message_info): implement. - - * providers/nntp/camel-nntp-store.c - (camel_nntp_store_get_toplevel_dir): use evolution_dir instead of - computing it ourselves. - (nntp_store_disconnect): call camel_nntp_newsrc_write. - (ensure_news_dir_exists): new function to create the news/<news - server> subdir. - (camel_nntp_store_class_init): hook up connect/disconnect and - finalize. - (nntp_store_connect): if ensure_news_dir_exists fails throw an - exception. - -2000-07-12 Peter Williams <peterw@helixcode.com> - - * camel-folder.c (camel_folder_set_message_flags): Emit a message_changed - signal once the flags are set on the message. - (camel_folder_set_user_flag): Ditto. - (camel_folder_expunge): Emit a folder_changed if no exception. - -2000-07-12 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-stream.c: Use size_t and ssize_t for read/write methods - - * providers/imap/camel-imap-folder.c (imap_set_message_flags): - Updated to emit the message_changed signal. - (imap_delete_message): Updated to use imap_set_message_flags (). - (imap_move_message_to): Updated to use imap_set_message_flags () - and to emit the folder_changed signal on the destination folder. - (imap_copy_message_to): Updated to emit the folder_changed signal - on the destination folder. - (imap_append_message): Updated to emit the folder_changed signal - on the destination folder. - -2000-07-11 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-folder.c (camel_folder_append_message): Now takes a - flags argument to specify the flags to be set on the message - since we might not necessarily want the flags to be wiped clean. - (move_message_to): - (copy_message_to): Updated to send a flags argument to - append_message (); currently sends the original message's flags. - - * providers/mbox/camel-mbox-folder.c (mbox_append_message): - * providers/imap/camel-imap-folder.c (imap_append_message): - Updated. - -2000-07-11 Dan Winship <danw@helixcode.com> - - * camel-folder.c: Remove exceptions from a number of methods - that work on what ought to be static data: get_parent_folder, - get_parent_store, get_message_count, get_unread_message_count, - get_permanent_flags, get_message_flags, set_message_flags, - get_message_user_flag, set_message_user_flag, get_message_uid, - get_uids, get_summary, get_subfolder_names. Turn - camel_folder_delete_message into a macro. - - * providers/{mbox,pop3,vee}: Update for CamelFolder changes - - * providers/Makefile.am: Disable imap and nntp for now - -2000-07-11 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_search_by_expression): - This shouldn't return NULL, it should return g_ptr_array_new () - so the mailer gets what it expects. - -2000-07-10 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-folder-summary.c (camel_folder_summary_decode_string): - Oops, an unsigned integer can never be < 0 - -2000-07-10 Dan Winship <danw@helixcode.com> - - * providers/vee/camel-vee-folder.c (vee_search_by_expression): - Initialize a variable to make this not crash again. And fix a bug - so it actually does something. - -2000-07-10 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-folder-summary.c: Cleaned up a bunch of compile warnings - -2000-07-10 Dan Winship <danw@helixcode.com> - - * providers/vee: kill more debugging messages - -2000-07-10 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/mbox/camel-mbox-folder.c (mbox_get_unread_message_count): - * providers/vee/camel-vee-folder.c (vee_get_unread_message_count): - * providers/imap/camel-imap-folder.c (imap_get_unread_message_count): - Implemented. - - * camel-folder.c (camel_folder_get_unread_message_count): New - convenience function to allow the mailer to query the number - of unread messages in a folder (for displaying message stats - in a folder tree?). - -2000-07-09 Dan Winship <danw@helixcode.com> - - * camel-mime-utils.c (header_references_dup): New function to copy - a header_references structure. - - * camel-folder-summary.c (camel_message_info_dup_to): New function - to (deep) copy the data from one CamelMessageInfo into another. - (camel_message_info_free): And free the data. - - * providers/vee/camel-vee-folder.c (vee_sync): Implement. (empty). - (vee_search_by_expression): belatedly update for - camel_folder_search change. - (vee_folder_build): belatedly update for camel_folder_search - change. Use camel_message_info_dup_to and camel_message_info_free - (in particular, so that we get message_id and references info so - vfolders can be threaded). - (vee_folder_build_folder): Ditto. - -2000-07-08 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/nntp/camel-nntp-folder.c: - * providers/nntp/camel-nntp-utils.c: - * providers/nntp/camel-nntp-store.c: Update to reflect past changes - in the Camel API. Use gtk macro casts wherever possible and use glib's - memory functions instead of standard c's (since they are not - compatable) - - * providers/smtp/camel-smtp-transport.c: - * providers/imap/camel-imap-store.c: Wrap debug print statements - in a macro - - * providers/imap/camel-imap-stream.c (stream_read): Make sure - that we get up to and including the last \n of the mime part. - - * providers/imap/camel-imap-folder.c (imap_get_message): Make sure - that we get up to and including the last \n of the mime part. - Wrap debug print statements in a macro. - - * providers/imap/camel-imap-stream.c (stream_read): Only cache - the important data (aka the mime part requested and no extra - server response stuff) - -2000-07-07 Dan Winship <danw@helixcode.com> - - * camel-mime-utils.c (header_references_decode): Work around - In-Reply-To's with unquoted punctuation. So many broken mailers. - - * camel-folder.c (camel_folder_search_by_expression): Make this - return a GPtrArray rather than a GList. - - * camel-folder-search.c (camel_folder_search_execute_expression): - * providers/imap/camel-imap-folder.c (imap_search_by_expression): - * providers/mbox/camel-mbox-folder.c (mbox_search_by_expression): - * providers/nntp/camel-nntp-folder.c (nntp_search_by_expression): - Update to return a GPtrArray rather than a GList. - -2000-07-07 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/smtp/camel-smtp-transport.c (esmtp_get_authtypes): - Fixed the parser to actually work - -2000-07-06 Dan Winship <danw@helixcode.com> - - * camel-mime-utils.c (header_references_decode): Make this deal - with the full RFC822 References/In-Reply-To format rather than - just the more-nicely-behaved RFC1036 version. (Needed to parse - In-Reply-To headers with extra junk in them.) - -2000-07-06 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_get_summary): Parse for - more header information to allow message threading in IMAP. - (imap_get_message_info): Same. - - * camel-folder-summary.c: Renamed summary_format_* to - camel_summary_format_* and moved them into public scope. - - * providers/smtp/camel-smtp-transport.c (smtp_connect): Oops. Don't - pass port # as a string in the error code (if it fails to connect). - - * providers/imap/camel-imap-folder.c (imap_append_message): Changed - over to camel_imap_command_extended as that was the source of the - problems - apparently appending replies with more than just 1 line. - -2000-07-05 Dan Winship <danw@helixcode.com> - - * camel-folder-search.c (search_header_contains): make header - matching case-insensitive - - * camel-folder-summary.c: - * camel-session.c: - * providers/mbox/camel-mbox-folder.c: - * providers/mbox/camel-mbox-summary.c: Remove some non-error case - debugging-type messages. - -2000-07-05 Ettore Perazzoli <ettore@helixcode.com> - - * providers/mbox/camel-mbox-summary.c (d): Define to empty so that - we get rid of a ton of debugging messages. - -2000-07-05 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-mime-utils.h: Added prototype for uudecode_step - - * camel-mime-utils.c (uudecode_step): Cleaned up some junk that - should have been cleaned up when debugging printf's were taken out. - -2000-07-05 Ettore Perazzoli <ettore@helixcode.com> - - * providers/mbox/camel-mbox-summary.c (camel_mbox_summary_sync): - Update the X-Evolution: header even if the in-memory UID and the - saved UID are not the same. Otherwise mboxes with clashing UIDs - can never be fixed. - - * camel-folder-summary.c - (camel_folder_summary_add_from_parser): Add the message to the - summary before doing any ibex stuff. In fact, this might also - have the side effect of reassigning the UID so it needs to be done - before we start using the UID. - - * providers/mbox/camel-mbox-folder.c (mbox_append_message): Add - debugging message to keep track of the UIDs we add. - -2000-07-05 Dan Winship <danw@helixcode.com> - - * camel-folder-summary.c: Add "Cc" to summary and bump summary - version number. - - * camel-folder-search.c (search_header_contains): make "Cc" a - searchable header. - -2000-07-03 Ettore Perazzoli <ettore@helixcode.com> - - * camel-folder-summary.c (camel_folder_summary_next_uid_string): - New. - (camel_folder_summary_add): Use - `camel_folder_summary_next_uid_string()' instead of recomputing - the UID manually here. - (camel_folder_summary_add_from_parser): Likewise. - -2000-07-03 Ettore Perazzoli <ettore@helixcode.com> - - * camel-folder-summary.c (camel_folder_summary_set_uid): Removed. - -2000-07-03 Dan Winship <danw@helixcode.com> - - * camel-folder-summary.c (message_info_new): Parse In-Reply-To - with header_references_decode, not header_msgid_decode. - - * camel-mime-message.c (camel_mime_message_class_init): message - headers are case-insensitive. - - * providers/pop3/camel-pop3-store.c (camel_pop3_command): Fix a - bug in error-setting code. - (pop3_connect): Don't re-prompt for password in the KPOP case. - (pop3_get_response): New function, split out from - camel_pop3_command. - (connect_to_server): Use pop3_get_response to parse the greeting - message, and error out appropriately if it's -ERR. - -2000-07-02 Dan Winship <danw@helixcode.com> - - * camel-folder.c (camel_folder_freeze, camel_folder_thaw): New - functions to freeze and thaw a folder (to prevent message/folder - changed signals in the middle of a long series of operations). - (camel_folder_class_init): Change signals to GTK_RUN_FIRST. - (message_changed, folder_changed): Add default implementations - that stop the emission and record info for later if the folder is - frozen. - - * providers/mbox/camel-mbox-folder.c (mbox_sync): leftover fixes - from the close->sync change: don't destroy the ibex, summary, and - search when syncing. - (append_message): emit "folder_changed" on a successful append. - -2000-07-02 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-mime-utils.c (uudecode_step): A rather complex uudecoder - written in the spirit of Zucchi-ness, is it up to par? Only the - Z-man can tell us :-) - -2000-07-01 Dan Winship <danw@helixcode.com> - - * camel-service.c (camel_service_get_name): New method, to return - an end-user-friendly name corresponding to a service. (eg, "POP - service for danw on trna.helixcode.com"). - - * providers/imap/camel-imap-store.c, - providers/mbox/camel-mbox-store.c, - providers/nntp/camel-nntp-store.c, - providers/pop3/camel-pop3-store.c, - providers/sendmail/camel-sendmail-transport.c, - providers/smtp/camel-smtp-transport.c: Implement. - - * providers/imap/Makefile.am: remove unneeded - libcamelimap_la_LDADD. - - * providers/pop3/camel-pop3-store.c (connect_to_server): fix the - CAPA-parsing code to not get into an infinite loop. - -2000-07-01 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_get_message): Fixed - the bug that would sometimes leave part of the server response - tacked on to the end of the message. - - * camel-folder.c: Renamed _by_uid methods. Since we no longer - have get-by-number methods, no need to have the _by_uid - extensions. - (get_message_by_uid): Renamed to get_message - (delete_message_by_uid): Renamed to delete_message - (summary_get_by_uid): Renamed to get_message_info - - * providers/mbox/camel-mbox-folder.c: - * providers/pop3/camel-pop3-folder.c: - * providers/imap/camel-imap-folder.c: - * providers/vee/camel-vee-folder.c: Updated to reflect - camel-folder changes. - -2000-06-30 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-folder.c (camel_folder_copy_message_to): New function, to - copy a message from one folder to another. The default - implementation just uses append_message, but providers can - implement more efficient versions for use when both folders are on - the same store. - - * broken-date-parser.[c,h]: Utilities for parsing broken - date strings. - - * providers/imap/camel-imap-folder.c (imap_move_message_to): - (imap_copy_message_to): Implemented. - - * camel-mime-utils.c (header_decode_date): Wrote some code to try - and un-mangle broken date formats and then parse that new string - instead. - -2000-06-30 Dan Winship <danw@helixcode.com> - - * camel-folder.c (camel_folder_move_message_to): New function, to - move a message from one folder to another. The default - implementation just uses append_message and delete_message, but - providers can implement more efficient versions for use when both - folders are on the same store. - -2000-06-29 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_expunge): Should now - print a meaningful error message when it doesn't succeed - -2000-06-28 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c (imap_connect): Changed to - keep prompting user for a valid password until it either - authenticates or until Canceled by the user. - (camel_imap_command_extended): Improved speed (replaced the - g_strjoinv call with a faster implementation) - - * providers/pop3/camel-pop3-store.c - (camel_pop3_command_get_additional_data): Fixed. - (pop3_connect): Changed to keep prompting the user for a - password until it either works or until Canceled by the user. - - * providers/mbox/camel-mbox-summary.c: General cleanup - (camel_mbox_summary_sync): Fixed a memory leak and added - CamelException handling. - - * providers/mbox/camel-mbox-store.c (delete_folder): Fixed a - memory leak - - * providers/mbox/camel-mbox-folder.c (mbox_append_message): - Default 'off_t seek' to -1 so as to make sure it's initialized - before it's used in the case of a bad stat() call. - (mbox_sync): Updated - (mbox_expunge): Updated - -2000-06-27 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c (imap_connect): Move the - CAPABILITY command here so we don't have to keep checking - each time we open a folder. - (camel_imap_command_extended): If we are doing an EXAMINE, - don't bother doing a SELECT first. - - * providers/imap/camel-imap-folder.c (imap_init): Update so - folder->has_search_capability depends on the parent IMAP store - (since this is really dependant on the IMAP implementation and - not the folder) - -2000-06-27 Christopher James Lahey <clahey@helixcode.com> - - * providers/smtp/camel-smtp-transport.c: Don't close the filter - stream when done with it (this causes the source stream to close); - Instead, just flush it when done. - -2000-06-27 Michael Zucchi <zucchi@zedzone.mmc.com.au> - - * camel-folder-search.c (search_header_contains): Make header - search 'to' match 'to', and not 'from', small typo, fixes #317. - -2000-06-26 Christopher James Lahey <clahey@helixcode.com> - - * providers/mbox/camel-mbox-summary.c: Added debugging - information. - -2000-06-23 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c: - * providers/imap/camel-imap-folder.c: Improved folder parsing. - Not specifying a namespace should no longer list the entire - filesystem. - -2000-06-22 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/.cvsignore: ignore test-newsrc - - * providers/nntp/camel-nntp-store.c, - providers/nntp/camel-nntp-store.h, - providers/nntp/camel-nntp-folder.c, - providers/nntp/camel-nntp-folder.h, - providers/nntp/camel-nntp-utils.c: Bring the nntp provider up to a - state where it builds and is usable with the current camel. there - are still warts (semi-broken .newsrc file handling, and a lack of - a subscribe ui -- in fact no way to add a new server, really), but - it'll display news messages. - - * providers/nntp/Makefile.am (libcamelnntp_la_SOURCES): add - camel-nntp-newsrc.c - (libcamelnntpinclude_HEADERS): add camel-nntp-newsrc.h - also, add test-newsrc stuff. - - * providers/nntp/test-newsrc.c: new file that tests the newsrc - stuff by parsing and regurgitating a .newsrc file for a particular - server. - - * providers/nntp/camel-nntp-newsrc.c, - providers/nntp/camel-nntp-newsrc.h: new files, initial support for .newsrc files. - -2000-06-22 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_get_message_count): - Oops. Now appends the namespace to the folder before querying - for the number of messages. - - * providers/imap/camel-imap-store.c (imap_folder_exists): New - convenience function for use by imap_create(). - (get_folder): If folder is specified as "/", we really want - "INBOX". - - * providers/sendmail/camel-sendmail-provider.c: - * providers/vee/camel-vee-provider.c: - * providers/smtp/camel-smtp-provider.c: - * providers/mbox/camel-mbox-provider.c: - * providers/pop3/camel-pop3-provider.c: - * providers/imap/camel-imap-provider.c: Updated - - * camel-session.c: Moved service_cache hash table into the - providers. - (service_cache_remove): Updated. - (camel_session_get_service): Updated. - - * camel-url.c (camel_url_hash): Took out the hashing of - url->passwd. We don't want this anymore. - - * providers/imap/camel-imap-folder.c (imap_init): Took out - references to 'namespace' - (camel_imap_folder_init): Same - - * providers/imap/camel-imap-folder.h: No more namespace. We are - instead going to use url->path as the namespace. - -2000-06-21 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c (imap_create): Modified to - use the "namespace" (url->path) if it exists. - - * providers/imap/camel-imap-folder.c (imap_delete_message_by_uid): - Now just sets the deleted flag on the summary rather than speaking - directly to the IMAP server. This is both faster and cleaner. - -2000-06-21 Dan Winship <danw@helixcode.com> - - * providers/pop3/camel-pop3-store.c (query_auth_types): Fix dumb - bug. - -2000-06-21 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_get_message_by_uid): - We are getting mail in IMAP now!! whoo-hoo!. Stripped out the - filtering so messages may have some dot-stuffing, but the - filtering can always be added back in later when we know it - works and isn't the problem. - -2000-06-21 Peter Williams <peterw@curious-george.helixcode.com> - - * providers/mbox/camel-mbox-folder.c (mbox_init): Use the basename - of the mailbox so we don't get pathnames like ~/evolution/inbox///movemail.ibex - -2000-06-21 Dan Winship <danw@helixcode.com> - - * camel-folder-summary.c (message_info_new): Set date_received - based on the first (most recent) "Received" header. - -2000-06-20 Dan Winship <danw@helixcode.com> - - * camel-mime-part.c (write_to_stream): flush the filter stream - before unreffing it, so it will camel_mime_filter_complete. - - * camel-stream-filter.c (camel_stream_filter_class_init): Fix a - braino so camel_stream_flush works here. - - * camel-stream-mem.c (stream_seek): Fix a bug that resulted in - large attachments being silently dropped. - - * providers/pop3/camel-pop3-store.c - (camel_pop3_command_get_additional_data): Don't use g_strjoinv - here, since it is O(n^2) on the length of the output string, and - we can do O(n). - - * camel-mime-part-utils.c - (simple_data_wrapper_construct_from_parser): add a CRLF decoder - after the QP/B64 decoder if it's text. - -2000-06-20 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_get_summary): Only - fetch the summary if the folder summary doesn't already exist. - When the summary *does* exist, start fetching from 1, not 0. - (imap_free_summary): Don't do anything here. - (imap_finalize): Free the summary here instead of in - imap_free_summary(). - (imap_set_message_flags): Implemented - (imap_sync): Added code to set flags on messages that have had - their flags changed (however I #if'd it out until we are more - confidant in the IMAP code :) - (imap_summary_get_by_uid): Now parese flags correctly. - (imap_get_summary): Now parese flags correctly. Also correctly - parses the UID correctly. - - * camel-url.c (check_equal): No need to check s1 if s2 is NULL - (camel_url_equal): Don't check the passwd component of the url. - -2000-06-20 Dan Winship <danw@helixcode.com> - - * camel-folder-summary.c (camel_folder_summary_add): mark the - message info with CAMEL_MESSAGE_FOLDER_FLAGGED if we change the - uid, so the folder will know that it's dirty. - -2000-06-20 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c (camel_imap_command_extended): - Now returns the last line of data that the server sends back as - well. This is needed for commands like SELECT (like Peter pointed - out). - (camel_imap_command): No longer checks for SELECT (no need) - - * providers/imap/camel-imap-folder.c: Added namespace stuff - which we will need later on... - (imap_parse_subfolder_line): Convenience function for use in - get_subfolder_names() - (imap_get_subfolder_names): Updated. Also changed it to use LIST - instead of LSUB (temporary change). - -2000-06-19 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (camel_imap_folder_init): Set - summary equal to NULL. - (imap_get_summary): Store the summary in the ImapFolder - (imap_summary_get_by_uid): If we have a summary cache in the - ImapFolder, first check to see if that message info is in the - cached summary first, if not fetch it directly from the IMAP - server and append it to the summary cache. - (imap_get_message_flags): Don't free the message info that we get - back from summary_get_by_uid as we don't want to be corrupting our - cached summary. - -2000-06-19 Peter Williams <peterw@curious-george.helixcode.com> - - * providers/imap/camel-imap-store.c (camel_imap_command{,_extended}): When - SELECT'ing a folder for an IMAP command, use _extended to grab the entire - response (before we just used camel_imap_command and missed the OK codes) - -2000-06-18 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_summary_get_by_uid): - Now gets the message flags as it should. - (imap_get_summary): Same as imap_summary_get_by_uid - (imap_get_permanent_flags): Return the permanent flags stored - on the folder. - (imap_get_message_flags): Return message flags associated with - given uid. Note: we may want to somehow cache summary info so - that we don't have to keep querying the IMAP provider in - imap_summary_get_by_uid(). - -2000-06-17 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_free_summary): We were - leaking memory - but not anymore! - (imap_get_summary): We now get the UIDs and the beginnings of the - code to get the message flags as well. - -2000-06-17 Dan Winship <danw@helixcode.com> - - * camel-mime-parser.c (folder_scan_header): Don't copy newlines - into the parsed header text, and turn any number of tabs and - spaces after a newline into a single space. - -2000-06-17 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_init): Should now - correctly do CAPABILITY. - -2000-06-17 Dan Winship <danw@helixcode.com> - - * providers/mbox/camel-mbox-summary.c: Add some debugging printfs - when rebulding summary to help figure out why people's summaries - are always being rebuilt. - -2000-06-17 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_search_by_expression): - Began to implement, need to get information on how to - deconstruct @expression into an IMAP search expression and - parse the results. - (imap_init): Now queries the IMAP provider for CAPABILITY to - determine if SEARCH is implemented or not. - - * providers/imap/imap.c: Removed - no longer a need to have - this as an example for anyone interesting to help mecode IMAP - support. - -2000-06-16 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_sync): Added code - to expunge if called for (still need to finish coding this). - (imap_get_uids): Implemented. - (imap_get_summary): Found a way to get the date - (imap_summary_get_by_uid): Same. - (imap_free_summary): Implemented. - - * string-utils.c (strstrcase): Fixed a compile warning - - * providers/imap/camel-imap-summary.c: Removed - we don't - need a CamelImapSummary structure. - -2000-06-16 Dan Winship <danw@helixcode.com> - - Move flag handling from CamelMimeMessage to CamelFolder. This - simplifies several flag-handling pieces of code in the mailer, and - lets you change a message's flags without having to fetch the - message body. It also means that fully-constructed - CamelMimeMessages are now essentially constant, which will help - simplify locking issues later since it means two threads - interested in the same message can just work with separate copies - of it. - - * camel-mime-message.h (struct _CamelMimeMessage): Removed flags - and user_flags (moved to summary). Removed expunged and - message_number which were unused. Removed message_uid and folder - which are no longer needed in the new scheme. - (struct CamelMimeMessageClass): Removed message_changed signal and - get/set_message_number methods. - - * camel-mime-message.c: Updates for CamelMimeMessage changes. - (camel_mime_message_get/set_flags, - camel_mime_message_get/set_user_flag): Replaced with methods in - CamelFolder. - (camel_flag_get, camel_flag_set, camel_flag_list_size, - camel_flag_list_free): Moved verbatim to camel-folder-summary.c - - * camel-folder.c (camel_folder_get/set_message_flags, - camel_folder_get/set_message_user_flag): New methods (and - corresponding useless default implementations) - (camel_folder_class_init): add a message_changed signal - - * camel-folder-summary.c (camel_flag_get, camel_flag_set, - camel_flag_list_size, camel_flag_list_free): Moved here from - camel-mime-message.c - - * providers/mbox/camel-mbox-folder.c (message_changed): Removed. - (mbox_get_message_flags, mbox_set_message_flags, - mbox_get_message_user_flag, mbox_set_message_user_flag): Tweak - summary bits as appropriate. (Functionality moved here from - message_changed.) - (mbox_get_message_by_uid): Update for CamelMimeMessage changes - (less stuff to initialize). - - * providers/imap/camel-imap-folder.c (message_changed): Remove - this. It was just copied from the mbox provider and doesn't deal - with the real IMAP flag stuff anyway. (So there's currently no - flag support in the IMAP provider.) - (imap_get_message_by_uid): Update for CamelMimeMessage changes. - - * providers/vee/camel-vee-folder.c: (message_changed): Remove old - one. Add a new one to listen for message_changed on each folder - and re-emit message_changed signals that correspond to messages in - the vfolder. - (vee_get/set_message_flags, vee_get/set_message_user_flag): Proxy - flag setting to the underlying real messages. - (vee_append_message): Removed for now; there's no way to translate - this into the new CamelMimeMessage/CamelFolder scheme, but (a) - there's also no code which would ever call it and (b) we're - probably going want a better interface than append_message for - message drag and drop to work anyway. To be revisited. - -2000-06-16 Dan Winship <danw@helixcode.com> - - * camel-mime-utils.c (rfc2047_decode_word): - * camel-mime-part-utils.c (simple_data_wrapper_construct_from_parser): - * camel-folder-summary.c (summary_build_content_info): - KLUDGE! Since neither ETable nor GtkHTML supports UTF-8 yet, - output ISO-8859-1 instead, so Ettore can read his Italian mail. :) - This will be reverted later. - -2000-06-15 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_get_summary): Started to - implement - may want to use ENVELOPE instead of BODY.PEEK[HEADER] - (imap_summary_get_by_uid): Started to code, I've got to find a way to - get the date in time_t format and also get the flags - - * string-utils.c (strstrcase): Added this convenience function - I - know about strcasestr() but it's not portable. - -2000-06-15 Dan Winship <danw@helixcode.com> - - * camel-service.c: Remove camel_service_connect_with_url. (URLs - must be specified when the service is requested from the session, - so that there can only ever be one service for any URL.) - - * camel-folder.c: (camel_folder_open, camel_folder_is_open, - camel_folder_get_mode): Kill. Folders are now always open, and - handle "closing" sorts of operations at sync or finalize time. - (camel_folder_sync): renamed from camel_folder_close. Syncs state - to the store but doesn't necessarily close/disconnect. - - * providers/*/camel-*-folder.c: Merge "open" methods into "init" - methods. Rename close to sync and update appropriately. - - * providers/imap/camel-imap-store.c: Remove camel_imap_store_open - and camel_imap_store_close, which should not have been copied from - the POP provider (where the exist to work around limitations of - the POP protocol). - - * providers/mbox/camel-mbox-summary.c: fix a bug. (don't expunge - deleted messages if called with expunge == FALSE) - - * providers/pop3/camel-pop3-store.c (connect_to_server): Check - server for various interesting extensions. - - * providers/pop3/camel-pop3-folder.c (get_uids): If the server - supports UIDL, use real UIDs rather than fake ones. - (etc): Map uids back to numbers appropriately - - * providers/mbox/camel-mbox-folder.c (mbox_append_message): Fix to - previous change: make sure the "seek" variable ends up with the - value it should. - - * providers/mbox/camel-mbox-summary.c (summary_rebuild): Update - summary mtime as well as size. - -2000-06-14 Dan Winship <danw@helixcode.com> - - * providers/mbox/camel-mbox-folder.c (mbox_append_message): if the - mbox doesn't end with a '\n', write one before appending the new - message. - -2000-06-14 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-mime-filter-crlf.c (filter): Updated the encoder to allocate - more memory (since we are also now adding dots). Also updated the - decoder as we have found that it sometimes passes the end of the - buffer. - - * providers/pop3/camel-pop3-folder.c (get_message_by_uid): Took out the - filter code (we already filter in - camel_pop3_command_get_additional_data) - - * camel-folder.c (init): Updated: a separator is now a char* rather - than a single char because IMAP can have a string for a directory - separator. Also, since IMAP does not begin with a directory separator, - there is a new argument (path_begins_with_sep) which decides if a - directory should begin with a directory separator. - - * providers/imap/camel-imap-store.c (imap_create): Since, on connect, - Camel tries to create INBOX (which already exists on every IMAP - provider) we can return TRUE when the folder name is "INBOX". - - * providers/vee/camel-vee-folder.c (vee_init): Updated. - - * providers/imap/camel-imap-folder.c (camel_imap_folder_new): Updated. - - * providers/mbox/camel-mbox-store.c (get_folder): Updated. - - * providers/mbox/camel-mbox-folder.c (mbox_init): Updated. - - * providers/pop3/camel-pop3-folder.c (camel_pop3_folder_new): Updated. - -2000-06-14 Dan Winship <danw@helixcode.com> - - * providers/mbox/camel-mbox-summary.c (camel_mbox_summary_sync): - Renamed from camel_mbox_summary_expunge. Takes a gboolean saying - whether to expunge or just sync the mbox file. Change some - g_errors to g_warning so we don't abort. Make the quick - X-Evolution updating code lseek around correctly. Update the - mbox mtime in the summary file even in the quick case. - - * providers/mbox/camel-mbox-summary.h: make - CAMEL_MESSAGE_FOLDER_NOXEV not conflict with - CAMEL_MESSAGE_FOLDER_FLAGGED defined in camel-mime-message.h - - * providers/mbox/camel-mbox-folder.c (mbox_close): call - camel_mbox_summary_sync to save flag state if not expunging. - (mbox_expunge): Update for camel_mbox_summary_expunge rename. - -2000-06-13 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c (camel_imap_store_open): - (camel_imap_store_close): Added. - (camel_imap_command_extended): Fixed a segfault and updated - to use camel_imap_status() - (camel_imap_command): Updated to use camel_imap_status() - (camel_imap_status): New convenience function for parsing - the return status of an IMAP command - -2000-06-12 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c (imap_get_message_by_uid): - Works like the POP fetch code, should work temporarily until - we get around to coding it the way it "Should Be". - - * providers/pop3/camel-pop3-folder.c (get_message_by_uid): Now uses - the camel-mime-filter-crlf decoder when retrieving messages. - - * camel-mime-filter-smtp.c: Deprecated. - - * providers/smtp/camel-smtp-transport.c (smtp_data): Updated to use - camel-mime-filter-crlf with my 'dot' extension in place of - camel-mime-filter-smtp - - * camel-mime-part.c (write_to_stream): Updated to reflect changes - made to camel-mime-filter-crlf.c - - * camel-mime-filter-crlf.c (filter): Modified to be able to - encode/decode dots ("\n.\n"<->"\n..\n"). Also fixed the decoder - so that it should no longer get caught in an infinite loop. - -2000-06-12 Dan Winship <danw@helixcode.com> - - * providers/*/Makefile.am: don't pass a second (incorrect) -rpath - in addition to the (correct) one automatically provided by - automake. - - * camel-mime-filter-crlf.c: New filter to do CRLF<->LF conversion. - (Currently only tested in the LF->CRLF direction.) - - * camel-mime-part.c (write_to_stream): if content-type is text, - and it's QP or B64 encoded, pass through the CRLF filter before - the other filter to satisfy the "canonical encoding" rules in the - MIME spec. - -2000-06-09 Dan Winship <danw@helixcode.com> - - * camel-session.c (camel_session_query_authenticator): Add another - argument, "mode", which can be CAMEL_AUTHENTICATOR_ASK or - CAMEL_AUTHENTICATOR_TELL, so callers can get the app to un-cache - bad info. - - * providers/pop3/camel-pop3-store.c (pop3_connect): uncache the - password if it doesn't work. - -2000-06-09 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-stream.c (stream_read): Updated to reflect - changes made in camel-imap-store.c - - * providers/imap/camel-imap-store.c (imap_create): No longer checks to - make sure a folder doesn't already exists (as this is no longer needed) - (camel_imap_command): Now takes a CamelFolder argument so it can detect - whether or not it needs to SELECT a folder or not - (camel_imap_command_extended): Same. - - * providers/smtp/camel-smtp-transport.c (smtp_connect): Will now always - send EHLO first, if that fails it will fall back on HELO. - (esmtp_get_authtypes): Should now correctly parse authtypes. - -2000-06-07 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-summary.c: Now builds (not that it's worth - much yet). - - * providers/imap/camel-imap-folder.c (imap_get_uids): Now uses the - correct cast to a CamelImapMessageInfo structure (should get rid of - compile warnings). - - * providers/imap/Makefile.am: Added rules to build - camel-imap-stream - - * providers/imap/camel-imap-store.c (get_folder): Update. - Moved imap_create here. - - * providers/imap/camel-imap-folder.c (delete_messages): Remove. - (imap_create): Removed. - (imap_delete): Removed. - (imap_exists): Removed. - - * providers/imap/camel-imap-stream.h: Added typedef's for the stream - - * providers/imap/camel-imap-stream.c: Modified to build cleanly - -2000-06-07 Not Zed <NotZed@HelixCode.com> - - * camel-mime-utils.c (header_msgid_decode_internal): Properly - dereference warning/debug messages. - (header_references_decode): Check we actually have msgid stuff - before trying to decode it ... - -2000-06-06 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-imap-stream.[c,h]: Removed - - * providers/imap/camel-imap-stream.[c,h]: Relocated to this - location - - * providers/imap/camel-imap-summary.c: Added - -2000-06-06 Dan Winship <danw@helixcode.com> - - * camel-folder.c: Remove exists, create, delete. A CamelFolder - now always references an existing folder. Remove delete_messages - too since it wasn't being used. Add a "create" flag to - get_subfolder saying whether or not to create the subfolder if it - doesn't yet exist. - - * camel-store.c (camel_store_get_folder): Add a "create" flag to - say whether or not to create the folder if it doesn't yet exist. - (camel_store_delete_folder): New method, moved from CamelFolder. - (cache_folder, uncache_folder): Fix up a bit. - (get_folder_name): Explain what this is for. - - * providers/mbox/camel-mbox-folder.c: - * providers/mbox/camel-mbox-store.c: Update. Remove support for - hierarchical folders to simplify this for now, since we're not - using it, and it's not completely clear how they should work in an - ELocalStorage world. Needs to be revisited. - - * providers/pop3/camel-pop3-folder.c (delete_messages): Remove. - * providers/pop3/camel-pop3-store.c (get_folder): Update. - - * providers/vee/camel-vee-folder.c (exists): Remove. - * providers/vee/camel-vee-store.c (vee_get_folder): Update. - -2000-06-06 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-*.[c,h]: Started on getting - imap to build cleanly (tho some work has not been completed - so it still won't build until camel-imap-summary is finished - along with a few methods in camel-imap-folder) - - * camel-stream.[c,h]: Changed the read and write method prototypes - to return an ssize_t type rather than an int and also changed - the 'number of bytes' to read or write to a size_t type - - * camel-stream-fs.c: same as above - - * camel-stream-mem.c: again, same as above - - * camel-stream-buffer.c: same - - * camel-imap-stream.[c,h]: Added this new stream, cache's previously - read data so each successive call will instead read from the cache - -2000-06-05 Dan Winship <danw@helixcode.com> - - * camel-mime-part.c (camel_mime_part_set_disposition): fix - typo/braino (set "Content-Disposition", not "Content-Description") - (camel_mime_part_set_filename): const poison - -2000-06-02 Not Zed <NotZed@HelixCode.com> - - * camel-mime-utils.c (base64_encode_step): Ick, damn signs! Fix a - bug with sign extended bytes. - - * camel-mime-filter-smtp.c (filter): Changed layout/logic slightly - (to match From filter) - -2000-06-02 Jeffrey Stedfast <fejj@helixcode.com> - - * camel-mime-filter-smtp.c (filter): Fixed the filter so that it - wouldn't insert garbage under certain conditions. - -2000-06-02 Christopher James Lahey <clahey@helixcode.com> - - * camel-session.c: Don't ref the services in the cache. - -2000-06-02 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/smtp/camel-smtp-transport.c: Rearanged where debug - fprintf statements we placed so that any data the server sends - back is printed out before an exception is set and the function - returns. - -2000-06-02 Not Zed <NotZed@HelixCode.com> - - * camel-mime-utils.c (header_decode_date): If we get a funny - result, just throw it out. Basically a fix for the one true - broken TradeClient. - -2000-06-01 Not Zed <NotZed@HelixCode.com> - - * camel-folder-summary.c (message_info_free): Free - references/messsage id. - (message_info_save): Save them. - (message_info_load): Load them. - (message_info_new): And get them from the new message. - (CAMEL_FOLDER_SUMMARY_VERSION): Bumped for new changes. - - * camel-folder-summary.h: Added references and messageid to - summary. - -2000-06-02 Christopher James Lahey <clahey@helixcode.com> - - * camel-session.c: Ref and unref objects in the service cache - properly. - - * camel-store.c: Ref the folder when returning it using - lookup_folder. Used the folder's full name for the key for the - folder cache since that's used to uncache it. - -2000-06-02 Dan Winship <danw@helixcode.com> - - Fun with purify. - - * providers/pop3/camel-pop3-store.c (pop3_connect): free msg on - success as well as failure. - (camel_pop3_command_get_additional_data): free buf after reading - the last line ("."). - - * providers/pop3/camel-pop3-folder.c (get_message_by_uid): free - body data after creating the memstream from it (which will copy - the data). - - * providers/mbox/camel-mbox-folder.c (mbox_finalize): free summary - and index paths. - - * camel-data-wrapper.c (finalize): unref the stream, if it exists. - -2000-06-01 Not Zed <NotZed@HelixCode.com> - - * camel-mime-part.c (construct_from_parser): For a message part, - set the default content-type to message/rfc822. Maybe needs to be - done for multiparts too? - -2000-05-31 Not Zed <NotZed@HelixCode.com> - - * camel-mime-message.c (construct_from_parser): Typo in assersion. - - * camel-mime-parser.c (folder_scan_step): Use a default type of - message/rfc822 for multipart/digest. Bug Z192. - (folder_scan_drop_step): Remove warning. - -2000-05-30 Not Zed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-folder.c (mbox_append_message): Init - filter_from to NULL, for exception case. - (mbox_get_message_by_uid): Cast off_t to long int for diagnostics. - - * camel-url.c (camel_url_hash): Hash funciton for using camel - url's as hash keys. - (camel_url_equal): equal function for same. - - * camel-session.c (camel_session_finalise): Free cached services. - (camel_session_init): Init service cache. - (service_cache_remove): destroy callback to remove a service from - the cache. - - * camel-store.c (get_folder_internal): Remove the extra ref of the - folder. That seems the right behaviour ...? - (camel_store_get_type): Doh, actually call store init, so the - cache works. - (cache_folder): strdup the folder name! no wonder it never found - it again. - -2000-05-30 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-folder.c: Implemented a few more - methods like imap_append and 1 or 2 others - -2000-05-29 Not Zed <NotZed@HelixCode.com> - - * camel-store.c (camel_store_init): Move it to here. If this - level is going to maintain it, it should set it up. Lets see what - caching folders breaks :( - - * providers/pop3/camel-pop3-store.c (camel_pop3_store_init): Dont - init folder cache here. - - * providers/mbox/camel-mbox-summary.c - (camel_mbox_summary_expunge): Make sure we copy messages which are - still intact to the new folder. - (camel_mbox_summary_expunge): Update the frompos as well when - moving the content. - (camel_mbox_summary_expunge): Remove some debug, and dont offset - frompos? - - * providers/vee/camel-vee-folder.c (vee_folder_build): Check the - searched folder is open before trying to search it. - (message_changed): Track changes to the source message in the - summary. - (folder_changed): Track folder changes, re-query the folder that - changed, and cascade the changed event as well. - (camel_vee_folder_finalise): Free subfolder and subfolder summary. - -2000-05-29 Dan Winship <danw@helixcode.com> - - * camel-service.c (camel_service_new): Fix up some glib - precondition stuff. Try to set the URL in camel_service_new before - checking whether or not it's "empty" so that you can successfully - set "sendmail:" as a URL. - -2000-05-28 Dan Winship <danw@helixcode.com> - - * camel-provider.h: Add a domain field to CamelProvider, to say - what kind of data it provides. - - * providers/imap/camel-imap-provider.c: - * providers/mbox/camel-mbox-provider.c: - * providers/pop3/camel-pop3-provider.c: - * providers/sendmail/camel-sendmail-provider.c: - * providers/smtp/camel-smtp-provider.c: Set domain to "mail". - - * providers/nntp/camel-nntp-provider.c: Set domain to "news". - - * providers/vee/camel-vee-provider.c: Set domain to "vfolder". (So - it doesn't end up being listed as a potential mail source in the - mail config wizard.) - - * providers/pop3/camel-pop3-store.c: Split apart password and APOP - auth, since some servers seem to do both, but don't really. - (connect_to_server): Renamed from try_connect. Now actually does - the connection up to the point of checking the greeting for APOP - support. - (query_auth_types): Return APOP, if appropriate. Call - pop3_disconnect after connect_to_server since we don't really want - to be connected. - (pop3_connect): Use connect_to_server rather than duplicating - code. Fix a one-byte buffer overrun in the APOP code. - (pop3_disconnect): Make this able to clean up after a partial - connect. - (connect_to_server): Remove port number from error message since - it's not terribly useful and we were getting it from the wrong - place anyway. - - * camel-mime-utils.c (header_address_list_format_append): Use - `foo@bar' rather than `"" <foo@bar>' for email addresses with no - name component. - -2000-05-27 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c: Removed - camel_imap_command_get_additional_data() as it was - completely useless, replaced with - camel_imap_command_extended() which may eventually replace - camel_imap_command() as well. - - * providers/imap/camel-imap-store.h: Modified to reflect - changes made to camel-imap-store.c - - * providers/imap/camel-imap-folder.c: Wrote the first of many - methods: camel_imap_init(), imap_open(), imap_expunge(), - imap_get_message_count(), and imap_get_subfolder_names() - -2000-05-26 Dan Winship <danw@helixcode.com> - - * camel-multipart.c (camel_multipart_init): Don't set a default - boundary. Require the caller to do that. - (set_boundary): if boundary is NULL, generate a "random" boundary. - - * camel-mime-part-utils.c - (camel_mime_part_construct_content_from_parser): Add a call to - camel_multipart_set_boundary after creating a new multipart. - -2000-05-25 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap/camel-imap-store.c (try_connect): Removed - Exception code - Pop doesn't seem to set exceptions - - * providers/imap/camel-imap-folder.c: Initial code, mostly - just a template for future code - - * providers/imap/imap.[c,h]: Source code from my personal - mailer - for reference only! - -2000-05-25 NotZed <NotZed@HelixCode.com> - - * camel-mime-part-utils.c - (camel_mime_part_construct_content_from_parser): Replace simple - data wrapper here too, oops. - - * Makefile.am (libcamel_la_SOURCES): Removed - camel-simple-data-wrapper again. Less code to maintain == better - code. - - * camel-data-wrapper.c (construct_from_stream): Fixes for bug - where text attachments dont work. Made data-wrapper concrete for - the second time. - -2000-05-23 NotZed <NotZed@HelixCode.com> - - * providers/vee/camel-vee-folder.c (vee_folder_build_folder): - Update the vfolder details for a single folder. - -2000-05-25 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/smtp/camel-smtp-transport.c (_send_to): Took out code - that had been there to reconnect to the server if it was not - already connected - Mailer code was fixed so that this should not - be needed. - - * providers/imap/camel-imap-store.[c,h]: Initial code. - -2000-05-24 Dan Winship <danw@helixcode.com> - - * camel.h: Re-add camel-simple-data-wrapper.h, which was removed - for some reason. - -2000-05-24 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/smtp/camel-smtp-transport.[c,h]: Moved global - variables into struct CamelSmtpTransport to make SMTP - thread-safe - - * providers/imap/camel-imap-*.h: Stolen from Mbox. Rough structure - for Imap. - -2000-05-23 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/imap: Added some initial code to the camel tree - for IMAPv4 - - * providers/imap/.cvsignore: Added to repository - - * providers/smtp/camel-smtp-transport.c: Added debug fprintf's - so that testers can provide more information. Tested with simple - messages and a reply to the hello@helixcode.com default message - but should really be tested more. - (smtp_data): Fixed to use data_wrapper_write_to_stream. - - * camel-mime-filter-smtp.c (filter): Modified to escape all lines - beginning with a '.' and to place a \r before each \n if one did - not previously exist. Removed code to escape "From " as it was - found to not be needed for SMTP. - -2000-05-22 Jeffrey Stedfast <fejj@helixcode.com> - - * providers/smtp/camel-smtp-transport.c (smtp_data): Fixed the - filtered stream. Fixes for stream changes, updated to use - camel-mime-filter-smtp. - - * Makefile.am: Added camel-mime-filter-smtp.c - - * camel-mime-filter-smtp.[c,h]: Added to camel tree - Smtp filter used to change \n into \r\n, escape lone dots, - and escape "From "'s. - -2000-05-19 NotZed <NotZed@HelixCode.com> - - * camel-simple-data-wrapper.c (construct_from_stream): If we - already have been constructed, unref our content. - (write_to_stream): Check we've been constructued, and change for - stream api changes. - - * camel-mime-parser.c: Removed exception stuff. - - * md5-utils.c (md5_get_digest_from_stream): repaired. - - * camel-mime-message.c: Remove exception from write_to_stream, and - fix, and fix formatting. - - * providers/sendmail/camel-sendmail-transport.c (_send_internal): - Fix for stream changes. - - * providers/pop3/camel-pop3-store.c (camel_pop3_command): Fixes - for stream changes. - - * providers/mbox/camel-mbox-folder.c, and elsewhere, fix all - stream api changes. - (mbox_append_message): Use stream_close() now its back. - (mbox_append_message): unref the from filter. - - * camel-stream-mem.c: And here. - - * camel-stream-fs.[ch]: Here too. - - * camel-stream-filter.c: Likewise. This is getting tedious. - - * camel-stream-buffer.c (stream_write): Fix a few little problems. - (stream_close): Reimplement. - (camel_stream_buffer_read_line): Slightly more efficient version, - that also only allocates the right amount of memory for strings. - - * camel-seekable-substream.c: Likewise. - - * camel-seekable-stream.[ch]: Remove exceptions, fix formatting, - changes for stream (re)fixes. set_bounds returns an error. - - * camel-stream.[ch]: Remove exceptions. Make flush and reset return - an error code, repair all the screwed up formatting, and put back - close. - - * camel-mime-part-utils.c - (camel_mime_part_construct_content_from_parser): And here. - - * camel-mime-part.c (camel_mime_part_set_content): And this too. - (write_to_stream): Fixed for stream changes. - - * camel.h: Fixed. - - * providers/vee/camel-vee-folder.c (vee_search_by_expression): - Implement. Performs an intersection of the two searches. - (camel_vee_folder_finalise): Unref search folders. - (vee_append_message): Implement append. - -2000-05-18 Dan Winship <danw@helixcode.com> - - * camel-folder.c: remove message_number_capability and require uid - capatibility. - (camel_folder_list_subfolders, camel_folder_get_uid_list, - camel_folder_get_subfolder_info, camel_folder_get_message_info): - removed - (camel_folder_get_subfolder_names, - camel_folder_free_subfolder_names): new subfolder interfaces. - (camel_folder_get_uids, camel_folder_free_uids): new uid - interfaces - (camel_folder_get_summary, camel_folder_free_summary): new summary - interfaces - - * providers/mbox/camel-mbox-folder.c, - * providers/nntp/camel-nntp-folder.c: - * providers/vee/camel-vee-folder.c: Update for changes - - * providers/pop3/camel-pop3-folder.c: Implement get_uids, update - for other changes. - -2000-05-18 NotZed <NotZed@HelixCode.com> - - * providers/vee/camel-vee-folder.c: Guess! - - * camel-folder-search.c (search_user_flag): Implement user_flag - search term. - - * camel-folder-search.h: Added user_flag search capability - (user-flag "blah") - - * providers/mbox/camel-mbox-folder.c (mbox_init): Set USER flag in - permanent flags for the folder. - -2000-05-17 Dan Winship <danw@helixcode.com> - - * camel-folder.c: Remove unused async open/close and - copy_message_to functions. - Rename functions without initial _. Fix glib preconditions and - gtk-doc comments. - -2000-05-17 Dan Winship <danw@helixcode.com> - - * camel-data-wrapper.c: remove get/set_output_stream operations. - They're redundant with write_to_stream, and CamelMimePart and - CamelMimeMessage only implement the latter, meaning that trying to - get_output_stream on a CamelMimeMessage that was built from pieces - rather than being parsed from a stream doesn't work. Anything that - uses get_output_stream can be rewritten to use write_to_stream, so - we'll standardize on that. - (camel_data_wrapper_new): remove this: CamelDataWrapper is - supposed to be an abstract class. - (write_to_stream): remove default implementation. (Moved to - CamelSimpleDataWrapper) - - * camel-simple-data-wrapper.c: resurrect, although it's not really - the same thing it was before. A simple data wrapper, which is - backed by a CamelStream. - - * camel-mime-part-utils.c - (simple_data_wrapper_construct_from_parser): Use - construct_from_stream rather than set_output_stream. - (camel_mime_part_construct_content_from_parser): Change - camel_data_wrapper_new to camel_simple_data_wrapper_new. - - * camel-mime-part.c (camel_mime_part_set_content): Change - camel_data_wrapper_new to camel_simple_data_wrapper_new. - - -2000-05-17 Darin Adler <darin@eazel.com> - - * camel-folder-summary.c: (message_info_load): - Quick fix to get it to compile. I hope I don't get into trouble. - -2000-05-17 Dan Winship <danw@helixcode.com> - - * camel.h: Don't include the no-longer-distributed - possibly-to-be-removed headers. - - * providers/smtp/camel-smtp-transport.c - (smtp_get_email_addr_from_text): fix an off-by-one error in - address parsing - (smtp_data): use camel_data_wrapper_get_output_stream rather than - data_wrapper->output_stream - -2000-05-17 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-folder.c (message_changed): Snoop - changes to user flags on the message into the summary as well. - - * providers/mbox/camel-mbox-summary.c (camel_mbox_summary_init): - Changed version init to include the parent class version info - (i.e. add it not overwrite it). - - * camel-folder-summary.c (message_info_new): Initialise user_flags - to empty. - (message_info_load): And load user flags. - (message_info_save): And save user flags. - (message_info_free): And free them. - (CAMEL_FOLDER_SUMMARY_VERSION): Bumped file revision. - - * camel-folder-summary.h: Added user-flags to summary. - - * camel-mime-message.c (camel_mime_message_set_user_flag): Dont - use a hashtable for user flags. - (camel_mime_message_get_user_flag): And changed here too. - (camel_flag_get): New interface to get a flag from a flag - list. Flag lists are easier to work with than hash tables, and - save memory too. - (camel_flag_set): And set. - (camel_flag_list_free): And free. - (free_key_only): Discard. - (finalize): Remove the flag list. - -2000-05-17 Jeffrey Stedfast <fejj@stampede.org> - - * providers/smtp/camel-smtp-transport.c: (smtp_helo): Error - checking on gethostbyaddr() eliminating a possible segfault. - -2000-05-16 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-folder.c (mbox_delete_message_by_uid): - Implement. - -2000-05-12 NotZed <NotZed@HelixCode.com> - - * camel-movemail.c (camel_movemail): Open the destination with - O_APPEND, so we dont blow away a partially transferred mbox. - (camel_movemail): Loop if we get errno=INTR, and not fail. - -2000-05-11 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-summary.c (summary_rebuild): Update - the summarised file size, if everything went ok. - (camel_mbox_summary_expunge): Clear header flags after updating. - -2000-05-16 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/camel-nntp-folder.c: - * providers/nntp/camel-nntp-folder.h: - * providers/nntp/camel-nntp-provider.c: - * providers/nntp/camel-nntp-store.c: - * providers/nntp/camel-nntp-utils.c: - * providers/nntp/camel-nntp-utils.h: - get things working with new camel summary stuff. - - * providers/nntp/camel-nntp-summary.c: - * providers/nntp/camel-nntp-summary.h: - removed files since camel-folder-summary does all we need. - -2000-05-15 Jeffrey Stedfast <fejj@stampede.org> - - * providers/smtp/camel-smtp-transport.c: Added some preliminary - AUTH support. - -2000-05-15 Dan Winship <danw@helixcode.com> - - * camel-folder.h: Remove camel_folder_get_summary, which no longer - exists. - -2000-05-11 Dan Winship <danw@helixcode.com> - - * Makefile.am: remove some cruft that we're not currently using. - - * camel-stream-mem.c (camel_stream_mem_new_with_buffer): Change - to match prototype (size_t vs unsigned int) so it works on 64-bit - machines. Noted by msw. - -2000-05-11 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-folder.c (message_changed): Indicate - the summary changed also. - -2000-05-11 Jeffrey Stedfast <fejj@stampede.org> - - * providers/smtp/camel-smtp-transport.c: (smtp_helo): - Updated to more closely comply with RFC 821 standards - -2000-05-11 NotZed <NotZed@HelixCode.com> - - * camel-mime-part.c (write_to_stream): Unref the filter after - adding it to the filtering stream. - - * providers/mbox/camel-mbox-summary.c - (camel_mbox_summary_finalise): Free the folder path. - (camel_mbox_summary_update): Also save summary when done. - (camel_mbox_summary_expunge): Unindex items when deleting them. - (camel_mbox_summary_expunge): Save the index as well as the - summary. - - * camel-folder-summary.c (camel_folder_summary_finalise): Free the - summary path. - (camel_folder_summary_touch): New function, indicate the summary - info changed. - (camel_folder_summary_remove): Dirty here. - - * camel-internet-address.c (internet_decode): Free multiple entry - addresses properly. - - * camel-mime-utils.c (header_decode_mailbox): Plugged another - memleak, free text after converting it. - (header_decode_addrspec): More leaks plugged. - - * camel-mime-message.c (finalize): Free message_uid. - (finalize): Free the recipients hashtable. - -2000-05-11 <notzed@helixcode.com> - - * camel-folder-summary.c (camel_folder_summary_finalise): Free - summary items and charset filters. - -2000-05-10 <notzed@helixcode.com> - - * camel-folder-summary.c (camel_folder_summary_finalise): Don't - free stuff in p, after we've free'd p. - - * providers/mbox/camel-mbox-folder.c (mbox_append_message): Unref - the stream we created for appending. - -2000-05-10 Jeffrey Stedfast <fejj@stampede.org> - - * providers/smtp/camel-smtp-transport.c: (camel_smtp_transport_class_init): - Added initialization for service_class - -2000-05-10 Dan Winship <danw@helixcode.com> - - * camel-multipart.c (write_to_stream): fix a stupid typo. Thank - you, C. - - * camel-mime-part.c (write_to_stream): don't ref the stream before - wrapper a filter around it, since nothing will ever unref it. - -2000-05-10 Christopher James Lahey <clahey@helixcode.com> - - * Makefile.am: Added camel-types.h, camel-folder-pt-proxy.h, and - camel-thread-proxy.h. - -2000-05-09 Dan Winship <danw@helixcode.com> - - * providers/sendmail/camel-sendmail-transport.c (_send_internal): - Bleah. Can't fsync a pipe. As a quick kludge, just don't - stream_flush it. The right fix will require bringing back - stream_close though. - -2000-05-09 Jeffrey Stedfast <fejj@stampede.org> - * camel-internet-address.[c,h]: Undid my changes (moved - struct _address back into came-internet-address.c) - * providers/smtp/camel-smtp-transport.c: (_send): changed - from using it's own address manipulation (using struct _address) - to using camel_internet_address_get(). Also some format changes - to keep consistant with the rest of Camel - -2000-05-09 Jeffrey Stedfast <fejj@stampede.org> - - * camel-internet-address.[c,h]: Moved struct _address from - camel-internet-address.c to camel-internet-address.h - (hopefully this doesn't break anything...) - * providers/smtp/camel-smtp-transport.c: (_send): now - populates the recipient list with To, Cc, and Bcc addresses. - Should now be able to use this module. - -2000-05-09 Dan Winship <danw@helixcode.com> - - * providers/mbox/camel-mbox-folder.c (mbox_get_message_by_uid): - one more refcounting fix I missed before. - -2000-05-08 Jeffrey Stedfast <fejj@stampede.org> - - * providers/smtp/camel-smtp-transport.c: no longer frees memory it - shouldn't, updated to reflect camel-stream changes involving - CamelException (perhaps it should use a different CamelException - variable than is passed to the camel smtp module?) - -2000-05-08 Dan Winship <danw@helixcode.com> - - * camel-stream.c (camel_stream_read, camel_stream_write, - camel_stream_flush, camel_stream_reset, camel_stream_printf, - camel_stream_write_to_stream): Use CamelException to signal - failure. - (camel_stream_write_strings): Remove. camel_stream_printf is more - useful in most of the places that used this. - (camel_stream_write_string): Change from macro to function to - prevent problems with double-evaluation. - - * camel-seekable-stream.c (camel_seekable_stream_seek, - camel_seekable_stream_set_bounds): Use CamelException. - (reset): Update. - - * camel-seekable-substream.c, camel-stream-buffer.c, - camel-stream-filter.c, camel-stream-fs.c, camel-stream-mem.c: - Update. - - * camel-stream-fs.c: Remove the virtual init functions and move - the code into the creator functions. Add CamelExceptions to - creation functions that could fail. - - * camel-data-wrapper.c (camel_data_wrapper_write_to_stream): Use - CamelException. - * camel-mime-message.c, camel-mime-part.c, camel-multipart.c - (write_to_stream): Update. - - * camel-mime-parser.c: add an exception to the mime parser private - data and pass that to stream functions as needed. - - * gmime-content-field.c, md5-utils.c: Update (badly) for stream - changes. - - * camel-exception.h (camel_exception_is_set): convenience macro. - - * providers/Makefile.am: disable SMTP for now - - * providers/mbox/camel-mbox-folder.c (mbox_append_message): Pass - CamelException to the functions that now need it. Check the - exception after calling camel_stream_flush, and fail if it fails. - (mbox_get_message_by_uid): More updates. - - * providers/pop/camel-pop3-folder.c, - providers/pop/camel-pop3-store.c, - providers/sendmail/camel-sendmail/transport.c: Update. - - -2000-05-08 NotZed <NotZed@HelixCode.com> - - * camel-mime-message.c (process_header): Format From and Reply-To - to at least a decoded string. Should probably store them as an - camelinternetaddress. - - * Merged NEW_SUMMARY branch back to trunk, and resolved conflicts. - - * providers/mbox/camel-mbox-summary.c (camel_mbox_summary_update): - Return status. - (camel_mbox_summary_expunge): Force an update of the summary - before we do anything. - (camel_mbox_summary_expunge): Build new xev line in xevnew, and - free that, and consify xev. - (camel_mbox_summary_load): If we are rebuilding from scratch, make - sure we clear the summary content. - - * camel-stream-filter.c (do_close): We NEED a stream close. - -2000-05-07 Dan Winship <danw@helixcode.com> - - Make camel not leak like a sieve. - - * camel-object.c: New subclass of GtkObject which is now the base - of the Camel object hierarchy. Currently the only difference - between CamelObject and GtkObject is that CamelObjects don't start - out floating. - - * *.h: Move a bunch of typedefs to camel-types.h. Standardize on - using <camel/foo.h> in header files rather than <foo.h>, "foo.h", - or "camel/foo.h". Remove some unneeded includes. - - * camel-address.c, camel-data-wrapper.c, camel-folder-search.c, - camel-folder-summary.c, camel-folder.c, camel-mime-filter.c, - camel-mime-parser.c, camel-service.c, camel-session.c, - camel-stream.c: These are now subclasses of CamelObject. - - * camel-data-wrapper.c (set_output_stream): - * camel-medium.c (set_content_object): - * camel-seekable-substream.c - (init_with_seekable_stream_and_bounds): - * providers/mbox/camel-mbox-folder.c (mbox_get_message_by_uid): - remove gtk_object_sink calls. - - * camel-stream-buffer.c (init_vbuf): - * camel-stream-filter.c (camel_stream_filter_new_with_stream): - ref the original stream. - - * camel-folder-summary.c (camel_folder_summary_finalise): unref - the filters when finalizing. - - * camel-mime-part-utils.c - (simple_data_wrapper_construct_from_parser, - camel_mime_part_construct_content_from_parser): - * camel-mime-part.c (camel_mime_part_set_content): Unref objects - that are created only to be handed off to other objects. If - they're going to be needed later, they will have been additionally - ref'ed by the object that needs them. - - * providers/pop3/camel-pop3-folder.c (get_message_by_number): - unref the message stream after creating the data from it. - - * camel-stream.c, camel-stream-buffer.c, camel-stream-filter.c, - camel-stream-fs.c, camel-stream-mem.c: Remove camel_stream_close, - since its semantics are dubious (what happens when you close a - stream other people still have references on?). - - * providers/nntp/camel-nntp-store.c: - * providers/smtp/camel-smtp-transport.c: - * providers/pop3/camel-pop3-store.c: - replace camel_stream_close calls with gtk_object_unref. - - * providers/mbox/camel-mbox-folder.c: - * providers/nntp/camel-nntp-folder.c: - * providers/sendmail/camel-sendmail-transport.c: - replace camel_stream_close with camel_stream_flush + - gtk_object_unref - -2000-05-06 Dan Winship <danw@helixcode.com> - - * providers/pop3/camel-pop3-store.c (query_auth_types): A machine - which serves neither POP nor KPOP is not a POP server. - - * providers/smtp/camel-smtp-provider.c: Note in the description - that this provider is not yet tested. - -2000-05-08 <notzed@helixcode.com> - - * camel-mime-part.c (write_to_stream): Free the filter stream when - done. - - * camel-mime-parser.c (folder_seek): Make sure we add the \n - terminal when we seek as well (frob!). - - * camel-mime-utils.c (header_decode_addrspec): Plug minor memleak. - - * camel-mime-part.c (finalize): Free header tables once finished. - - * camel-folder-summary.c (camel_folder_summary_remove): Dont try - to access info after its free'd. - -2000-05-07 NotZed <NotZed@HelixCode.com> - - * camel-mime-part.c (write_to_stream): Apply encoding to content - part, when writing to a stream *sigh*. - - * camel-stream-filter.c (do_write): implement write for the - filtering stream. Writes shouldn't be mixed with reads. - (do_flush): Implemented flush. Again write/flush shouldn't be - mixed with reads. Only flushes if the last op was write. - (do_close): Force flush on close. - - * camel-mime-filter.c (filter_run): Oops, make sure we include the - backlen in the total length before passing onto the filter. - - * camel-mime-filter-from.c: New filter, munges 'From ' lines into - '>From ', for mbox. - - * camel-mime-parser.c (camel_mime_parser_header_remove): New - function to remove the parser's raw header, rather than - manipulating the header directly (wich doesn't work with - mempools). - - * camel-mime-utils.c (header_address_list_clear): Fixed some - broken(tm) logic, which would leak entries on multivalued lists. - - * providers/mbox/camel-mbox-summary.c (camel_mbox_summary_load): - Use ibex_save() to save the ibex. Makes a big difference to - startup times for very large mailboxes. - (camel_mbox_summary_expunge): Dum de dum, reimplemented. Designed - to be much more robust, and to stop immediately if anything awry - happens. - (copy_block): Utility function to copy n bytes from one fd to - another. - (header_write): Utility function to write out raw headers to an - fd. - (camel_mbox_summary_update): Incremental summary updater. - - * providers/mbox/camel-mbox-folder.c (mbox_get_message_by_uid): - Dont unref the stream, because of the broken(tm) ref model of gtk - widget that for some odd reason is being perpetuated in camel. - (mbox_expunge): Reenable expunge again. - (mbox_append_message): Removed the optimised mbox append. If its - an issue, it can go back later. Cleaned up a lot, checks error - returns, and automagically translates 'From ' into '>From' as - necessary. - -2000-05-07 <notzed@helixcode.com> - - * camel-mime-filter.c (filter_run): Oops, forgot to add the - backlen to the pre-buffer (*poof*). - -2000-05-07 NotZed <NotZed@HelixCode.com> - - * camel-mime-message.c (construct_from_parser): Allow - HSCAN_FROM_END to terminate the processing of a message. - - * camel-folder-summary.c (perform_content_info_load): Ick, dont - try and append a node onto its own list. - (camel_folder_summary_clear): Actually clear the indexes after - we've removed the messages. - (camel_folder_summary_clear): Set dirty if it changes. - (camel_folder_summary_load): Clear dirty. - (camel_folder_summary_save): Only save if dirty. - - * providers/mbox/camel-mbox-summary.c (summary_header_load): Oops, - remember to call that parent class first ... - (summary_header_save): Here too. - (camel_mbox_summary_load): Do more checking to verify the index - contents as well as teh summary contents, against the mbox - contents. - (camel_mbox_summary_load): Removed some fo that checking, it needs - more code to work reliably. - -2000-05-07 <notzed@helixcode.com> - - * providers/mbox/camel-mbox-summary.c (camel_mbox_summary_load): - Set the size and mtime of the mbox we indexed once done. - - * camel-folder-summary.c (camel_folder_summary_set_index): Dont - write the index if it changes - let the claler fix it (uh, kind of - impacts performance). - (camel_folder_summary_load): close in. - - * camel-folder-summary.c (summary_format_string): Check header - exists before trying to strip its leading spaces. - -2000-05-06 NotZed <NotZed@HelixCode.com> - - * camel-folder.h: Removed summary info from here, and include - camel-folder-summary.h as well. - - * camel-mime-parser.c (camel_mime_parser_step): Allow it to accept - a NULL databuffer. - - * providers/mbox/camel-mbox-summary.c: Totally new file, now - subclasses camel-folder-summary. - - * camel-folder-summary.c (message_info_load): Load the uid as a - string. - (message_info_save): And save too. - (camel_folder_summary_clear): New function, clears the contents of - the summary. - - * providers/mbox/camel-mbox-folder.c: Fixes for summary changes. - (mbox_get_message_by_uid): Completely redone. Now cross-checks - the summary information to make sure we get a real message. - (mbox_append_message): Disabled the copy version of append for - now. - (mbox_expunge): Temporarily disabled the expunge function, until - it is put back in camel-mbox-summary.c - -2000-05-05 NotZed <NotZed@HelixCode.com> - - * camel-folder-summary.c: And same here ... - (camel_folder_summary_encode_fixed_int32): Ugh, fwrite doesn't - return -1 on error .. - (camel_folder_summary_decode_fixed_int32): Neither deos fread. - (camel_folder_summary_encode_token): Fix here too. - (summary_build_content_info): Use start-headers to get the pos of - the message, not parser_tell(), which might not be what we - expected because of parser_unstep(). - (camel_folder_summary_encode_token): Use bserch() to tokenise the - values, rather than a linear search. - - * camel-mime-utils.c: Defined out some memory profiling stuff I - left there by mistake. - (header_decode_mailbox): Dont try to append the word part of a - local address if we ran out of words. - - * camel-mime-parser.c (folder_scan_content): Apply the fix from - the header scanner to here too. - (folder_scan_header): Only check for end of header if we have - space for it (didn't end the read with a newline) - (folder_scan_header): inptr is the only real thing we need - registerised for performance. Try to help the compiler be smart - about it .. - (folder_scan_header): Simplified the save header case a tad. - - Commented out some memory profiling stuff. - -2000-05-05 <notzed@helixcode.com> - - * camel-mime-utils.c (header_decode_mailbox): Plug a memory leak. - (header_decode_text): Fixed memory leaks with g_string_append(). - (header_encode_string): And here too, and a few other places. The - glib api is so awful ... - (header_content_type_decode): More memory leaks. - -2000-05-05 <notzed@helixcode.com> - - * camel-mime-parser.c (folder_scan_init_with_fd): Make sure we - init the end of buffer sentinal! - (folder_scan_init_with_stream): And here too ... - -2000-05-04 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-folder.c (summary_get_message_info): - Maxcount is minimum of the max and the requested count, not the - maximum :) - - * camel-mime-parser.c (folder_scan_content): Properly set midline, - so we dont falsely catch offset boundary markers (i.e. From inside - content). - (folder_read): Set a sentinal on the end of the read data (\n) so - we dont have to check the buffer boundary in the inner loop. - (mempool_*): New experimental memory management routines, speed - up simple structure parsing by about 25% ... not compiled in by - default. Something similar may be needed for camel-mime-utils to - address performance issues with g_malloc and friends. - - * camel-mime-utils.c: Added a macro w(x) used to wrap all warnings - about mime/rfc violations, so they can be turned off. - - * camel-folder-summary.c (summary_build_content_info): Step after - the end of a message ... - Turn into a stand-alone program for testing and profiling. - -2000-05-04 Dan Winship <danw@helixcode.com> - - * providers/pop3/camel-pop3-store.c (pop3_connect): Don't fall - back to plaintext passwords if APOP fails, since it should also - fail. - -2000-05-04 Dan Winship <danw@helixcode.com> - - * camel-session.c (camel_session_list_providers): New function to - replace camel_provider_scan. Returns a list of either (a) all - currently-loaded providers, or (b) all available providers. - - * camel-url.[ch]: Add an "empty" flag to CamelURL (indicating that - it contains only a protocol). - - * camel-service.c (camel_service_query_auth_types): Make this take - a CamelException (since it may have to try to connect to the - server, and it might not able to.) - - * providers/pop3/camel-pop3-store.c: add KPOP (Kerberized POP) - support. This is mostly so I have two kinds of authmech to play - with instead of just one. (But it does actually work.) - - * providers/smtp/camel-smtp-transport.c (query_auth_types): update - for prototype change, but disable the functionality, since it - doesn't really support any auth types yet. - (camel_smtp_transport_get_type): add an object init function to - set the service url_flags. - -2000-05-04 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-summary.c: Yes, and anotherone. - - * camel-mime-utils.c: And another one. - - * camel-mime-part.c: And another one. - - * camel-mime-part-utils.c: And another one. - - * camel-folder-search.c: And another one. - - * camel-mime-parser.c: Reverted a change wihtout a ChangeLog entry. - -2000-05-04 NotZed <NotZed@HelixCode.com> - - * camel-folder-summary.[hc]: Yes, CamelFolderSummary is back ... - ... re-usable class to summarise and index any stream or message - and to manage/load/save the created summaries. - - * camel-folder.c: Include string.h to kill a warning. - -2000-05-03 Jason Leach <leach@wam.umd.edu> - - * Makefile.am (INCLUDES): add $(UNICODE_CFLAGS) to the INCLUDES, - people who installed libunicde in non-standard include paths need - this. - -2000-05-03 NotZed <NotZed@HelixCode.com> - - * camel-folder.h: Added pos/bodypos/endpos to the basic message - content info object. Size to be removed? Moved the - messageconentinfo and messageinfo back to camel-folder-summary.h. - - * camel-mime-filter-index.c (camel_mime_filter_index_set_ibex): - New function to (re)set the index to use on a filter. - - * camel-mime-parser.c (camel_mime_parser_scan_from): Whole bunch - of inline docs. - (camel_mime_parser_drop_step): New function to drop a state from - the parser. Needs more testing. - - * camel-mime-utils.c (rfc2047_decode_word): If the iconv handle is - -1, then dont try and convert (crashes unicode_iconv?). - (rfc2047_decode_word): Use alloca for variables instead of - g_malloc - by the rfc they should always be short. - (rfc2047_decode_word): If we can't do the charset conversion, undo - the quoted-printable/base64 at least? Should probably convert - unknown characters to the utf-8 unknown character. - -2000-05-02 Larry Ewing <lewing@helixcode.com> - - * camel-mime-utils.c (header_decode_date): fix typo when - dereferencing saveoffset. - -2000-05-02 NotZed <NotZed@HelixCode.com> - - * camel-folder-search.c: Added some header doco. - - * camel.h: REmove gmime-utils.h from here. - - * providers/mbox/camel-mbox-search.[ch]: Removed. Functionally - redundant. - - * providers/mbox/camel-mbox-folder.c (mbox_search_by_expression): - Use the new CamelFolderSearch class to do the actual searching, - just setup the search here. - - * camel-folder-search.[ch]: A helper class that providers may - subclass to provide their own search functionality, or they can - simply use as is, it supports body searches if an ibex is - supplied, and header searches if a summary is supplied. - -2000-05-02 Matt Loper <matt@helixcode.com> - - * Makefile.am: set G_LOG_DOMAIN. - * providers/MH/Makefile.am: same. - * providers/maildir/Makefile.am: same. - * providers/mbox/Makefile.am: same. - * providers/nntp/Makefile.am: same. - * providers/pop3/Makefile.am: same. - * providers/sendmail/Makefile.am: same. - * providers/smtp/Makefile.am: same. - -2000-05-02 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-search.c - (camel_mbox_folder_search_by_expression): Dont store/remove - current search from the search list. - - * providers/mbox/camel-mbox-folder.h: Removed searches list, - searches are all sync now. - - * gmime-utils.[ch]: What the hell, remove it. This will break the - nntp provider. The mime parser can be used instead though. - Removed from all code including it (but none were using it). - - * gmime-utils.c (_store_header_pair_from_string): Removed bizarre - string_dichotomy version of this. This code is somewhat redundant - now, and is headed for death anyway. - - * gstring-util.c (g_string_dichotomy): Same with this one. - (g_string_clone): Removed a memory leak, g_string_new() allocates - its own memory. - (g_string_append_g_string): Allow to append an empty gstring onto - another gstring, dont abort()! - - * string-utils.c (string_dichotomy): Removed this incredibly weird - function. - - * camel-folder.c (_create): Replaced the rather obtuse use of - "string_dichotomy" function with a simple strrchr(). Still not - sure it'll work. - - * camel-folder-summary.c: cvs removed a long-removed file. - - * camel-mime-parser.c (folder_scan_header): Fix the previous - overflow problem properly (can happen in 2 places). - (header_append): A new macro to include the code changed above, so - it only appears in one place. - (folder_scan_step): Change the content type to text/plain if the - multipart is broken. Doesn't actually change the header though. - (header_append): Also move the header-start tracking stuff here. - Could be a static function to save code. - -2000-05-02 <notzed@helixcode.com> - - * camel-mime-part-utils.c - (simple_data_wrapper_construct_from_parser): Dont use autofill on - these fucking long function anmes!!!!!! - -2000-05-02 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-summary.c - (camel_mbox_summary_expunge): Fix the offset for the summary when - an item is expunged to take account of the From line. - -2000-05-01 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-folder.h (CamelMboxFolder): Removed - search_id. - - * providers/mbox/camel-mbox-search.c - (camel_mbox_folder_search_cancel): Remove.d - (camel_mbox_folder_search_complete): Removed. - (camel_mbox_folder_search_by_expression): Changed back to sync - api. - (struct _searchcontext): Removed cancelled flag. - (find_context): Removed. - (func_header_contains): Debug out some search stuff. - - * providers/mbox/camel-mbox-search.h - (camel_mbox_folder_search_by_expression): Moved back to sync api. - - * providers/mbox/camel-mbox-summary.c - (camel_mbox_summary_set_flags_by_uid): New function to update the - flags in the summary. - (camel_mbox_summary_expunge): Expunge messages from a folder. - (offset_content): Re-align offsets of summary when messages - added/removed to an existing summary. - (camel_mbox_summary_remove_uid): Remove a message summary entry by - uid. - (index_folder): Restore flags from X-Evolution header, if they are set. - (index_folder): Make sure we index using a decimal uid, since - thats what everything else indexes off (oops). - Upped SUMMARY_VERSION as a result. - (camel_mbox_summary_expunge): Oops, my wrong, use the string uid - to unindex on. - - * providers/mbox/camel-mbox-folder.c (_get_message_by_uid): - Connect to the message_changed signal. - (_init): Set permanent flags to something reasonable. No user - flags yet ... - (message_changed): If the flags of the message change, update the - flags in the summary. - (mbox_expunge): Implement the expunge. - (camel_mbox_folder_class_init): Renamed all leading _'s to mbox_'s - (mbox_expunge): Emit a folder_changed signal on expunge (uh, even - if it didn't ...) - - * camel-folder.c (_finalize): Uh, dont free permanent_flags - anymore (this wouldn't failed anyway, it was a GList !!!) - (camel_folder_search_complete): Removed. - (camel_folder_search_cancel): Removed. - (camel_folder_expunge): Changed to only allow expunge on an open - folder. It doesn't make sense for mbox, otherwise (?) - (camel_folder_class_init): Added a folder_changed signal. - - * camel-folder.h (struct _CamelFolder): Change permanent_flags to - a bitfield. - (list_permanent_flags): Renamed to get_permanent_flags, and - returns a bitfield. - (camel_folder_expunge): Changed expunge to a void type. The - messages would no longer be useful after they have been removed - ... - (CamelFolderClass): New function summary_get_by_uid() to get a single - summary. - (*search*): Moved back to synchronous search api ... *sigh* - - * camel-folder.h: Removed CamelSearchFunc. - - * camel-mime-message.c (set_flag): Removed. - (camel_mime_message_set_flag): Removed. - (get_flag): Removed. - (camel_mime_message_get_flag): Removed. - (add_flag_to_list): Removed. - (get_flag_list): Removed. - (camel_mime_message_get_flag_list): Removed. - (camel_mime_message_get_flags): New interface to get system flags. - (camel_mime_message_set_flags): " to set ". - (camel_mime_message_get_user_flag): To get a user flag. - (camel_mime_message_set_user_flag): To set a user flag. - (finalize): Hmm, the old one free'd the key and data, not good - when the data is a boolean ... - -2000-04-30 Dan Winship <danw@helixcode.com> - - * camel-provider.h: Tweak the definition of CamelProvider. Among - other things, a provider may now be both a store and a transport. - - * camel-provider.c: Remove a lot of code we had no intention of - using. This now only contains two functions: camel_provider_init - to read the installed .urls files, and camel_provider_load to - load and register a new provider. - - * camel-session.c: Remove more unused code and simplify some of - the remaining code. The list of available provider modules is now - stored in the session, and it handles calling camel_provider_load - to load them as needed. Provider registration is now done by - calling back from the module init routine, which allows a single - module to register providers for multiple URL types. - - * providers/*: Update provider structures and init routines for - the new stuff. Add a .urls file to each provider specifying what - urls it handles, and install that with the library. - - * providers/nntp/camel-nntp-provider.c: Add hints towards - supporting both news: and nntp: URLs, and using nntp as both a - store and a transport. - -2000-04-29 Dan Winship <danw@helixcode.com> - - * camel-internet-address.c (camel_internet_address_get): const - poison - - * camel-mime-part-utils.c - (simple_data_wrapper_construct_from_parser): - camel_mime_parser_tell() returns an offset from where it started - parsing, not necessarily from the start of data. Since we're - parsing a bounded seekable_stream, we need to add the stream's - starting bound to camel_mime_parser_tell's return value to - create the substream in the right place. - - * camel-seekable-substream.c - (camel_seekable_substream_new_with_seekable_stream_and_bounds): - say CAMEL_STREAM_UNBOUND rather than -1 in doc. - - * camel-seekable-stream.c (camel_seekable_stream_seek): Add more - info to docs. - -2000-04-28 Dan Winship <danw@helixcode.com> - - * camel-mime-parser.c (folder_scan_header): fix a bug that would - cause corruption with very long headers. - -2000-04-27 Ettore Perazzoli <ettore@helixcode.com> - - * providers/pop3/Makefile.am (INCLUDES): Add `-I$(srcdir)/../../..' - to pick the Camel includes. - * providers/sendmail/Makefile.am (INCLUDES): Likewise. - - * camel.h: Don't #include <camel/data-wrapper-repository.h> anymore. - -2000-04-27 NotZed <NotZed@HelixCode.com> - - * camel-mime-utils.c (check_header): Dont try and check a NULL - header. - - * camel-recipient.[ch]: Dead. Its not pining. - - * camel-mime-message.h: Dont include recipients.h anymore. - - * camel-mime-message.c (camel_mime_message_add_recipient): Accept - name/address separately, and store in an CamelInternetAddress. - (add_recipient): Removed. - (remove_recipient): Removed. - (remove_recipient_address): Renamed from remove_receipient, works - via address. - (camel_mime_message_remove_recipient_name): New function to remove - by name. - (get_recipients): Removed. - (camel_mime_message_get_recipients): Return a camel-internet-address. - (write_to_stream): No longer write receipients directly. - (write_recipients_to_stream): Removed. - (write_one_recipient_to_stream): Removed. - (camel_mime_message_init): Setup recipients hashtable, rather than - usign the recipients stuff. - (set_recipient_list_from_string): Killed, a violent and lengthy - death. - (process_header): Simplified recipient handling code a lot. - (received_date_str, sent_date_str, reply_to_str, subject_str, - from_str): Removed some oddly-defined global statics. - (camel_mime_message_class_init): Dont initialise above variables - anymore. - (init_header_name_table): Removed, use a table to init this, and - do it in class init (2 lines of code ...). - - * camel-news-address.c: Class to represent news addresses - - currently empty, and not built. - - * camel-internet-address.h: Class to represent internet (email) - addresses. - - * camel-address.h: Abstract class to represent (lists of) - addresses. - -2000-04-27 Dan Winship <danw@helixcode.com> - - * camel-mime-part.c (write_to_stream): Revert previous change. I - was confused. - - * camel-url.[ch] (camel_url_encode, camel_url_decode): expose - these routines. - -2000-04-26 Dan Winship <danw@helixcode.com> - - * camel-mime-part.c (write_to_stream): Only write a newline - between the headers and the content object if the content object - is not a CamelMedium. (If the content is a medium, it may have its - own headers, which then need to go before the blank line.) - - * camel-mime-body-part.[ch]: Remove. We weren't using the fields - that made this different from camel-mime-part, so it basically - just forced us to do lots of gratuitous typecasting. - - * camel-multipart.[ch]: Use CamelMimePart. Remove the multipart - parent stuff, since we weren't using that either. - - * etc: update for CamelMimeBodyPart -> CamelMimePart - -2000-04-26 Dan Winship <danw@helixcode.com> - - * camel-medium.c (set_content_object): sink the content object - after referencing it. - - * camel-mime-part.c: fix various little things in the handling - of CamelMedium methods. Change camel_mime_part_set_text to the - more generic camel_mime_part_set_content. - - * camel.h: sync to current reality - - * camel-folder-utils.[ch]: removed - - * camel-mime-utils.c (header_format_date): fix format specifier - for time zone. Fix typo in month names array. - -2000-04-26 NotZed <NotZed@HelixCode.com> - - * camel-seekable-substream.c (stream_seek): Changed to have - absolute seek semantics, not relative to the bounds. - - * camel-seekable-stream.c (reset): When we reset, seek to the - start of the bound, if there is one. - (stream_tell): Make tell virtual. - - * camel-stream-filter.c (do_available): Removed. - - * camel-stream-buffer.c: Remove leading _'s from static functions. - (stream_read): Renamed from read(). Fancy that conflicting! (my - boo!) Others too. - - * providers/pop3/camel-pop3-folder.c (get_message_by_number): - Changed to stream_mem interface. - - * providers/mbox/camel-mbox-folder.c (_get_message_by_uid): Fixed - for streamfs interface changes, and implement a failure case. - (_append_message): Changed for fs stream interface change. - - * camel-multipart.c (print_part): Iterate rahter than callback. I - hate glists's interface (hence, move this to write_to_stream). - (write_to_stream): Return an error (yuck, this is a royal PITA to - do with the stream write interface). - - * camel-mime-message.c: Removed leading _ from static names. - - * camel-mime-part.h: construct_from_parser() now returns an error - code. - - * camel-mime-part-utils.c - (camel_mime_part_construct_content_from_parser): Changed to use a - camel-data-wrapper instead of a camel-simple-data-wrapper (no - change needed elsewhere?). - (simple_data_wrapper_construct_from_parser): Fixes for stream-mem - interface changes. - - * camel-simple-data-wrapper.[ch], - camel-simple-data-wrapper-stream.[ch], - camel-stream-data-wrapper.[ch], removed. Fixed including of these - files. - - * camel-mime-part.c (camel_mime_part_set_text): Remove the use of - the camel-simple-data-wrapper-stream, just use a mem stream. - (write_to_stream): Renamed from my_* - (construct_from_stream): Return an error on error. - - * camel-stream-mem.c (camel_stream_mem_new*): Remove mode - parameter. - - * camel-stream-mem.h (enum CamelStreamMemMode): Removed. It - wasn't used at all. - - * camel-data-wrapper.h: Add camel_data_wrapper_new() to create - these. - (write_to_stream, construct_from_stream): Return an error - indicator for success. Fixed all methods to match (ICK). - - * Makefile.am (libcamel_la_SOURCES): Remove - camel-simple-data-wrapper.c, camel-simple-data-wrapper-stream.c, - camel-stream-data-wrapper.c. Obsoleted by code re-use! - - * camel-data-wrapper.c (construct_from_stream): Change the default - implementation to just set the output stream == construction - stream. Well, this lets me get rid of both simple-data-wrapper - and stream-data-wrapper (unused anyway), and - simple-data-wrapper-stream in one hit. CamelDataWrapper is now - also a concrete class. - (write_to_stream): Use camel_stream_write_to_stream() to - calculate/return values (and save code). - Include <errno.h> for obvious reasons. - - * camel-stream.c (eos): Provide a default implementation of .eos(). - (camel_stream_write_to_stream): Make it return an error code on - error. - (camel_stream_printf): Changed to return the number of bytes - written/error. - (camel_stream_available): Removed. - - * camel-stream-fs.h (enum CamelStreamFsMode): Removed. Changed to - use unix modes and so forth (wasn't used for anything but new file - creation and didn't work well either). - - * camel-stream-fs.c: Removed leading _'s for names. And removed - some virtual method 'documentation'. - (destroy): Dont try and close a closed/error fd. Only report - error if close returns -1. Moved all the code to finalise(), and - killed this function. - (init_with_fd): Properly setup the seek offset, if it is a - valid and seekable file descriptor. - (init_with_fd_and_bounds): Use off_t for bounds, set bounds on the - seekable stream. - (init_with_name): Return error codes. - (init_with_name_and_bounds): Ditto. - (camel_stream_fs_new_with_name): REturn NULL object if it failed. - (camel_stream_fs_new_with_name_and_bounds): Return NULL object on - failure. Changed with_name* api's to take unix open style args - and flags. - (read): The bounded stream bounds checking seemed off, simplified - code a bit. - (write): Implement bounds checking for writing, the comment was - wrong, it could make sense to bound writing. Cleaned up a little. - (available): Gone. - (eos): Removed. Use CamelStream's implementation now. - (close): Reset the fd to -1, provide a warning for bad usage. - (seek): Cleaned up. Changed the behaviour a little, the returned - offset is the absolute position in the file, even in bounded - streams. - (seek): Seek from end mirrors lseek() behaviour (reverse seeking). - -2000-04-25 NotZed <NotZed@HelixCode.com> - - * camel-stream-fs.h (struct _CamelStreamFs): Moved bounds and eof - indicator to other parent classes. - - * camel-stream.c (camel_stream_printf): New utility - function. Obvious use. - - * camel-stream-mem.c: Removed leading _'s from static func's. - (camel_stream_mem_new_with_byte_array): Fixed for api changes, set - the owner for the byte array to us. - : Removed A bunch of gtk doc stuff for static (implementation) functions. - (available): Removed. - (write): Fixed the write implementation so that seek() works on a - seekable memory stream, as expected. Seeking past the end of the - buffer has unix semantics (filling with 0). - (available): Removed. - (write): Implement seekable stream bounded stream. - (read): Implement seekable stream bounded stream. - (close): Dont free the stream_mem if we're not the owner. - (seek): Allow to seek beyond the end of memory area, - implement bounds checking. - (seek): Set errno on bad policy. - - * camel-stream-mem.h (struct _CamelStreamMem): Changed position to off_t. - (new_with_buffer): Changed len to be a size_t. - (set_buffer, set_byte_array): New interface functions. - (struct _CamelStreamMem): Removed position, it is stored in the - superclass. - - * camel-stream.h: Removed some of the seemingly random - whitespace. Removed the available method (its not - impelemented/useful enough). - - * camel-seekable-substream.c - (init_with_seekable_stream_and_bounds): Remove the data_available - stuff, it hasn't been properly implemented/finished, and may never - work (unfortunately *sigh). - (reemit_parent_signal): Removed part of the above change. - (set_bounds): Removed (moved to seekable-stream). - : Fixed up some of the generally unreadable indenting (sorry, - wrapping at 80 characters with - camels_really_long_function_names() - just_doesnt_work_very_well_does_it(). - (available): Removed. - (stream_seek): Fixup for object changes. Make sure we return -1 - if the parent stream can't seek. - - * camel-seekable-stream.c (ccamel_seekable_stream_set_bounds): New - function to bound any seekable stream. - : Removed _'s. - (camel_seekable_stream_class_init): Implement an init function, to - setup the stream bounds to unbound. - - * camel-seekable-stream.h (CamelSeekableStreamClass): New virtual - method set_bounds for seekable streams. - (CAMEL_STREAM_UNBOUND): New define for no bound. - - * camel-seekable-substream.h (struct _CamelSeekableSubstream): - Removed sup_bound and inf_bound, moved to CamelSeekableStream (and - renamed, and changed to off_t's). - (new_with_seekable_stream_and_bounds): Use off_t as the bounds. - (CamelSeekableSubstreamClass): Uh, why was the intialiser virtual? - Removed. - - * camel-seekable-stream.[ch] (CamelSeekableStreamClass): Changed seek - to accept an off_t as the offset. - (struct _CamelSeekableStream): Renamed cur_pos to position and - changed it to an off_t type. - (enum CamelStreamSeekPolicy): Set to match the SEEK_* constants - from lseek(). - (get_current_position): Renamed to tell(). - - * camel-stream-buffer.h: Commented out set_vbuf - never implemented. - -2000-04-25 Dan Winship <danw@helixcode.com> - - * camel-stream-buffer.c (_eos): only return TRUE if the parent is - at eos AND the buffer has been exhausted - - * camel-mime-message.c: fix some incorrect macro usage that - resulted in bogus casts - -2000-04-24 Dan Winship <danw@helixcode.com> - - * camel-mime-part-utils.c - (simple_data_wrapper_construct_from_parser): fix a cut-and-pasto. - - * providers/mbox/camel-mbox-folder.c (_get_message_by_uid): ref - (and sink) the message stream if we're going to unref it later. - Otherwise it could get destroyed while there are still substreams - attached to it. This needs a cleaner solution. - - * camel.h: remove data-wrapper-repository.h include(s) - -2000-04-24 NotZed <NotZed@HelixCode.com> - - * camel-mime-message.c (construct_from_parser): Allow MESSAGE_END - _or_ EOF as valid termination conditions. - - * providers/mbox/camel-mbox-summary.c (message_struct_new): Decode - and then re-encode the addresses, so they are consistently - formatted. - - * camel-mime-utils.c (header_decode_mailbox): Store the address in - a _header_address. And try to get a comment-stored name if there - is one. - (header_decode_address): Actually return an address. - (header_to_decode): Renamed to header_address_decode() - (header_mailbox_decode): New function to get a single mailbox. - (header_mime_decode): Return the major/minor value, as - appropriate. - (header_address_new, and friends): Whole bunch of utility - functions for working with the address thingies. - (header_decode_domain): Free the string header, and dont expand - '.' into ' . '. - - * camel.c (camel_init): No longer call - data_wrapper_repository_init. - - * camel-medium.c (write_to_stream): Moved (back) to - camel-mime-part. - (add_header): - (set_header): - (remove_header): - (get_header): Make all these abstract, and spit warnings if - called. I guess it could manage the list, but well, it doesn't. - - * camel-medium.h (struct _CamelMedium): Dont store headers here, - the implementor is the only one who knows their format. - (CamelMediumClass): Changed header values to be void *'s. They - need not be strings? - - * camel-simple-data-wrapper.c (construct_from_stream): And we're - back. Set the output stream. - (construct_from_parser): Moved to camel-mime-part-utils. - - * camel-mime-part-utils.c - (camel_mime_part_construct_content_from_parser): Create the - contents of multipart and simple messages. - (camel_mime_part_construct_content_from_parser): Oops, this was - totally screwed up, try creating the right cotnent on the right - object. - - * camel-multipart.c (construct_from_parser): Moved to - camel-mime-part-utils. - (separate_part): Removed. - - * camel-mime-part.c (construct_from_stream): Back again! This now - switches over to using a mime parser for any mime parts, only. - (my_write_to_stream): Write our headers and so forth here. - (add_header): Add header directly, parent class is abstract. - (remove_header): Ditto. - (set_header): Ditto. - - * camel-data-wrapper.c (camel_data_wrapper_construct_from_stream): - Remade abstract. - (camel_data_wrapper_construct_from_parser): Moved to - camel_mime_part. - - * camel-data-wrapper.h: Put back construct_from_stream. - - * camel-mime-part.h: Put construct_from_parser in here, the - data-wrapper shouldn't know about mime. Ok, so now to undo half - of the last hours changes ... duh. - -2000-04-23 Dan Winship <danw@helixcode.com> - - * camel-mime-utils.c (header_to_decode, header_mime_decode): fix - some obvious minor bugs noted by -Wall. - -2000-04-23 NotZed <NotZed@HelixCode.com> - - * providers/pop3/camel-pop3-folder.c (get_message_by_number): Use - construct_from_stream instead of set_input_stream(). - - * camel-simple-data-wrapper-stream.c - (camel_simple_data_wrapper_stream_construct): REmoved the destroy - callback code. - (wrapper_destroy_cb): Removed. - - * camel-simple-data-wrapper.h: Add prototype for _construct() - method. - - * camel.c: Include unicode.h to kill a warning. - - * camel-data-wrapper.h (CameldataWrapperClass): Removed - construct_from_stream virtual method. - Removed get/set input stream. - - * data-wrapper-repository.[ch]: Removed&from build. Obsoleted? - The justification as is follows: It is mixing storage - protocol/format with message architecture. It really just doesn't - serve any purpose, as each medium implementor will have to have its - own type->handler mapping, and the only current implementor, - mimepart has a very simple structure and no need for this. - - * camel-medium.c (write_to_stream): Moved here from most of the - stuff in camel-mime-part. Well, the MEDIUM is the one that knows - what the headers are, and the content is, let it write it out. - - * camel-mime-part-utils.c (camel_mime_part_construct_content): - Copied from camel-mime-part.c, removed handling of message - followon state (moved to camel-mime-message). - (camel_mime_part_construct_content_from_parser): Renamed from - construct_content. - (camel_mime_part_construct_headers_from_stream): - (camel_mime_part_construct_content_from_stream): - (camel_mime_part_store_stream_in_buffer): Removed. Replaced by - the new construct from parser stuff. - - * camel-mime-message.c (construct_from_parser): Do - construct_from_parser for mime-message. - (_write_to_stream): Set the mime-version header for medium to - write out, rather than writing it out ourselves. - - * camel-data-wrapper.c (set_mime_type_field): Ref the - content_field when we get it? - (construct_from_stream): Removed. - (camel_data_wrapper_construct_from_stream): Changed to a helper - function, creates a mime_parser, and constructs from that. - (set_input_stream): Removed. - (camel_data_wrapper_set_input_stream): Removed. - (get_input_stream): Removed. - (camel_data_wrapper_get_input_stream): Removed. - - * camel-mime-parser.c (camel_mime_parser_unstep): New function. - Cause a subsequent call to mime_parser_step() to return the same - state over again. - - * providers/mbox/camel-mbox-folder.c (_get_message_by_uid): - Initial test code using the mime parser to construct the message. - (_get_message_by_uid): Use construct_from_stream() instead of - creating our own parser. - - * camel-mime-part.c (construct_from_parser): part constructor. - (camel_mime_part_construct_content): Basically a simpler - replacement for the datawrapper repository. - (camel_mime_part_init): Set the default type to text/plain. - (camel_mime_part_construct_content): Removed to - camel-mime-part-utils.c - (my_get_output_stream): Removed. The streeam is in the - data-wrapper. - (my_get_content_object): Removed. The content object is stored in - the medium. If none is there, the object wasn't created properly. - (my_write_content_to_stream): Removed. The content object is the - one that knows how to write itself out!!!!!!!! - (my_write_to_stream): Remove the base header writing stuff - has - been moved to camel-medium, where it belongs. This can just be - used to check for mandatory headers. - (my_construct_from_stream): Removed. - (my_set_input_stream): What the hell, i'll remove this too. - Nobody seems to understand how it differs from create from stream, - and they both seem to serve the same purpose ... - - * camel-simple-data-wrapper.c (construct_from_parser): Initial - implementation of a content constructor. - (construct_from_stream): Removed! Job taken over by - construct_from_parser. - - * camel-multipart.c (construct_from_parser): Multipart - construction routine. - (camel_multipart_init): Set the default multipart type to - multipart/mixed. Duh, no subtype is not allowed anyway. - (set_input_stream): REmoved. Replaced by construct_from_parser. - -2000-04-22 Dan Winship <danw@helixcode.com> - - * camel-multipart.[ch]: clean, document, etc. - (camel_multipart_init): pick a prettier default boundary. Still - need to deal with the larger problem - -2000-04-22 NotZed <NotZed@HelixCode.com> - - * camel-mime-message.h (struct _CamelMimeMessage): Removed - send_date, and received_date, and replaced it with a time_t - 'date' (this is what the header is called), and date_offset to - store the GMT offset of the date. - - * camel-mime-message.c (camel_mime_message_set_from): Update raw - header as we go. - (_set_from): Removed. - (_get_from): Removed. - (camel_mime_message_get_from): Moved implementation here. - (camel_mime_message_get_subject): Move implementation here. - (_get_subject): Nuked. - (camel_mime_message_set_subject): Handle utf-8 input, and also - update raw header when changed. - (_set_subject): Removed. - (_set_received_date): Removed. - (camel_mime_message_set_received_date): Removed. - (_get_received_date): Removed. - (camel_mime_message_get_received_date): Removed. - (_get_sent_date): Removed. - (camel_mime_message_get_sent_date): Removed. - (camel_mime_message_get_date): New function to get the date as a - time_t/offset. - (camel_mime_message_set_date): Set the date as a time_t/offset. - (camel_mime_message_get_date_string): Get the date as a string. - (camel_mime_message_init): Initialise the current date as - 'CMAEL_MESSAGE_DATE_CURRENT'. - (_set_reply_to): Removed. - (camel_mime_message_set_reply_to): Moved implementation here. - This is still broken, reply-to can have multiple addresses. - (_get_reply_to): Removed. - (_set_field): Removed, no longer used anywhere. - (_get_field): Also removed. - (_init_header_name_table): Add the Date header. - (process_header): Also handle snooping of Date header here. - - * camel-stream-filter.c (finalise): Unref the source stream on - finalise, and also call the parent class (oops). - - * camel-mime-parser.c (camel_mime_parser_state): New function to - get the current parser state. - (camel_mime_parser_stream): Allow you to get the stream back from - the mime_parser. - (camel_mime_parser_fd): Alternative to allow you to get the fd - back from the mime_parser. - (folder_scan_init_with_stream): Properly ref/unref the stream. - (folder_scan_close): Properly unref the stream/close the fd on - exit. - (folder_scan_init_with_fd): Close the old fd if there is one. - - * camel-data-wrapper.c (camel_data_wrapper_construct_from_parser): - New method, construct a data wrapper from an initialised parser. - (construct_from_parser): Empty implementation. - - * providers/mbox/camel-mbox-summary.c (message_struct_new): - Convert subject line to unicode, before storing in the summary. - (strdup_trim): Removed, no longer needed. - - * providers/mbox/camel-mbox-folder.c (_get_message_by_uid): Ref - the folder after setting it in the new message. - - * camel-mime-part.c (my_set_content_object): Have the headers - follow the content-type change here too. - (my_write_to_stream): Dont write content-type here, automatically - stored in the headers ... - (my_write_to_stream): Use header_disposition_format() to format - the content-disposition header. - (my_write_to_stream): Removed old code, all headers are now stored - in the camel-medium level, always. Need to do the same with - camel-mime-message i suppose ... - (my_write_to_stream): Write the content using the parent class, - not some weird function. - (camel_mime_part_class_init): Dont override get_output_stream. - (camel_mime_part_encoding_from_string): Bleh, make it - case-insensitive. - - * camel-mime-utils.c (header_content_type_is): Handle empty types. - (header_encode_string): Start of an implementation of the rfc2047 - encoder. It does iso-8859-1, and us-ascii, and utf-8 (others get - tricky *sigh*) - (rfc2047_encode_word): Convert a single word/string into rfc2047 - encoding. - (quoted_encode): Different quoted-printable encoding for rfc2047 - encoding of headers. - - * gmime-content-field.c (gmime_content_field_write_to_stream): Use - header_content_type_format() to format it. - -2000-04-21 NotZed <NotZed@HelixCode.com> - - * camel-mime-utils.h: Add prototype for header_param_list_free. - - * camel-recipient.c: New function to remove all the types of a - recipient list. I think this whole object needs a major review. - - * camel-mime-message.c (camel_mime_message_class_init): Removed - parse_header_pair override, override add_header instead. - (_parse_header_pair): Renamed to add_header. - (remove_header): Add this method, to make sure we keep upto date - with removed headers too. - (_set_field): If given a NULL value, clear it out. - (_set_recipient_list_from_string): Constify. - (set_header): Override set_header from camel_medium. - (process_header): Local function to handle set/add/remove of each - header we know about. - - * camel-mime-part.c (camel_mime_part_class_init): Removed - parse_header_pair setup. - (my_parse_header_pair): Moved into add_header(), removed. - (my_set_disposition): Allow a NULL disposition to clear it. - (my_set_content_id): Allow NULL content id to clear it. - (remove_header): Track removed headers. - (my_set_description): Allow NULL description to clear it. - (my_set_content_MD5): Make sure we copy the md5 value, and allow a - NULL value to reset it. - (my_set_filename): Copy the filename. - (my_set_header_lines): Removed. Nothing uses it, it doesn't - actually serve any purpose. - (camel_mime_part_set_header_lines): Ditto. - (my_get_header_lines): Ditto. - (camel_mime_part_get_header_lines): Ditto. - (camel_mime_part_class_init): Remove *_header_lines setup. - (camel_mime_part_init): Remove header_lines init. - (my_finalize): Remove header_lines finalise. - (my_write_to_stream): Write the headers here. This is just WRONG, - camel_medium should be doing this. - (my_get_output_stream): Kill a warning. - (camel_mime_part_encoding_to_string): Ditto. - (camel_mime_part_set_description): Unvirtualiase, use add_header() - to do the processing. - (my_set_description): Removed. - (set_disposition): Renamed from my_set_disposition. - (camel_mime_part_get_description): Get the descriptionf rom the - get_header method. - (my_get_description): Removed. - (my_set_filename): Removed. - (camel_mime_part_get_filename): Get the parameter from the - disposition. - (camel_mime_part_encoding_from_string): Handle NULL string. - (camel_mime_part_init): Remove reference to filename. - (my_finalize): Dont free filename. - - * camel-mime-part.h (CamelMimePartClass): Removed - parse_header_pair() method, it doesn't add anything that - add_header() can't be used for. - (CamelMimePartClass): Remove *_header_lines methods. - (struct _CamelMimePart): Remove header_lines list. - (struct _CamelMimePart): Removed filename attribute. - - * camel-medium.c (camel_medium_init): Init headers to null, not a - hashtable. - (add_header): Append the headers as a list. - (remove_header): Remove headers as a list. - (get_header): Likewise for lookup. - (free_header): Removed, no longer needed. - (finalize): Free headers using header_raw_clear(). - (camel_medium_set_header): New function, to reset and override all - values of a header with a new value. - - * camel-medium.h (struct _CamelMedium): Changed to use a - header_raw struct rather than a hash table, to store headers - (many headers can occur multiple times). - - * camel-mime-utils.c (header_raw_find_next): New function, allows - you to find multi-valued header fields. - (header_disposition_format): New function to format/create - content-disposition header string. - (header_param_list_format_append): Function to format parameter - lists into a GString. - (header_content_type_format): Function to format content-type into - a usable format. - (header_set_param): allow NULL value to remove the parameter. - (decode_token): Renamed from header_decode_token. - (header_decode_token): New interface for external use. - (quoted_decode): Made static to kill annoying warnings. - (g_strdup_len): Killed, replaced with calls to g_strndup(). - (rfc2047_decode_word): Made static to kill warnings. - (decode_coded_string): Terminated. - (g_string_append_len): Made static to kill warnings. - (header_decode_text): Made static to kill warnings. - (header_decode_text): Constify. - (rfc2047_decode_word): Constify. - (header_param): Constify. - (header_content_type_new): Copy the type/subtype strings. - (header_param_list_decode): Made static. - (header_param_list_format_append): Made static. - (quoted_decode): Constify. - (g_string_append_len): Constify. - (header_token_decode): New function to decode a single token. - - * providers/mbox/camel-mbox-summary.c (header_write): Append a - trailing \n when writing headers. - (strdup_trim): Killed a warning. - (camel_mbox_summary_set_uid): Make sure the next uid is at least 1 - higher than any existing one. - (header_evolution_decode): Use header_token_decode to get the - token. - - * camel-mime-parser.c (folder_scan_header): Strip the trailing \n - of the end of all header lines. - -2000-04-20 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-utils.[ch]: Removed. - - * providers/mbox/camel-mbox-parser.[ch]: Removed. Removed - references to it. - -2000-04-20 Dan Winship <danw@helixcode.com> - - * camel-mime-utils.c (rfc2047_decode_word): use libunicode iconv - functions rather than libc ones (since libc might not have them). - (header_decode_date): add autoconfiscation on timezone code - - * camel.c (camel_init): call unicode_init () - -2000-04-20 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-summary.c (message_struct_new): Trim - leading/trailing spaces off the raw headers. - - * MERGE NEW_PARSER branch into HEAD, fixed conflicts. - - * gmime-content-field.c (_print_parameter): Duh, removed again - (@@#$@ cvs merge). - - * camel-mime-utils.c (header_content_type_is): Constify. - (header_content_type_unref): Killed a couple warnings. - - * camel-folder.c (_init): Removed more log crap. - - * providers/Makefile.am (SUBDIRS): Removed nntp, pending fixes for - summary changes. - - * providers/mbox/camel-mbox-folder.c (_get_message_by_number): - Fixed for new summary interface. Added a warning for using this - broken api. - (_get_message_by_uid): Fixed for message new with session - vanishing. - -2000-04-19 Dan Winship <danw@helixcode.com> - - * camel-simple-data-wrapper-stream.c - (camel_simple_data_wrapper_stream_get_type): This is a subtype of - CamelSeekableStream, not CamelStream. - - * camel-seekable-substream.c: clean up a lot. - (eos): When testing for end-of-stream, reset the parent position - before testing if it is at end-of-stream, since either (a) it may - have been seek'ed to eos by someone else, or (b) we may have been - seek'ed away from eos and it hasn't been synced yet. - - * camel-medium.[ch] (camel_medium_add_header): const poison. - (Belatedly goes with my change of 2000-02-23.) - (camel_medium_init): Use g_strcase_{hash,equal} on the header - array. - -2000-04-18 Dan Winship <danw@helixcode.com> - - * camel-mime-part.c (my_set_input_stream): - * camel-data-wrapper.c (set_input_stream, set_output_stream): do - better reference counting of streams so they actually go away - when they should. - - * camel-log.[ch], *: Nuke camel log stuff. Replace calls to - CAMEL_LOG_WARNING with calls to g_warning. - - * camel-data-wrapper.[ch]: - * camel-simple-data-wrapper.[ch]: - * camel-medium.[ch]: Clean, polish, document. Most of the gtk-doc - comments added to camel-data-wrapper.c note serious problems that - need to be fixed. - -2000-04-17 Dan Winship <danw@helixcode.com> - - * camel-mime-message.[ch]: Remove the "session" field from - CamelMimeMessage. Nothing uses it, about half of the existing - calls to camel_mime_message_new_with_session pass NULL, and - there's no obvious reason for it to be there. - - * providers/MH/camel-mh-folder.c: - * providers/maildir/camel-maildir-folder.c: - * providers/mbox/camel-mbox-folder.c: - * providers/mbox/camel-mbox-utils.c: - * providers/nntp/camel-nntp-folder.c: - * providers/pop3/camel-pop3-folder.c: Use camel_mime_message_new - instead of camel_mime_message_new_with_session. - - * camel-session.c (get_store_for_protocol_with_url): Set the - exception if no provider is found. - - * camel-url.c: Add code to encode and decode %-escapes in URLs, - and do some additional correctness-checking on URL syntax. From - Tiago Antào with modifications by me. - -2000-04-14 Chris Toshok <toshok@helixcode.com> - - * providers/Makefile.am (SUBDIRS): add nntp - -2000-04-14 Christopher James Lahey <clahey@helixcode.com> - - * providers/mbox/camel-mbox-folder.c: Fix switch statement. - -2000-04-14 Chris Toshok <toshok@helixcode.com> - - * providers/nntp/camel-nntp-folder.c (_exists): always return TRUE - for now. we need to check the server response to make sure the - group exists. - (_get_message_by_uid): make sure to account for the \n we add to - the string after every line. - - * providers/nntp/camel-nntp-utils.c (get_XOVER_headers): function - to get the headers using the XOVER command. - (get_HEAD_headers): function to get the headers using the HEAD - command on each message. slooooooow. - (camel_nntp_get_headers): make this function use either XOVER or HEAD - versions depending on whether or not the server extension is present. - -2000-04-14 Dan Winship <danw@helixcode.com> - - * camel-formatter.[ch]: This didn't belong in Camel. Move to mail/ - - * Makefile.am, camel-types.h: remove references to - camel-formatter. - -2000-04-12 Matt Loper <matt@helixcode.com> - - * camel-folder-pt-proxy.c (_folder_open_cb): Print warning message - for broken function. - (_folder_close_cb): Same. - -2000-04-12 Miguel de Icaza <miguel@gnu.org> - - * Makefile.am (pthread_SRC): Use correct names for the pthread - source variables. - -2000-04-10 Dan Winship <danw@helixcode.com> - - * providers/pop3/camel-pop3-store.c (pop3_connect): fix various - bugs in APOP code (still untested) and some of the error cases. - - * camel-provider.h: Clarify what provider.protocol, provider.name, - and provider.description should be. - - * providers/mbox/camel-mbox-provider.c: - * providers/pop3/camel-pop3-provider.c: - * providers/sendmail/camel-sendmail-provider.c: - * providers/smtp/camel-smtp-provider.c: update protocols, names, - and descriptions - - * providers/mbox/camel-mbox-folder.c (_get_message_by_number): - implement get_message_by_number for the mail fetch code. - -2000-04-09 Jeffrey Stedfast <fejj@stampede.org> - - * providers/smtp/camel-smtp-transport.c: reformatted to fit - the standard indent format used by helix code - -2000-04-09 Dan Winship <danw@helixcode.com> - - * camel-movemail.c: New file with new function to dot-lock an mbox - file and copy it to a safe private directory. - -2000-04-08 Christopher James Lahey <clahey@helixcode.com> - - * providers/smtp/.cvsignore: Added a .cvsignore file. - -2000-04-08 Dan Winship <danw@helixcode.com> - - * providers/sendmail/camel-sendmail-transport.c (_send_internal): - actually record the pid returned by fork(). Noticed by clahey. - - * providers/smtp/camel-smtp-transport.c: #include <sys/param.h> - for MAXHOSTNAMELEN. (This is a stopgap: some of the uses of - MAXHOSTNAMELEN are wrong anyway...) - -2000-04-07 Jeffrey Stedfast <fejj@stampede.org> - - * providers/smtp/camel-smtp-transport.c: fixes to numerous bugs; - should now build fine. - * providers/Makefile.am: Readded smtp now that smtp builds without - error. - -2000-04-20 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-summary.c - (camel_mbox_summary_next_uid): Public function to get the next - uid, makes sure its saved to disk too. - - * camel-mime-part.c (my_finalize): Fix disposition crap with a - real disposition. - (my_set_disposition): Likewise. - (my_get_disposition): And here. - (my_write_to_stream): And here, needs more cleanup. - - * providers/mbox/camel-mbox-folder.c (_append_message): Assign a - new uid at this point. - - * gmime-content-field.c (gmime_content_field_write_to_stream): - Make something up if we have an invalid/missing content type - (i.e. text/plain). - -2000-04-19 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-folder.c (_delete): Fixed completely - broken switch() syntax, only compiled because errno is a macro on - some systems. - (_list_subfolders): Likewise. - -2000-04-18 NotZed <NotZed@HelixCode.com> - - * camel-mime-parser.c (folder_scan_init): init stream to null. - - * providers/mbox/camel-mbox-summary.c - (CAMEL_MBOX_SUMMARY_VERSION): Moved to .c file, incremented. - (index_folder): Changed to have index passed via the summary. - (decode_string): Do a sanity check on the string size, so we dont - visit g_malloc()'s friendly abort(). - - * camel-folder-pt-proxy.c (camel_folder_pt_proxy_class_init): - Removed reference to set_name. - (_set_name): Removed. - - * providers/mbox/camel-mbox-utils.c - (parsed_information_to_mbox_summary): Removed. Most of this file - is about to be binned. - - * providers/mbox/camel-mbox-search.c (func_header_contains): Fixes - for changes to summary interface. - (struct _searchcontext): Remove pointer to message info, get it - straight from the mboxsummary. - (camel_mbox_folder_search_by_expression): New summary interface. - (camel_mbox_folder_search_by_expression): Uh, the summary is not - an object anymore (well not yet). - - * providers/mbox/camel-mbox-folder.c - (camel_mbox_folder_class_init): Removed set_name init. - (_set_name): Removed. - (_open): Call new summary interface. - (_close): Use new summary interface. - (_create): Removed a summary object leak. - (_get_message_count): New summary interface. - (_get_uid_list): Use new summary interface. FIXME: this is leaky. - (_get_message_by_uid): Use the new summary interface, some - cleanup. - (_append_message): Totally changed, basically just appends the - message directly, ignores the summary (for now), the summary will - fix itself up if it needs to. - (_check_get_or_maybe_generate_summary_file): Bye bye old code. - (summary_get_message_info): Implement get_message_info again, for - folder. - - * camel-folder.c (camel_folder_class_init): Removed set_name - setup. - (_set_name): Moved contents into _init. - (_init): Perform the old functions of set_name here. - - * camel-folder.h: Removed the set_name internal interface. - -2000-04-14 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-summary.[ch]: Completely replaced with - new code. - - * Makefile.am (libcamel_la_SOURCES): Removed - camel-folder-summary.[ch]. - - * camel-folder.h (struct _CamelFolder): Removed summary. - (struct _CamelFolder): Changed flags to be 1 bit bitfields. - - * camel-folder-summary.[ch]: Class removed entirely. - - * camel-folder.c (camel_folder_get_summary): Removed. - (camel_folder_summary_get_message_info): Moved from - camel-folder-summary.c - (camel_folder_summary_get_subfolder_info): Moved from - camel-folder-summary.c - - * camel-mime-parser.c (folder_scan_step): Store the start of - headers and start of from in the scan state. - (camel_mime_parser_tell_start_headers): Query the start of the - headers. - (camel_mime_parser_tell_start_from): Query the cached start of - from marker. - -2000-04-13 NotZed <NotZed@HelixCode.com> - - * gmime-content-field.c (gmime_content_field_free): Removed this - function. If its too dangerous to use, it shouldn't be here. - (gmime_content_field_ref): Also ref the embedded content-type. - (gmime_content_field_unref): Ditto to unref it. - - * camel-mime-utils.h: Add a refcount for content-type header. - - * camel-mime-utils.c (header_content_type_unref): Implement unref - for content-type. - (header_content_type_ref): Implement ref for header content type. - -2000-04-12 NotZed <NotZed@HelixCode.com> - - * gmime-content-field.h: Changed to use a _header_content_type. - Added type/subtype back for compatability with clients. - - * gmime-content-field.c: Basically a total rewrite, and now just a - thin wrapper ontop of header_content_type. - (_free_parameter): Got rid of it. - (gmime_content_field_new): Use header_content_type_* functions. - (gmime_content_field_set_parameter): Likewise. - (_print_parameter): Blow away. - (gmime_content_field_write_to_stream): Get details from the - content_type field. Should check if it needs to escape chars in - the paramter value. - (gmime_content_field_get_mime_type): Likewise. - (___debug_print_parameter): Get rid of this rather annoyingly - named function. - (gmime_content_field_get_parameter): Simplified function. - (gmime_content_field_construct_from_string): Fixed this to use a - real parser. - (gmime_content_field_is_type): New function to test if a type matches. - (gmime_content_field_construct_from_string): Track type/subtype - from subordinate content_type header struct. - - * gmime-rfc2047.[ch]: Removed. Unused. - - * camel-stream-b64.[ch]: Blown away more duplicated code. - - * Makefile.am: Removed camel-stream-b64.[ch], and - gmime-base64.[ch]. - - * camel-mime-part.c (my_get_content_object): Replaced - camel-stream-b64 with camel-stream-filter/camel-mime-filter-basic. - (my_write_content_to_stream): Replaced camel-stream-b64 with the - camel-stream-filter with an encoder. - (my_get_content_object): Also implement quoted-printable decoding. - (my_write_content_to_stream): Also implement quoted-printable - encoding. - (my_get_output_stream): Took out stream-b64 code (nothing's being - executed yet anyway). - - * gmime-base64.[ch]: Blown away. Not used, dont need it. - - * camel-mime-utils.h: Added offset for this header. Records where - it is in the source. - - * camel-mime-utils.c (header_raw_append_parse): Add offset - parameter, to store where the header is stored in the stream. - (header_raw_append): Added offset param. - (header_raw_find): Return offset, if a pointer supplied for it. - (header_raw_replace): Add offset param. - (header_content_type_new): New function, to create an empty - content type. - (header_content_type_set_param): Set a parameter in the - content-type. - (header_set_param): Generic header parameter setting function. - (header_decode_string): Handle NULL input. - - * camel-mime-parser.c (camel_mime_parser_headers_raw): New - function to get access to all the raw headers. - (folder_scan_header): Keep track of the header start position, and - store it when saving the header. - -2000-04-11 NotZed <NotZed@HelixCode.com> - - * camel-mime-utils.c: Moved a bunch of printf's to debug. - - * camel-mime-parser.c: Moved a bunch of printf's to debug. - (folder_scan_header): Detect end of each header line using the - last scanned char, and not the last scanned position. - - * camel-mime-filter-index.[ch]: Indexing filter. Indexes unicode - sequences into ibex files. - -2000-04-09 NotZed <NotZed@HelixCode.com> - - * camel-mime-part.c: Dont include gmime-base64.h - - * camel-mime-filter-charset.c (complete): Implement the completion - function. - - * camel-mime-parser.c (folder_scan_step): If we get to the end of - the body data, check any filters for outstanding completion data. - (camel_mime_parser_scan_from): Set whether we scan for "From " - headers or not. - - * camel-stream-filter.c (do_read): If we get to end of stream on - the source, then call the filtering completion function to see if - we have any more data to return. - - * camel-mime-filter-basic.c (filter): Implement quoted printable - encoding and decoding filters. - (complete): And the complete function as well. - - * camel-mime-utils.c (base64_encode_close): Also take an input - buffer, allow closing of filters. - (quoted_encode_step): First cut, simple quoted-printable encoder. - Doesn't handle trailing spaces/tabs on end of line properly yet. - (quoted_encode_close): Complete a quoted-encoding. - (is_qpsafe): New type check, for quoted-printable safe characters - (that do not need encoding). Thats all bits used in the type - table! Rebuilt the types table. - (header_content_type_is): Checks a content type against at - type/subtype match. - (header_content_type_param): Handle NULL content type pointer. - -2000-04-08 NotZed <NotZed@HelixCode.com> - - * camel-mime-filter-basic.c (filter): Implement the base64 - encoder. Problem is, there is no way to know when to close it. - Close/Reset will have to provide the same args as filter, so it can - flush remaining data *sigh* - - * camel-mime-utils.c (base64_encode_step): A rather complex base64 - encoder, fast? - (base64_step_close): Companion function to finish off the base64 - sequence. - - * camel-mime-part.c (my_write_content_to_stream): Changed to use - camel_stream_write_to_stream(). - - * camel-stream.[ch] (camel_stream_write_to_stream): From - camel_stream_b64_write_to_stream(). Fixed some infinite loop - bugs with error conditions. - - * camel-stream-b64.[ch] (camel_stream_b64_write_to_stream): Removed. - This has nothing to do with stream-b64, so i've moved it to - CamelStream. - - * camel-mime-utils.h: Add a comment about refcounting - header_content_type struct. - - * Makefile.am: Added camel-stream-filter*.[ch]. - - * camel-stream-filter.[ch]: Class to implement a generic - (multipass) filter ontop of a stream. Only implements a read-only - stream. - - * camel-mime-parser.c (camel_mime_parser_filter_add): Ref the - filter we just added. - - * Makefile.am: Added camel-mime-filter*.[ch]. - - * camel-mime-filter-charset.[ch]: A filter to preform character set - conversion (uses unicode_iconv). - - * camel-mime-filter-save.[ch]: A simple filter which will save all - data directly to a file or file descriptor. - - * camel-mime-filter-basic.[ch]: Implements the basic mime filters, - base64 and quoted-printable decoding (encoding not implemented yet). - - * camel-mime-filter.[ch]: A filtering class, which can filter streams - of data without having to copy them. Simpler than stream classes, - and can be plugged into a single stream class (when i write it). - -2000-04-07 Dan Winship <danw@helixcode.com> - - * providers/pop3/camel-pop3-store.c (pop3_connect): Clarify error - messages. - (finalize): fix a bug in camel_exception usage - (pop3_connect): Remember the password after asking for it the - first time. - -2000-04-07 NotZed <NotZed@HelixCode.com> - - * Makefile.am: Added camel-mime-parser/camel-mime-utils. - - * camel-mime-parser.c: Fast mime parser. - - * camel-mime-utils.c: Mime utility functions, and email header - parsers. - -2000-04-07 NotZed <NotZed@HelixCode.com> - - * providers/Makefile.am: Removed smtp for now, its a long way from - building. - * providers/smtp/Makefile.in: Removed file that shouldn't have been - checked in. - -2000-04-06 Matt Loper <matt@helixcode.com> - - * camel-folder-pt-proxy.c (_get_full_name): Remove exception param - from get_full_name() called, since get_full_name() was changed to - not have an exception in the last param (see dan's notes below). - (_get_name): same. - -2000-04-06 Dan Winship <danw@helixcode.com> - - * camel-store.[ch]: Reorganize the folder-fetching methods and - implement a folder cache so that multiple requests for the same - folder will yield the same CamelFolder object (as long as it - remains active). Includes some code to remove no-longer-active - folders from the cache, but it doesn't get used since nothing is - ever unref'ed in Camel right now... - - * providers/mbox/camel-mbox-store.c: - * providers/pop3/camel-pop3-store.c: update for CamelStore - changes. - - * camel-folder.[ch]: Remove the (unused) CamelException argument - from camel_folder_get_name and camel_folder_get_full_name. - (camel_folder_set_name): make this go away since changing a - folder's name after it has been created could result in it - conflicting with a separately-issued folder. - -2000-04-05 Dan Winship <danw@helixcode.com> - - * g_url_new really wanted to take a CamelException. So, rename - Gurl to CamelURL, g_url_* to camel_url_* (with camel_url_new - taking an exception), and url-util.[ch] to camel-url.[ch]. Also - force url->port to be numeric and remove camel_service_getport. (I - was confused before: the URL RFC says the port must be numeric, so - we don't want to do getportbyname.) - -2000-04-01 Dan Winship <danw@helixcode.com> - - * providers/mbox/camel-mbox-folder.c - (_check_get_or_maybe_generate_summary_file): Compare - mbox_file_size and mbox_modtime to the results of stat()ing the - mbox file, not the summary file. Duh. - (_close): Update the summary's mbox_file_size and mbox_modtime - before writing it to disk. - - * providers/mbox/camel-mbox-summary.c (camel_mbox_summary_save, - camel_mbox_summary_load): Wow. I must have been tired when I wrote - this code. First, the comparison bug above. Second, it was using - ntohs and htons instead of ntohl and htonl. Third, I was reading - the status flag byte in two different places and thus getting out - of sync. Fourth, it was writing out field_length bytes of each - header field after having converted field_length to network byte - order, resulting in lots of random crap being appended, and the - summary files being huge. (Fortunately, since the size/modtime - comparison was biffed, the garbage summary read from disk was - always immediately discarded.) - - * providers/mbox/camel-mbox-parser.c (camel_mbox_parse_file): fix - an off-by-one error that caused the last-used UID to be reused if - the summary file was regenerated. (That one wasn't my fault. :-) - -2000-03-31 Dan Winship <danw@helixcode.com> - - * camel-stream-mem.c: implement unimplemented methods - - * gmime-content-field.c - (gmime_content_field_construct_from_string): - * data-wrapper-repository.c - (data_wrapper_repository_get_data_wrapper_type): - * camel-simple-data-wrapper.c (my_write_to_stream): - * camel-mime-part.c (my_set_input_stream): - remove debugging printf()s that no longer seem useful. - -2000-03-31 Matt Loper <matt@helixcode.com> - - * camel-formatter.c (text_to_html): Added "convert_newlines_to_br" - boolean param, to give the option of not converting '\n's to <br> - tags. This way, when we stick stuff in a <pre> tag, newlines stay - newlines. - -2000-03-30 Matt Loper <matt@helixcode.com> - - * camel-formatter.c (handle_text_plain): Use <pre> tag to force - the use of monospaced fonts. - -2000-03-30 Dan Winship <danw@helixcode.com> - - * camel-service.c (camel_service_getport): Add a htons in the - default_number case, and document the fact that the function - returns the port in network byte order. - - * providers/pop3/camel-pop3-store.c (pop3_connect): Revert - Miguel's change. The port number bug was actually somewhere - else, and the IP address copying code was fine already. - -2000-03-29 Miguel de Icaza <miguel@gnu.org> - - * providers/pop3/camel-pop3-store.c (pop3_connect): Add htons - (port), and only copy 4 bytes for the IP address to prevent a DNS - attack. - -2000-03-28 Dan Winship <danw@helixcode.com> - - * camel-seekable-substream.c - (camel_seekable_substream_new_with_seekable_stream_and_bounds): - make this return a CamelStream rather than a - CamelSeekableSubstream, because that's the way Gtk objects tend to - work. - - * camel-service.c (camel_service_gethost, - camel_service_getport): convenience functions to canonicalize - the host and port values of a service's URL. - * providers/pop3/camel-pop3-store.c: use them - - * providers/mbox/camel-mbox-folder.c - (_check_get_or_maybe_generate_summary_file): Make this work when - the inbox file doesn't yet exist. - -2000-03-27 Dan Winship <danw@helixcode.com> - - * providers/mbox/camel-mbox-folder.c (_append_message): uncomment - the call to unlink the temp file: there's no way to tell - camel_stream_fs to truncate a file, so reusing the same file was - resulting in junk at the ends of messages. - - * camel-folder.[ch]: add delete_message_by_{number,uid}. - - * providers/pop3/camel-pop3-folder.[ch]: implement - delete_message_by_uid. Add a close method to do expunging - of deleted messages if requested. - - * providers/pop3/camel-pop3-store.[ch]: support for - CamelPop3Folder::close. (You have to close the connection - in order to expunge the folder, thus the store may be - connected in the CamelService::is_connected sense when it - is not actually connected to the server.) Also some bugfixes. - -2000-03-27 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-folder.c (_append_message): Unref the - output_stream when done, close doesn't do it. - (_append_message): Clear all uid's from the appending messages, so - they are reassigned proper unique id's. - - * gmime-utils.c (get_header_array_from_stream): Actually free the - header, it is copied elsewhere. - -2000-03-26 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-utils.c (camel_mbox_write_xev): Added - folder parameter to function. Fixed callers. - (index_message): Index a message as it is assigned a unique id. - - * camel-mime-part.c (my_set_content_id): Make sure we malloc and - copy the content_id, otherwise *poof* - -2000-03-25 NotZed <NotZed@HelixCode.com> - - * camel-medium.c (_finalize): Another leak, unref the content if - finished with it. - - * camel-recipient.c (camel_recipient_table_free): Plug another - memory leak - actually free the recipient table. - - * camel-mime-message.c (_finalize): Plugged a memory leak with the - flags table. - - * gmime-utils.c (_store_header_pair_from_string): A simpler, more - debuggable and functionally identical header extraction function. - -2000-03-24 NotZed <NotZed@HelixCode.com> - - * gmime-content-field.c (gmime_content_field_set_parameter): - Remove the hash table entry before freeing its key and data. - -2000-03-27 Dan Winship <danw@helixcode.com> - - * providers/Makefile.am (SUBDIRS): Add pop3. - - * providers/pop3/camel-pop3-store.c: keep separate input and - output streams so the output doesn't end up being buffered. - - * providers/pop3/camel-pop3-folder.c (get_message_by_number): - finish implementing this. - -2000-03-27 Michael Meeks <michael@helixcode.com> - - * camel-mime-part.c (my_set_disposition): fix so less broken. - (my_finalize): remove dodgy disposition free. - - * camel-data-wrapper.c (my_set_mime_type_field): unref instead of - free on mime_type. - -2000-03-27 Dan Winship <danw@helixcode.com> - - * camel-service.c (camel_service_free_auth_types): new routine to - free the data allocated by camel_service_query_auth_types. - - * providers/pop3/camel-pop3-store.c (free_auth_types): implement - - * camel-stream-mem.c (camel_stream_mem_new_with_buffer): rename - camel_stream_mem_new_with_buffer to ..._with_byte_array and add a - new ..._with_buffer that takes a char * rather than a GByteArray. - - * Remove CamelStreamBufferedFs, since CamelStreamBuffer makes it - redundant. - -2000-03-25 Dan Winship <danw@helixcode.com> - - * camel-folder-summary.[ch]: change the CamelFolderSummary - interfaces to allow partial summary queries (for dealing - with very large folders). Remove the "extended_fields" from - CamelFolderInfo and CamelMessageInfo: this is better dealt - with by subtyping. - - * providers/mbox/camel-mbox-summary.[ch]: Make CamelMboxSummary a - subclass of CamelFolderSummary. Update interfaces for that. Remove - the internal/external summary distinction. Remove the (unused) md5 - checksum in the folder summary. Change the summary file format - (primarily to make it no longer byte-order dependent) and add a - version number to it so it will be easier to change in the future. - - * providers/mbox/camel-mbox-folder.[ch] - * providers/mbox/camel-mbox-search.c - * providers/mbox/camel-mbox-utils.c: update for summary changes - - * camel-exception-list.def: add - CAMEL_EXCEPTION_FOLDER_SUMMARY_INVALID - -2000-03-23 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-provider.c: Added flag to provider - initialisation, to match changed structure. - -2000-03-22 NotZed <NotZed@HelixCode.com> - - * camel-folder.[ch]: Added async search api. - - * providers/mbox/camel-mbox-search.c - (camel_mbox_folder_search_by_expression): Changed to use an - asynchronous interface. - (camel_mbox_folder_search_cancel): Cancel function for async - interface. - -2000-03-23 Dan Winship <danw@helixcode.com> - - * camel-stream-buffer.c (camel_stream_buffer_read_line): Function - to read one line of any size from a stream and return it in - allocated memory. - -2000-03-22 Dan Winship <danw@helixcode.com> - - * camel-service.c (camel_service_query_auth_types): New function - to query a service for the authentication protocols it supports. - * providers/pop3/camel-pop3-store.c (query_auth_types): implement - - * camel-provider.c (camel_provider_scan): New function to - scan the provider dir and return a list of all providers. - - * providers/pop3/camel-pop3-folder.c: fill this in partially - * providers/pop3/camel-pop3-store.c: make camel_pop3_command - return the text after "+OK"/"-ERR" and add a separate - camel_pop3_get_additional_data to get the message body or - whatever. Also make them take a CamelPop3Store rather than - a CamelStreamBuffer. - -2000-03-22 Matt Loper <matt@helixcode.com> - - * camel-formatter.c (debug): Disabled some useless debug - messaging. - -2000-03-21 Dan Winship <danw@helixcode.com> - - * providers/pop3: some initial bits of the POP3 provider, to - make Matt happy. Incomplete, untested, etc. - -2000-03-21 bertrand <bertrand@helixcode.com> - - * providers/mbox/camel-mbox-summary.c - (camel_mbox_summary_append_internal_to_external): copy the size field - - * providers/mbox/camel-mbox-folder.c (_get_message_by_uid): initialize - message_info to NULL - - * camel-folder-summary.h: added the size field. - - * providers/mbox/camel-mbox-summary.h: - added the received_date field. - - * providers/mbox/camel-mbox-summary.c: - documented all functions. - - * camel-folder-summary.h: name change and - new fields. - - * providers/mbox/camel-mbox-search.c: update to - conform to name change in the summary fields. - -2000-03-10 bertrand <bertrand@helixcode.com> - - * camel-service.h: cosmetic changes. - -2000-03-09 Dan Winship <danw@helixcode.com> - - * s/HelixCode/Helix Code, Inc./ in the copyrights - -2000-03-07 bertrand <bertrand@helixcode.com> - - * camel-formatter.c (handle_mime_part): - plug mem leaks due to bad documentation - of camel_content_field_get_mime_type - (print_camel_body_part): idem - (handle_multipart_alternative): idem - - * gmime-content-field.c (gmime_content_field_get_mime_type): - documentation fix. - - - * camel-mime-part.c (my_finalize): unref the - content_input_stream if any. - -2000-03-06 bertrand <bertrand@helixcode.com> - - * camel-stream-fs.c (_seek): fix a bogus calculation - in the return position. - -2000-03-05 bertrand <bertrand@helixcode.com> - - * camel-session.h: cosmetic fixes. - - * camel-stream-fs.c (_read): - (_seek): fixed the current position so that it refers - to the current position in the stream, not in its parent. - -2000-03-04 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-search.c - (camel_mbox_folder_search_by_expression): Ref the summary - after we have got it. - -2000-03-04 bertrand <bertrand@helixcode.com> - - * camel-mime-part.c (my_write_content_to_stream): - stream the raw content instead of nothing if the encoding - is not supported. - - * camel-stream-fs.c (_seek): handle eos more - properly. - - * camel-formatter.c (get_bonobo_tag_for_object): - bonobo-goad-id is the good key to look for. - (get_bonobo_tag_for_object): close the <object> tag. - (get_bonobo_tag_for_object): the correct syntax for the - to set a parameter inside an <object> tag is : - <object classid="..."> <param name="uid" value="..."> <param ...> - </object> - -2000-03-03 bertrand <bertrand@helixcode.com> - - * providers/mbox/camel-mbox-folder.c (_get_message_by_uid): - use set_input_stream instead of construct_from_stream - to feed the message object. - - * camel-data-wrapper.c (my_write_to_stream): reset output stream. - (my_set_input_stream): unref the previous input stream. - use the set_output_stream for default behaviour. - (my_set_output_stream): unref previous output stream. - - * camel-mime-part.c (my_write_content_to_stream): reset content - object output stream. - -2000-03-03 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-utils.c (camel_mbox_write_xev): Make - sure we open with create with a creation mask. - -2000-03-01 NotZed <NotZed@HelixCode.com> - - * camel-mime-part-utils.c - (camel_mime_part_construct_content_from_stream): DO NOT assert on - content type, we have fallback code 4 lines below it ... *sigh* - -2000-02-29 NotZed <NotZed@HelixCode.com> - - * Makefile.am (libcamelinclude_HEADERS): Added camel-stream-buffer - to build. - - * camel-stream-buffer.[ch]: Generic buffer which can be applied to - any stream. - -2000-03-03 bertrand <bertrand@helixcode.com> - - * camel-formatter.c (handle_image): in the case - of images, put the content object output stream - in the url. This allows the message browser - to show inline images. - - * camel-stream-b64.c (my_read_encode): fixed state - 0 keep value. - -2000-03-02 bertrand <bertrand@helixcode.com> - - * camel-stream-b64.c (my_read_encode): don't forget to - set the state to 0 after 3. - (my_read_encode): don't forget to encode, even in state 3. - - * camel-simple-data-wrapper.c: static functions are prefixed - with my_ instead of _ - * camel-multipart.c: static functions are prefixed - with my_ instead of _ - (my_write_to_stream): commented. - (my_write_to_stream): warning in case the boudary is set - but is a zero length string. - - * camel-mime-part.c (camel_mime_part_encoding_from_string): - remove debug trace. - - * camel-mime-part.c: Replaced all static functions - with name begining with _ by the same name begining - with "my_" to prevent the possible conflicts - with system symbols Dan warned us about. - - * camel-stream-b64.c (camel_stream_b64_write_to_stream): - use CamelStreamB64 type for the input stream. - - * camel-mime-part.c (_get_content_object): remove - debugging trace - (_write_content_to_stream): implement the b64 - encoding the new way (that is using camel_stream_b64) - - * camel-data-wrapper.c (my_write_to_stream): - fix implementation so that it writes properly - to the output stream even. - - * camel-stream-b64.c (camel_stream_b64_write_to_stream): - fix implementation. - -2000-02-29 bertrand <bertrand@helixcode.com> - - * camel-stream-b64.c (camel_stream_b64_write_to_stream): new - utility function. - - * camel-data-wrapper.c (_write_to_stream): default - implementation. - - * gmime-utils.c (_store_header_pair_from_string): - revert strange changes. - - * camel-stream-b64.c (my_read_decode): set eos to true when we - have read the whole input stream. - (my_reset): set eos to FALSE. - -2000-02-28 NotZed <NotZed@HelixCode.com> - - * camel-mime-part.c (_parse_header_pair): Dont free this either. - - * camel-medium.c (_remove_header): Ugh, dont free the header - before we actually remove it. - (_add_header): Ugh, dont free hashtable entries which may be - duplicated (hash_insert _will_ reference that memory). - - * string-utils.c (string_trim): Trimming a 0-length string is not - an error. - - * camel-mime-message.c (_parse_header_pair): Fixed very broken - memory handling of header_name/value. - - * providers/mbox/camel-mbox-utils.c (camel_mbox_write_xev): - Initialise end_of_last_message always. - (camel_mbox_copy_file_chunk): Stop trying to read if we run out of - data, rather than looping forever. - (camel_mbox_write_xev): Use an open flag when opening with create. - - * camel-folder.c (camel_folder_search_by_expression): No, its not - a fatal error to search on a non-searchable folder, you just dont - get any matches. - (_open): Dont open an opened folder (i dont see why this is really - a bug, but what the hell ...) - - * providers/mbox/camel-mbox-folder.c (_init): Set search cap on. - (_open): Call parent class to perform open. Remove folder-open - check to parent instead. - (_create): open takes a creation mask, dont use umask to try and - set the open mode. - (_delete): Dont bother checking folder==NULL, its already been - checked on the external interface (changed to an assertion, this - would have to be a camel bug). - (_delete_messages): Likewise. - (_create): Ditto. - (_init): Dont go and clear all the paths and shit that the parent - open just setup for us. - (_delete_messages): Get rid of more umask stuff. - (_append_message): Make sure we pass file mode to open with create. - (_append_message): Cleaned up some indenting to make it readable. - - * camel-stream-b64.c (my_read_encode): Fixed a typo. - - * providers/mbox/camel-mbox-search.c: Changed to use e-sexp, - rather than filter-sexp. - -2000-02-28 bertrand <bertrand@helixcode.com> - - * camel-stream-b64.c (my_read_encode): encoding - filter. - -2000-02-23 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel-stream-b64.c: changed the __static - suffix into a my_ prefix. - (camel_stream_b64_set_mode): reset the persistent - status. - (my_read_decode): remove superfluous % - - * providers/mbox/camel-mbox-utils.c (camel_mbox_copy_file_chunk): - fix exception description message. - -2000-02-24 Dan Winship <danw@helixcode.com> - - * camel-session.c: Add camel_session_get_transport_for_protocol. - - * camel-transport.h: - * camel-transport.c: Add an abstract CamelTransport class. - - * providers/sendmail/*: A CamelTransport that uses sendmail - to deliver mail. - -2000-02-24 Dan Winship <danw@helixcode.com> - - * camel-folder.c: use CamelExceptions for run-time errors, not - incorrect code. Don't bother validating that an object exists from - inside one of its methods, since you couldn't have gotten there if - it didn't. Fix some code style bugs. - - (_init): Rename init_with_store to init and add parent_folder, - separator, and name arguments. - (_set_name): Get separator from self, not parent_store now. - - * camel-store.h: - * camel-store.c: Remove get/set_separator. - - * providers/mbox/: Update for above. - -2000-02-23 Dan Winship <danw@helixcode.com> - - * camel-medium.c (_finalize): Free the data in the headers hash - table. - (_add_header): g_strdup the header name and value when adding it. - - * camel-mime-part-utils.c - (camel_mime_part_construct_headers_from_stream): Free the header - data after calling camel_medium_add_header, since it will have - g_strdup()ed it itself. - -2000-02-22 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-search.c: Dont compile by default. - - * providers/mbox/Makefile.am: Fuck off the filter code. - -2000-02-22 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel-stream-b64.c (read_decode__static): - don't read the char if we reached the length - of the output buffer. Hours lost on this - %$!@# bug : 3.5 - - * camel-folder.c (camel_folder_get_subfolder): - (camel_folder_create): - (camel_folder_delete): - (camel_folder_delete_messages): - (camel_folder_list_subfolders): - (camel_folder_expunge): - (camel_folder_get_message_by_number): - (camel_folder_get_message_count): - (camel_folder_append_message): - (camel_folder_copy_message_to): - (camel_folder_get_summary): - (camel_folder_get_message_uid): - (camel_folder_get_message_by_uid): - (camel_folder_get_uid_list): - Check folder state (open/close) and raise an - exception if it is not ok. - - * providers/mbox/camel-mbox-folder.c (_create): - create the file and the path with two different - names. - - * camel-folder.c (_create): handle the case - when the folder name starts with '/' - - * camel-exception.c (camel_exception_new): use - (void) instead of () in decl. - - * camel-exception.h: cosmetic fixes. - - * camel-exception.c (camel_exception_init): new routine. - Fix a bug in mail/message-list.c - - - * camel-folder.h: cosmetic changes. - - * camel-stream-b64.c (reset__static): added a - reset method. Thanks message-browser to find - so much bugs :) - - * providers/mbox/Makefile.am (libcamelmbox_la_LIBADD): readd - Unicode libs. - -2000-02-21 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel-formatter.c (lookup_unique_id): - awful hack to test get_output_stream. - * camel-stream-b64.[ch] : - b64 encoding/decoding is now implemented as - a stream. - - -2000-02-21 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel-seekable-substream.c (_reemit_parent_signal): - emit "data_available" when parent stream emits it. - - -2000-02-21 NotZed <NotZed@HelixCode.com> - - * providers/mbox/Makefile.am: Uh, fixed LIBADD again. What was - there was never ever going to work, wasn't it tested? - - -2000-02-21 Dan Winship <danw@helixcode.com> - - * camel-session.h: (struct _CamelSession): Add authenticator. - - * camel-session.c (camel_session_new): Add authenticator. - (camel_session_query_authenticator): New function to query the - session authenticator for password, etc, information. - -2000-02-21 Dan Winship <danw@helixcode.com> - - * camel-session.c: add CamelExceptions to several functions. Use - camel_session_new to initialize the session and URL fields of - created CamelStores as appropriate. - - * camel-store.h: - * camel-store.c - * camel-service.h: - * camel-service.c: Move the session and url (and associated - functions) from CamelStore to CamelService. Add url_flags to - CamelService so subclasses can specify which URL components - are mandatory for them. Add camel_session_new for - camel_session_get_store* to use. - - * providers/mbox/camel-mbox-folder.c: - * providers/mbox/camel-mbox-store.c: - * providers/mbox/camel-mbox-store.h: Update for above changes. - - * camel-exception-list.def: Once camel is being used for real, - exceptions won't be renumberable. So renumber them now to make - more room to add exceptions to the various categories later, and - add a big warning message. - -2000-02-20 Dan Winship <danw@helixcode.com> - - * providers/mbox/Makefile.am: add libibex back to - libcamelmbox_la_LIBADD - -2000-02-18 NotZed <NotZed@HelixCode.com> - - * providers/mbox/camel-mbox-search.h - (camel_mbox_folder_search_by_expression): Added exception to call, - and fixed caller. - - * providers/mbox/camel-mbox-search.c - (camel_mbox_folder_search_by_expression): Major changes, to use - the sexp evaluator from filter/filter-sexp.c to implement the - searching. - (func_body_contains): Changed to support multiple strings in 1 - command (results or'd together) - - * url-util.c (g_url_new): Fixed a typo (colon == 0 isn't right), - and made it so full url's are absolute pathed (Dan, this is how it - has to work!). Also, always include a path part, even if it is an - empty string. - -2000-02-18 Dan Winship <danw@helixcode.com> - - * camel/camel-types.h: New header with the typedefs for all camel - classes. Now the class headers can just include this and the - header for the parent type. This makes it possible for - CamelService to include a CamelSession without creating an - #include loop. - - * camel/*: - * composer/e-msg-composer-attachment-bar.h: - * mail/folder-browser.c: - * mail/message-list.c: frob #includes to match the new reality - -2000-02-17 Dan Winship <danw@helixcode.com> - - * camel/camel-service.h: - * camel/camel-service.c: Make camel-service us a Gurl internally. - Remove the login/password interfaces and instead provide - camel_service_connect_with_url. Add CamelExceptions - -2000-02-17 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-formatter.c (handle_text_plain): - (handle_text_html): use camel_stream_reset instead - of seek. The formatter should be able to work - with all streams, not only seekable streams. - In the case where some provider implementation - would not be able to provide a reset method - to their stream, implementors would have - to find a workaround. - - * camel/camel-session.c (camel_session_new): use - (void) instean of () in function decl. - - * camel/camel-folder.c: ifdef async operation - related code. - - * camel/camel-seekable-stream.c (_seek): added a warning. - (_reset): default implementation of reset for seekable - stream. - - * camel/camel-mime-message.h: set_received_date declaration fix. - cosmetic changes. - - * camel/providers/mbox/camel-mbox-provider.c (camel_provider_module_init): - use (void) instead of (). - - * camel/camel-stream.c (camel_stream_reset): - new method for CamelStream. - -2000-02-17 Dan Winship <danw@helixcode.com> - - * camel/url-util.c (g_url_to_string): New function to convert - a Gurl back into a char *. - -2000-02-17 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-formatter.c (handle_text_plain): - revamped so that it uses the output stream - of the data wrapper - (handle_text_html): ditto. - - - * camel/camel-simple-data-wrapper.h: - * camel/camel-simple-data-wrapper.c (camel_simple_data_wrapper_new): - use (void) instead of (). - (_get_output_stream): simple implementation. - -2000-02-16 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-data-wrapper.c (_set_input_stream): ref input stream - (_set_output_stream): ref output stream - (_finalize): unref input and output streams - - * camel/camel-seekable-substream.c (_set_bounds): don't - seek the begining of the substream. - (_eos): fix eos condition testing. - (_finalize): unref parent stream - (_init_with_seekable_stream_and_bounds): ref parent stream - - * camel/gstring-util.c (g_string_equal_for_hash): - (g_string_equal_for_glist): return type is int. - - * camel/camel.h: - * camel/camel.c (camel_init): use (void) - instead of (). - -2000-02-16 NotZed <NotZed@HelixCode.com> - - * providers/mbox/Makefile.am (libcamelmbox_la_LIBADD): Added - libfilter to link line (temporarily?). Required for - filter-sexp. - -2000-02-15 bertrand <bertrand@helixcode.com> - - * camel/camel-multipart.c (_localize_part): - this routine replaces the _read_part routine - and does not store the part in a buffer. - (_set_input_stream): use the set_input_stream - instead of the construct_from_stream. - each bodypart is given an input stream. - - * camel/camel-mime-part-utils.c: - include the data-wrapper-repository header. - (camel_mime_part_construct_content_from_stream): - use the set_input_stream instead of the - construct_from_stream method. - - * camel/camel-seekable-substream.c (_set_bounds): - cur position is set to 0 not to inf_bound. - -2000-02-15 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-mime-part.c: include gmime-base64.h - various compilation and runtime fixes. - (_set_input_stream): store the input substream - for the content object. - - * camel/camel-data-wrapper.h: declare the - set/get function on input/output stream. - - * camel/camel-mime-part.c (_get_content_object): - don't use a temporary mem stream. - - * camel/camel-seekable-substream.c (_seek): - (_eos): - (_read): the substream can be unlimited in length - - * camel/camel-data-wrapper.c (camel_data_wrapper_class_init): - set the get/set_input/output_stream methods. - - * camel/camel-multipart.c (_construct_from_stream): - camel_stream_seek -> camel_seekable_stream_seek - -2000-02-14 Miguel de Icaza <miguel@gnu.org> - - * camel/providers/mbox/Makefile.am (libcamelmbox_la_LIBADD): Add - the unicode libraries as well. - - * camel/camel-provider.c (camel_provider_register_as_module): Add - error reporting here. Desire to use Solaris increases. Hair loss - in the last two hours: 5,400. - - * camel/providers/mbox/camel-mbox-provider.c - (camel_mbox_get_provider): Renamed function. - - * camel/camel.h: All include files use camel/ now here. - - * camel/providers/mbox/Makefile.am: Drop all the dynamism from - Camel, and make this a standard library. - -2000-02-14 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/gmime-utils.c (get_header_array_from_stream): use the - eos stream method. - (gmime_read_line_from_stream): ditto. - - * camel/camel-stream-fs.h (struct ): add the eof field - cosmetics changes. - - * camel/camel-stream-fs.c (camel_stream_fs_init): set eof. - (_read): set eof on end of file. - (_eos): implemented. - - * camel/gmime-utils.c (get_header_array_from_stream): - make a blocking version of the header parser. - When the fs stream uses gnome-vfs, this should - be changed. - (gmime_read_line_from_stream): ditto. - -2000-02-11 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-stream-fs.c: - everywhere, when using the cur_pos field, do it - on the CamelSeekableStream object. - (_seek): small fix. - - * camel/camel-seekable-stream.c (camel_seekable_stream_seek): - s/camel_stream_seek/camel_seekable_stream_seek/g - - * camel/camel-seekable-stream.h: - (struct ): added a field to store the - current position. - - * camel/camel-seekable-stream.c (camel_seekable_stream_get_current_position): - New function. Allows to get the current position - of a seekable stream. - - -2000-02-13 NotZed <notzed@zedzone.helixcode.com> - - * providers/mbox/camel-mbox-search.c: New file, implements the - search api for mbox folders. - - * providers/mbox/Makefile.am: Link with ibex. - - * camel-folder.c (camel_folder_has_search_capability): Api - additions. - (camel_folder_search_by_expression): Ditto. - -2000-02-12 NotZed <notzed@zedzone.helixcode.com> - - * providers/mbox/camel-mbox-folder.c (_set_name): Setup index - filename as well. - (_init_with_store): Init index filename. Hmm, none of these - names ever seem to get free'd (FIXME?) - - * providers/mbox/camel-mbox-folder.h: Add index file name. - -2000-02-12 NotZed <notzed@helixcode.com> - - * camel-folder.h: Add folder search functions. - - ** Created ChangeLog just for camel ** - - refer to ../ChangeLog for changes prior to this date. diff --git a/camel/Makefile.am b/camel/Makefile.am deleted file mode 100644 index 67689b261a..0000000000 --- a/camel/Makefile.am +++ /dev/null @@ -1,138 +0,0 @@ -## Process this file with automake to produce Makefile.in - -SUBDIRS = providers - -libcamelincludedir = $(includedir)/camel -providerdir = $(libdir)/evolution/camel-providers/$(VERSION) - -lib_LTLIBRARIES = libcamel.la - -INCLUDES = -I.. -I$(srcdir)/.. -I$(includedir) \ - -I$(top_srcdir)/intl \ - -I$(top_srcdir)/e-util \ - $(GLIB_CFLAGS) \ - $(UNICODE_CFLAGS) \ - -DCAMEL_PROVIDERDIR=\""$(providerdir)"\" \ - -DG_LOG_DOMAIN=\"camel\" - -libcamel_la_SOURCES = \ - broken-date-parser.c \ - camel-address.c \ - camel-data-wrapper.c \ - camel-exception.c \ - camel-folder-search.c \ - camel-folder-summary.c \ - camel-folder.c \ - camel-internet-address.c \ - camel-medium.c \ - camel-mime-filter-basic.c \ - camel-mime-filter-charset.c \ - camel-mime-filter-crlf.c \ - camel-mime-filter-from.c \ - camel-mime-filter-index.c \ - camel-mime-filter-linewrap.c \ - camel-mime-filter-save.c \ - camel-mime-filter.c \ - camel-mime-message.c \ - camel-mime-parser.c \ - camel-mime-part-utils.c \ - camel-mime-part.c \ - camel-mime-utils.c \ - camel-movemail.c \ - camel-multipart.c \ - camel-object.c \ - camel-provider.c \ - camel-remote-store.c \ - camel-seekable-stream.c \ - camel-seekable-substream.c \ - camel-service.c \ - camel-session.c \ - camel-store.c \ - camel-stream-buffer.c \ - camel-stream-filter.c \ - camel-stream-fs.c \ - camel-stream-mem.c \ - camel-stream.c \ - camel-transport.c \ - camel-uid-cache.c \ - camel-url.c \ - camel-charset-map.c \ - camel.c \ - gmime-content-field.c \ - gstring-util.c \ - hash-table-utils.c \ - string-utils.c - -libcamelinclude_HEADERS = \ - broken-date-parser.h \ - camel-address.h \ - camel-charset-map.h \ - camel-charset-map-private.h \ - camel-data-wrapper.h \ - camel-exception-list.def \ - camel-exception.h \ - camel-folder-search.h \ - camel-folder-summary.h \ - camel-folder.h \ - camel-internet-address.h \ - camel-medium.h \ - camel-mime-filter-basic.h \ - camel-mime-filter-charset.h \ - camel-mime-filter-crlf.h \ - camel-mime-filter-from.h \ - camel-mime-filter-index.h \ - camel-mime-filter-linewrap.h \ - camel-mime-filter-save.h \ - camel-mime-filter.h \ - camel-mime-message.h \ - camel-mime-parser.h \ - camel-mime-part-utils.h \ - camel-mime-part.h \ - camel-mime-utils.h \ - camel-movemail.h \ - camel-multipart.h \ - camel-object.h \ - camel-provider.h \ - camel-remote-store.h \ - camel-seekable-stream.h \ - camel-seekable-substream.h \ - camel-service.h \ - camel-session.h \ - camel-store.h \ - camel-stream-buffer.h \ - camel-stream-filter.h \ - camel-stream-fs.h \ - camel-stream-mem.h \ - camel-stream.h \ - camel-transport.h \ - camel-types.h \ - camel-uid-cache.h \ - camel-url.h \ - camel.h \ - gmime-content-field.h \ - gstring-util.h \ - hash-table-utils.h \ - string-utils.h - -libcamel_la_LDFLAGS = -version-info 0:0:0 -rpath $(libdir) - -libcamel_la_LIBADD = $(top_builddir)/e-util/libeutil.la $(UNICODE_LIBS) - -EXTRA_DIST = \ - README - -#noinst_PROGRAMS = \ -# camel-mime-filter-from -# -#camel_mime_filter_from_SOURCES = \ -# camel-mime-filter-from.c -# -#camel_mime_filter_from_LDADD = \ -# ../camel/libcamel.la \ -# ../e-util/libeutil.la \ -# ../libibex/libibex.la \ -# $(GNOME_LIBDIR) \ -# $(GNOMEUI_LIBS) \ -# $(INTLLIBS) \ -# $(PTHREAD_LIB) \ -# $(EXTRA_GNOME_LIBS) diff --git a/camel/README b/camel/README deleted file mode 100644 index f020174d5e..0000000000 --- a/camel/README +++ /dev/null @@ -1,57 +0,0 @@ - - CAMEL - - - A generic Messaging Library - - - ---- - - -Introduction: -------------- - -Camel will be a generic messaging library. It will evntually support -the standard messaging system for receiving and sending messages. -It aims at being the backend for the future gnome-mailer system. - -The name "camel" stands for ... nothing. Open area of development there. -You know, that "bazaar" thing. Maybe could we organize a big contest on -gnome-list to find the best explanation :) - -Camel draws heavily from JavaMail and the IMAP4rev1 RFC. People -wanting to hack on a provider should read the JavaMail API -specification, but CMC and MAPI are of interest too. - -Please, before starting anything, wait for me to finish the abstract -classes. Some parts are not definitive yet. - - -Organization: -------------- - -The library is roughly a set of abstract classes, some kind of generic -"interfaces" (idl interfaces, not java interfaces ). - -Particular implementations are called providers. - -Here are the basic objects: - -* CamelService : an abstract class representing an access to a server. -Handles the connection and authentication to any server. - -* CamelStore (CamelService): A hierarchy of folders on a server. - -* CamelFolder : An object containing messages. A folder is always -associated with a store. - -* CamelMessage : An object contained in folders. Is defined by a set -of attributes and a content. (Attributes include: the date it was -received, the sender address, .....) - -* CamelTransport (CamelService): A way to send messages. - -.... -... - - diff --git a/camel/README.COPYRIGHT b/camel/README.COPYRIGHT deleted file mode 100644 index 91774e7339..0000000000 --- a/camel/README.COPYRIGHT +++ /dev/null @@ -1,47 +0,0 @@ -Important note for Camel hackers: ---------------------------------- - -Camel has been a lot of work, and has been conceived to be general -enough to be used outside the gnome-mailer. It is possible in the -future that it is used in softwares with licenses incompatible with the -LGPL. For this reason, the copyright has to be owned by a unique -person. Be sure, however, that Camel will always be available under -the LGPL. Significant authors will always be consulted before any -special use of Camel. Moreover, in special situations, they may be -given the authorization to use Camel with a license different than the -LGPL. - -Thus, when adding code in Camel, always add the following lines at the -begining of the file: - -/* - * - * Copyright 199x, 200x Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -You may also want to add your name to the author name list after this -header. - -Please contact me (Bertrand.Guiheneuf@aful.org) if you want to discuss -this copyright issue. - -Happy hacking, - -Bertrand. - - diff --git a/camel/README.HACKING b/camel/README.HACKING deleted file mode 100644 index a4742ee7b8..0000000000 --- a/camel/README.HACKING +++ /dev/null @@ -1,14 +0,0 @@ -You want to hack on Camel ? - -Thanks. Camel aims at being the best messaging -library for Linux and your help is welcome. -Please be sure to read the following files before -commiting any change or sending any patch: - -CODING.STYLE -README.COPYRIGHT - - -Thanks. - - Bertrand <Bertrand.Guiheneuf@aful.org>
\ No newline at end of file diff --git a/camel/broken-date-parser.c b/camel/broken-date-parser.c deleted file mode 100644 index 544dc04e28..0000000000 --- a/camel/broken-date-parser.c +++ /dev/null @@ -1,315 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#include "broken-date-parser.h" - -/* prototypes for functions dealing with broken date formats */ -static GList *datetok (const gchar *date); -static gint get_days_in_month (gint mon, gint year); -static gint get_weekday (gchar *str); -static gint get_month (gchar *str); - -static char *tz_months [] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" -}; - -/***************************************************************************** - * The following functions are here in the case of badly broken date formats * - * * - * -- fejj@helixcode.com * - *****************************************************************************/ - -typedef struct { - gchar dow[6]; /* day of week (should only need 4 chars) */ - gint day; - gint mon; /* 1->12 or 0 if invalid */ - gint year; - gint hour; - gint min; - gint sec; - gchar zone[6]; /* time zone */ -} date_t; - -static -GList *datetok (const gchar *date) -{ - GList *tokens = NULL; - gchar *token, *start, *end; - - start = (gchar *) date; - while (*start) { - /* find the end of this token */ - for (end = start; *end && *end != ' '; end++); - - token = g_strndup (start, (end - start)); - - if (token && *token) - tokens = g_list_append (tokens, token); - else - g_free (token); - - if (*end) - start = end + 1; - else - break; - } - - return tokens; -} - -static gint -get_days_in_month (gint mon, gint year) -{ - switch (mon) { - case 1: case 3: case 5: case 7: case 8: case 10: case 12: - return 31; - case 4: case 6: case 9: case 11: - return 30; - case 2: - if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) - return 29; - return 28; - default: - return 30; - } -} - -static gint -get_weekday (gchar *str) -{ - g_return_val_if_fail ((str != NULL), 0); - - if (strncmp (str, "Mon", 3) == 0) { - return 1; - } else if (strncmp (str, "Tue", 3) == 0) { - return 2; - } else if (strncmp (str, "Wed", 3) == 0) { - return 3; - } else if (strncmp (str, "Thu", 3) == 0) { - return 4; - } else if (strncmp (str, "Fri", 3) == 0) { - return 5; - } else if (strncmp (str, "Sat", 3) == 0) { - return 6; - } else if (strncmp (str, "Sun", 3) == 0) { - return 7; - } - - return 0; /* unknown week day */ -} - -static gint -get_month (gchar *str) -{ - g_return_val_if_fail (str != NULL, 0); - - if (strncmp (str, "Jan", 3) == 0) { - return 1; - } else if (strncmp (str, "Feb", 3) == 0) { - return 2; - } else if (strncmp (str, "Mar", 3) == 0) { - return 3; - } else if (strncmp (str, "Apr", 3) == 0) { - return 4; - } else if (strncmp (str, "May", 3) == 0) { - return 5; - } else if (strncmp (str, "Jun", 3) == 0) { - return 6; - } else if (strncmp (str, "Jul", 3) == 0) { - return 7; - } else if (strncmp (str, "Aug", 3) == 0) { - return 8; - } else if (strncmp (str, "Sep", 3) == 0) { - return 9; - } else if (strncmp (str, "Oct", 3) == 0) { - return 10; - } else if (strncmp (str, "Nov", 3) == 0) { - return 11; - } else if (strncmp (str, "Dec", 3) == 0) { - return 12; - } - - return 0; /* unknown month */ -} - -gchar * -parse_broken_date (const gchar *datestr) -{ - GList *tokens; - date_t date; - gchar *token, *ptr, *newdatestr; - guint len, i, retval; - gdouble tz = 0.0; - - memset ((void*)&date, 0, sizeof (date_t)); - g_return_val_if_fail (datestr != NULL, NULL); - - tokens = datetok (datestr); - len = g_list_length (tokens); - for (i = 0; i < len; i++) { - token = g_list_nth_data (tokens, i); - - if ((retval = get_weekday (token))) { - strncpy (date.dow, datestr, 4); - } else if ((retval = get_month (token))) { - date.mon = retval; - } else if (strlen (token) <= 2) { - /* this could be a 1 or 2 digit day of the month */ - for (retval = 1, ptr = token; *ptr; ptr++) - if (*ptr < '0' || *ptr > '9') - retval = 0; - - if (retval && atoi (token) <= 31 && !date.day) /* probably should find a better way */ - date.day = atoi (token); - else /* fubar'd client using a 2-digit year */ - date.year = atoi (token) < 69 ? 2000 + atoi (token) : 1900 + atoi (token); - } else if (strlen (token) == 4) { - /* this could be the year... */ - for (retval = 1, ptr = token; *ptr; ptr++) - if (*ptr < '0' || *ptr > '9') - retval = 0; - - if (retval) - date.year = atoi (token); - } else if (strchr (token, ':')) { - /* this must be the time: hh:mm:ss */ - sscanf (token, "%d:%d:%d", &date.hour, &date.min, &date.sec); - } else if (*token == '-' || *token == '+') { - tz = atoi (token) / 100.0; - } - } - - g_list_free (tokens); - - /* adjust times based on time zones */ - - if (tz != 0) { - /* check for time-zone shift */ - if (tz > 0) { - /* correct for positive hours off of UCT */ - date.hour -= (tz / 100); - tz = (gint)tz % 100; - - if (tz > 0) /* correct for positive minutes off of UCT */ - date.min -= (gint)(((gdouble) tz / 100.0) * 60.0); - } else { - if (tz < 0) { - /* correct for negative hours off of UCT */ - tz = -tz; - date.hour += (tz / 100); - tz = -((gint)tz % 100); - - if (tz < 0) - date.min -= (gint)(((gdouble) tz / 100.0) * 60.0); - } - } - - /* adjust seconds to proper range */ - if (date.sec > 59) { - date.min += (date.sec / 60); - date.sec = (date.sec % 60); - } - - /* adjust minutes to proper range */ - if (date.min > 59) { - date.hour += (date.min / 60); - date.min = (date.min % 60); - } else { - if (date.min < 0) { - date.min = -date.min; - date.hour -= (date.min / 60) - 1; - date.min = 60 - (date.min % 60); - } - } - - /* adjust hours to the proper randge */ - if (date.hour > 23) { - date.day += (date.hour / 24); - date.hour -= (date.hour % 24); - } else { - if (date.hour < 0) { - date.hour = -date.hour; - date.day -= (date.hour / 24) - 1; - date.hour = 24 - (date.hour % 60); - } - } - - /* adjust days to the proper range */ - while (date.day > get_days_in_month (date.mon, date.year)) { - date.day -= get_days_in_month (date.mon, date.year); - date.mon++; - if (date.mon > 12) { - date.year += (date.mon / 12); - date.mon = (date.mon % 12); - if (date.mon == 0) { - /* month sanity check */ - date.mon = 12; - date.year -= 1; - } - } - } - - while (date.day < 1) { - date.day += get_days_in_month (date.mon, date.year); - date.mon--; - if (date.mon < 1) { - date.mon = -date.mon; - date.year -= (date.mon / 12) - 1; - date.mon = 12 - (date.mon % 12); - } - } - - /* adjust months to the proper range */ - if (date.mon > 12) { - date.year += (date.mon / 12); - date.mon = (date.mon % 12); - if (date.mon == 0) { - /* month sanity check */ - date.mon = 12; - date.year -= 1; - } - } else { - if (date.mon < 1) { - date.mon = -date.mon; - date.year -= (date.mon / 12) - 1; - date.mon = 12 - (date.mon % 12); - } - } - } - - /* now lets print this date into a string with the correct format */ - newdatestr = g_strdup_printf ("%s, %d %s %d %s%d:%s%d:%s%d -0000", - date.dow, date.day, tz_months[date.mon-1], - date.year, - date.hour > 10 ? "" : "0", date.hour, - date.min > 10 ? "" : "0", date.min, - date.sec > 10 ? "" : "0", date.sec); - - return newdatestr; -} - -/***************************************************************************** - * This ends the code for the broken date parser... * - * * - * -- fejj@helixcode.com * - *****************************************************************************/ diff --git a/camel/broken-date-parser.h b/camel/broken-date-parser.h deleted file mode 100644 index 17000b3299..0000000000 --- a/camel/broken-date-parser.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#include <config.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <glib.h> -#include <time.h> - -#include <ctype.h> - -/* prototypes for functions dealing with broken date formats */ - -gchar *parse_broken_date (const gchar *datestr); - - - - - diff --git a/camel/camel-address.c b/camel/camel-address.c deleted file mode 100644 index 8f7cea3d67..0000000000 --- a/camel/camel-address.c +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "camel-address.h" - - -static void camel_address_class_init (CamelAddressClass *klass); -static void camel_address_init (CamelAddress *obj); -static void camel_address_finalize (CamelObject *obj); - -static CamelObjectClass *camel_address_parent; - -static void -camel_address_class_init (CamelAddressClass *klass) -{ - camel_address_parent = camel_type_get_global_classfuncs (camel_object_get_type ()); -} - -static void -camel_address_init (CamelAddress *obj) -{ - obj->addresses = g_ptr_array_new(); -} - -static void -camel_address_finalize (CamelObject *obj) -{ - camel_address_remove((CamelAddress *)obj, -1); -} - -CamelType -camel_address_get_type (void) -{ - static CamelType type = CAMEL_INVALID_TYPE; - - if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register (camel_object_get_type (), "CamelAddress", - sizeof (CamelAddress), - sizeof (CamelAddressClass), - (CamelObjectClassInitFunc) camel_address_class_init, - NULL, - (CamelObjectInitFunc) camel_address_init, - (CamelObjectFinalizeFunc) camel_address_finalize); - } - - return type; -} - -/** - * camel_address_new: - * - * Create a new CamelAddress object. - * - * Return value: A new CamelAddress widget. - **/ -CamelAddress * -camel_address_new (void) -{ - CamelAddress *new = CAMEL_ADDRESS ( camel_object_new (camel_address_get_type ())); - return new; -} - - -/** - * camel_address_decode: - * @a: An address. - * @raw: Raw address description. - * - * Construct a new address from a raw address field. - * - * Return value: Returns the number of addresses found, - * or -1 if the addresses could not be parsed fully. - **/ -int -camel_address_decode (CamelAddress *a, const char *raw) -{ - g_return_val_if_fail(IS_CAMEL_ADDRESS(a), -1); - - return CAMEL_ADDRESS_CLASS (CAMEL_OBJECT_GET_CLASS (a))->decode(a, raw); -} - -/** - * camel_address_encode: - * @a: - * - * Encode an address in a format suitable for a raw header. - * - * Return value: The encoded address. - **/ -char * -camel_address_encode (CamelAddress *a) -{ - g_return_val_if_fail(IS_CAMEL_ADDRESS(a), NULL); - - return CAMEL_ADDRESS_CLASS (CAMEL_OBJECT_GET_CLASS (a))->encode(a); -} - -/** - * camel_address_remove: - * @a: - * @index: The address to remove, use -1 to remove all address. - * - * Remove an address by index, or all addresses. - **/ -void -camel_address_remove (CamelAddress *a, int index) -{ - g_return_if_fail(IS_CAMEL_ADDRESS(a)); - - if (index == -1) { - for (index=a->addresses->len; index>-1; index--) - CAMEL_ADDRESS_CLASS (CAMEL_OBJECT_GET_CLASS (a))->remove(a, index); - } else { - CAMEL_ADDRESS_CLASS (CAMEL_OBJECT_GET_CLASS (a))->remove(a, index); - } -} diff --git a/camel/camel-address.h b/camel/camel-address.h deleted file mode 100644 index a2d6fe34dd..0000000000 --- a/camel/camel-address.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef _CAMEL_ADDRESS_H -#define _CAMEL_ADDRESS_H - -#include <camel/camel-object.h> - -#define CAMEL_ADDRESS(obj) CAMEL_CHECK_CAST (obj, camel_address_get_type (), CamelAddress) -#define CAMEL_ADDRESS_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_address_get_type (), CamelAddressClass) -#define IS_CAMEL_ADDRESS(obj) CAMEL_CHECK_TYPE (obj, camel_address_get_type ()) - -typedef struct _CamelAddressClass CamelAddressClass; - -struct _CamelAddress { - CamelObject parent; - - GPtrArray *addresses; - - struct _CamelAddressPrivate *priv; -}; - -struct _CamelAddressClass { - CamelObjectClass parent_class; - - int (*decode) (CamelAddress *, const char *raw); - char *(*encode) (CamelAddress *); - - void (*remove) (CamelAddress *, int index); -}; - -guint camel_address_get_type (void); -CamelAddress *camel_address_new (void); - -int camel_address_decode (CamelAddress *, const char *); -char *camel_address_encode (CamelAddress *); - -void camel_address_remove (CamelAddress *, int index); - -#endif /* ! _CAMEL_ADDRESS_H */ diff --git a/camel/camel-charset-map-private.h b/camel/camel-charset-map-private.h deleted file mode 100644 index 18b603148a..0000000000 --- a/camel/camel-charset-map-private.h +++ /dev/null @@ -1,4345 +0,0 @@ -/* This file is automatically generated: DO NOT EDIT */ - -static unsigned char m000[256] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0xd0, 0xf2, 0xf7, 0xf2, 0xf0, 0xff, - 0xf7, 0xf0, 0xb0, 0xf0, 0xe0, 0xff, 0xf2, 0x94, - 0xf7, 0xf0, 0xf2, 0xf2, 0xd7, 0xd2, 0xd0, 0xf2, - 0xd7, 0xd0, 0x90, 0xe0, 0xd0, 0xf2, 0xd2, 0xc0, - 0xd2, 0xc7, 0xc7, 0xc6, 0xc7, 0xc4, 0xc4, 0xc3, - 0xc2, 0xc7, 0xc2, 0xc7, 0xc2, 0xc7, 0xc7, 0xc2, - 0x42, 0xc2, 0xe2, 0xc3, 0xc7, 0xc4, 0xc7, 0xc7, - 0xc4, 0xc2, 0xc7, 0xd6, 0xd7, 0x51, 0x50, 0x97, - 0x82, 0x87, 0x87, 0x86, 0x87, 0x84, 0x84, 0x83, - 0x82, 0x87, 0x82, 0x87, 0x82, 0x87, 0x87, 0x82, - 0x02, 0x82, 0x82, 0x93, 0x97, 0x94, 0x97, 0xd7, - 0x94, 0x92, 0x97, 0xd6, 0xd7, 0x51, 0x50, 0xf0, -}; - -static unsigned char m001[256] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0f, 0x2f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, - 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x2f, 0x0f, 0x2f, - 0x2f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, - 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x2f, 0x0f, 0x0f, - 0xff, 0x28, 0x6a, 0x6e, 0x72, 0x28, 0x72, 0x7f, - 0x70, 0xfe, 0x28, 0x7a, 0x7a, 0x7f, 0x7e, 0x68, - 0xfb, 0x7a, 0xea, 0x6a, 0x70, 0x7a, 0x7e, 0xfb, - 0x70, 0x6a, 0x28, 0x7a, 0x62, 0x62, 0x62, 0x28, - 0x2c, 0x3d, 0x3d, 0x2d, 0x7f, 0x6f, 0x6f, 0x3c, - 0x2c, 0x7f, 0x2c, 0x3d, 0x2c, 0x3d, 0x3d, 0x2d, - 0x29, 0x2c, 0x2c, 0x7f, 0x3d, 0x6f, 0x7f, 0x7a, - 0x6f, 0x2c, 0x3d, 0x2d, 0x7f, 0x3d, 0x29, 0x7f, - 0x2c, 0x3d, 0x3d, 0x2d, 0x7f, 0x6f, 0x6f, 0x3c, - 0x2c, 0x7f, 0x2c, 0x3d, 0x2c, 0x3d, 0x3d, 0x2d, - 0x29, 0x2c, 0x2c, 0x7f, 0x3d, 0x6f, 0x7f, 0xfa, - 0x6f, 0x2c, 0x3d, 0x2d, 0x7f, 0x3d, 0x29, 0x2c, -}; - -static unsigned char m002[256] = { - 0x1f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x3f, 0x3f, - 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, - 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, - 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, - 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, - 0x1f, 0x18, 0x58, 0x58, 0x18, 0x58, 0x18, 0x7c, - 0x78, 0x19, 0x18, 0x1c, 0x58, 0x18, 0x18, 0x18, - 0x79, 0x78, 0x19, 0x18, 0x78, 0x18, 0x78, 0x19, - 0x18, 0x18, 0x18, 0x1c, 0x18, 0x18, 0x18, 0x18, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x02, 0x02, 0x1a, 0x1a, 0x18, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x79, - 0x18, 0x18, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, -}; - -static unsigned char m010[256] = { - 0x04, 0x04, 0x01, 0x01, 0x05, 0x05, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x05, 0x05, 0x01, 0x01, - 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x04, 0x04, - 0x05, 0x05, 0x01, 0x01, 0x02, 0x02, 0x82, 0x82, - 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, - 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x04, 0x04, - 0x82, 0x82, 0x00, 0x00, 0x02, 0x02, 0x04, 0x04, - 0x04, 0x01, 0x01, 0x04, 0x04, 0x01, 0x01, 0x00, - 0x00, 0x01, 0x01, 0x01, 0x01, 0x04, 0x04, 0x01, - 0x01, 0x00, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x04, 0x04, - 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x83, 0x83, - 0x05, 0x05, 0x01, 0x01, 0x01, 0x01, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, - 0x01, 0x01, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x01, 0x03, 0x03, 0x05, 0x05, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m011[256] = { - 0x43, 0x43, 0x10, 0x10, 0x53, 0x53, 0x52, 0x52, - 0x00, 0x00, 0x04, 0x04, 0x53, 0x53, 0x10, 0x10, - 0x11, 0x11, 0x43, 0x43, 0x00, 0x00, 0x43, 0x43, - 0x53, 0x53, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x04, 0x43, 0x43, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x01, 0x43, 0x43, 0x00, 0x00, 0x43, 0x43, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x43, - 0x01, 0x10, 0x10, 0x43, 0x43, 0x10, 0x10, 0x00, - 0x00, 0x52, 0x52, 0x52, 0x52, 0x43, 0x43, 0x10, - 0x10, 0x00, 0x01, 0x01, 0x43, 0x43, 0x00, 0x00, - 0x10, 0x10, 0x28, 0x28, 0x10, 0x10, 0x42, 0x42, - 0x10, 0x10, 0x52, 0x52, 0x00, 0x00, 0x10, 0x10, - 0x7b, 0x7b, 0x10, 0x10, 0x10, 0x10, 0x01, 0x01, - 0x01, 0x01, 0x43, 0x43, 0x00, 0x00, 0x10, 0x10, - 0x10, 0x10, 0x43, 0x43, 0x04, 0x04, 0x04, 0x04, - 0x2c, 0x52, 0x52, 0x52, 0x52, 0x7b, 0x7b, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m020[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x07, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m021[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x50, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x50, 0x00, 0x50, 0x20, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m022[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m030[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x00, - 0x20, 0x20, 0x20, 0x00, 0x20, 0x00, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m032[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m040[256] = { - 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x08, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m041[256] = { - 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m042[256] = { - 0x00, 0x61, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x60, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x00, 0x61, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m050[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, - 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, - 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, - 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m052[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x00, - 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m060[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m0e2[256] = { - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m102[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m1e1[256] = { - 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m200[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m201[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x70, 0x71, 0x00, 0x00, 0x00, - 0x70, 0x72, 0x70, 0x00, 0x72, 0x72, 0x72, 0x00, - 0x70, 0x70, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m202[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x64, 0x00, 0x00, 0x00, 0x04, 0x60, 0x40, 0x00, - 0x78, 0x78, 0x00, 0x00, 0x60, 0x60, 0x18, 0x18, - 0x60, 0x60, 0x01, 0x00, 0x00, 0x60, 0x64, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m210[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m211[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m212[256] = { - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m221[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m222[256] = { - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x61, 0x00, 0x00, 0x60, 0x60, 0x20, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x01, 0x01, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m231[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m232[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m242[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m251[256] = { - 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m252[256] = { - 0x61, 0x60, 0x61, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x60, - 0x61, 0x00, 0x00, 0x60, 0x61, 0x00, 0x00, 0x60, - 0x61, 0x00, 0x00, 0x60, 0x61, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x61, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x61, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x61, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x61, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x61, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m262[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m302[256] = { - 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, -}; - -static unsigned char m322[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m332[256] = { - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x20, 0x20, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m4e2[256] = { - 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x20, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x20, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x00, -}; - -static unsigned char m4f2[256] = { - 0x20, 0x60, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x20, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x20, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x20, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x20, 0x00, 0x20, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x20, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x60, 0x00, 0x00, 0x20, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x20, -}; - -static unsigned char m502[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x20, 0x60, - 0x00, 0x60, 0x20, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x20, 0x60, 0x00, 0x00, 0x20, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x20, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m512[256] = { - 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x20, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x20, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x20, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, -}; - -static unsigned char m522[256] = { - 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x20, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x20, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x20, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x20, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, -}; - -static unsigned char m532[256] = { - 0x20, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x20, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x60, 0x20, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x20, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x20, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m542[256] = { - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x20, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x20, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x20, -}; - -static unsigned char m552[256] = { - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x20, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, -}; - -static unsigned char m562[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, -}; - -static unsigned char m572[256] = { - 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x20, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x20, - 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, -}; - -static unsigned char m582[256] = { - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x20, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x20, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, -}; - -static unsigned char m592[256] = { - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x20, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x20, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x20, 0x00, 0x20, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x20, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x20, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x20, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, -}; - -static unsigned char m5a2[256] = { - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m5b2[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x20, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x20, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x20, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, -}; - -static unsigned char m5c2[256] = { - 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x20, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, -}; - -static unsigned char m5d2[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x20, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x20, 0x20, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x20, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, -}; - -static unsigned char m5e2[256] = { - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, -}; - -static unsigned char m5f2[256] = { - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x20, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x20, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x20, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x20, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, -}; - -static unsigned char m602[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x20, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x20, 0x00, 0x00, - 0x00, 0x60, 0x20, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x20, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x20, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x20, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m612[256] = { - 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x20, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x20, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, -}; - -static unsigned char m622[256] = { - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x60, 0x20, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, -}; - -static unsigned char m632[256] = { - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m642[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, -}; - -static unsigned char m652[256] = { - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m662[256] = { - 0x20, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x20, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x20, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x20, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0x60, - 0x00, 0x20, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x20, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x20, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x20, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x20, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x20, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x20, 0x20, 0x60, 0x60, 0x60, 0x60, -}; - -static unsigned char m672[256] = { - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x20, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x20, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, -}; - -static unsigned char m682[256] = { - 0x00, 0x20, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x20, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x20, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x20, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x20, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m692[256] = { - 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, -}; - -static unsigned char m6a2[256] = { - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x20, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m6b2[256] = { - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x20, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m6c2[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x20, 0x60, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x20, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x20, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m6d2[256] = { - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x20, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x20, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x20, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x20, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x20, 0x60, 0x60, 0x60, 0x20, 0x00, 0x00, 0x00, -}; - -static unsigned char m6e2[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x20, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x20, 0x60, 0x00, 0x20, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x20, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, -}; - -static unsigned char m6f2[256] = { - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x20, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, -}; - -static unsigned char m702[256] = { - 0x00, 0x60, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x20, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, -}; - -static unsigned char m712[256] = { - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x20, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x20, 0x60, -}; - -static unsigned char m722[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x20, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, -}; - -static unsigned char m732[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x20, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x20, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x20, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, -}; - -static unsigned char m742[256] = { - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x20, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x20, 0x00, - 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x20, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m752[256] = { - 0x00, 0x20, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x20, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x20, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, -}; - -static unsigned char m762[256] = { - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x20, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x20, 0x20, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, -}; - -static unsigned char m772[256] = { - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, -}; - -static unsigned char m782[256] = { - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x20, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, -}; - -static unsigned char m792[256] = { - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m7a2[256] = { - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x20, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0x20, - 0x00, 0x00, 0x60, 0x20, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, -}; - -static unsigned char m7b2[256] = { - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0x20, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m7c2[256] = { - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, -}; - -static unsigned char m7d2[256] = { - 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x20, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x20, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x20, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x20, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x20, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m7e2[256] = { - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x20, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m7f2[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x20, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, -}; - -static unsigned char m802[256] = { - 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, -}; - -static unsigned char m812[256] = { - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, -}; - -static unsigned char m822[256] = { - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m832[256] = { - 0x00, 0x20, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x20, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x20, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, -}; - -static unsigned char m842[256] = { - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x20, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, -}; - -static unsigned char m852[256] = { - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x20, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x20, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, -}; - -static unsigned char m862[256] = { - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, -}; - -static unsigned char m872[256] = { - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, -}; - -static unsigned char m882[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x20, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, -}; - -static unsigned char m892[256] = { - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m8a2[256] = { - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x20, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, 0x20, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x20, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x20, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x20, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x20, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, -}; - -static unsigned char m8b2[256] = { - 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x20, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m8c2[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, -}; - -static unsigned char m8d2[256] = { - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x20, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x20, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, -}; - -static unsigned char m8e2[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x20, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, -}; - -static unsigned char m8f2[256] = { - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, -}; - -static unsigned char m902[256] = { - 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x20, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, -}; - -static unsigned char m912[256] = { - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, - 0x60, 0x00, 0x20, 0x60, 0x60, 0x60, 0x20, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x20, 0x20, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, -}; - -static unsigned char m922[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x20, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x20, 0x20, 0x00, 0x20, 0x00, 0x00, 0x60, - 0x20, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, - 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x20, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x20, 0x00, 0x60, 0x20, 0x00, 0x20, 0x00, 0x20, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x20, 0x60, 0x20, 0x60, 0x00, 0x00, 0x20, -}; - -static unsigned char m932[256] = { - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x20, 0x20, 0x00, - 0x60, 0x20, 0x60, 0x60, 0x00, 0x20, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x20, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m942[256] = { - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m952[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x20, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m962[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x20, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m972[256] = { - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x20, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x20, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, - 0x00, 0x20, 0x60, 0x00, 0x00, 0x20, 0x60, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, -}; - -static unsigned char m982[256] = { - 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x20, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, -}; - -static unsigned char m992[256] = { - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, -}; - -static unsigned char m9a2[256] = { - 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x20, 0x00, 0x00, 0x20, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m9b2[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x20, 0x00, 0x60, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m9c2[256] = { - 0x20, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, - 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char m9d2[256] = { - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x60, 0x00, 0x00, 0x60, - 0x20, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, -}; - -static unsigned char m9e2[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x20, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, -}; - -static unsigned char m9f2[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char mf02[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char mf92[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char mfa2[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static unsigned char mff2[256] = { - 0x00, 0x60, 0x20, 0x60, 0x60, 0x60, 0x60, 0x20, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x20, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x20, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x20, 0x00, - 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x20, 0x20, 0x60, 0x20, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -struct { - unsigned char *bits0; - unsigned char *bits1; - unsigned char *bits2; -} camel_charmap[256] = { - { m000, m001, m002, }, { m010, m011, 0, }, { m020, m021, m022, }, { m030, 0, m032, }, { m040, m041, m042, }, { m050, 0, m052, }, { m060, 0, 0, }, { 0, 0, 0, }, - { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, m0e2, }, { 0, 0, 0, }, - { 0, 0, m102, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, - { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, m1e1, 0, }, { 0, 0, 0, }, - { m200, m201, m202, }, { m210, m211, m212, }, { 0, m221, m222, }, { 0, m231, m232, }, { 0, 0, m242, }, { 0, m251, m252, }, { 0, 0, m262, }, { 0, 0, 0, }, - { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, - { 0, 0, m302, }, { 0, 0, 0, }, { 0, 0, m322, }, { 0, 0, m332, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, - { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, - { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, - { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, m4e2, }, { 0, 0, m4f2, }, - { 0, 0, m502, }, { 0, 0, m512, }, { 0, 0, m522, }, { 0, 0, m532, }, { 0, 0, m542, }, { 0, 0, m552, }, { 0, 0, m562, }, { 0, 0, m572, }, - { 0, 0, m582, }, { 0, 0, m592, }, { 0, 0, m5a2, }, { 0, 0, m5b2, }, { 0, 0, m5c2, }, { 0, 0, m5d2, }, { 0, 0, m5e2, }, { 0, 0, m5f2, }, - { 0, 0, m602, }, { 0, 0, m612, }, { 0, 0, m622, }, { 0, 0, m632, }, { 0, 0, m642, }, { 0, 0, m652, }, { 0, 0, m662, }, { 0, 0, m672, }, - { 0, 0, m682, }, { 0, 0, m692, }, { 0, 0, m6a2, }, { 0, 0, m6b2, }, { 0, 0, m6c2, }, { 0, 0, m6d2, }, { 0, 0, m6e2, }, { 0, 0, m6f2, }, - { 0, 0, m702, }, { 0, 0, m712, }, { 0, 0, m722, }, { 0, 0, m732, }, { 0, 0, m742, }, { 0, 0, m752, }, { 0, 0, m762, }, { 0, 0, m772, }, - { 0, 0, m782, }, { 0, 0, m792, }, { 0, 0, m7a2, }, { 0, 0, m7b2, }, { 0, 0, m7c2, }, { 0, 0, m7d2, }, { 0, 0, m7e2, }, { 0, 0, m7f2, }, - { 0, 0, m802, }, { 0, 0, m812, }, { 0, 0, m822, }, { 0, 0, m832, }, { 0, 0, m842, }, { 0, 0, m852, }, { 0, 0, m862, }, { 0, 0, m872, }, - { 0, 0, m882, }, { 0, 0, m892, }, { 0, 0, m8a2, }, { 0, 0, m8b2, }, { 0, 0, m8c2, }, { 0, 0, m8d2, }, { 0, 0, m8e2, }, { 0, 0, m8f2, }, - { 0, 0, m902, }, { 0, 0, m912, }, { 0, 0, m922, }, { 0, 0, m932, }, { 0, 0, m942, }, { 0, 0, m952, }, { 0, 0, m962, }, { 0, 0, m972, }, - { 0, 0, m982, }, { 0, 0, m992, }, { 0, 0, m9a2, }, { 0, 0, m9b2, }, { 0, 0, m9c2, }, { 0, 0, m9d2, }, { 0, 0, m9e2, }, { 0, 0, m9f2, }, - { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, - { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, - { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, - { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, - { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, - { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, - { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, - { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, - { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, - { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, - { 0, 0, mf02, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, - { 0, 0, 0, }, { 0, 0, mf92, }, { 0, 0, mfa2, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, 0, }, { 0, 0, mff2, }, -}; - -struct { - const char *name; - unsigned int bit; -} camel_charinfo[] = { - { "iso-8859-2", 0x0001 }, - { "iso-8859-3", 0x0002 }, - { "iso-8859-4", 0x0004 }, - { "iso-8859-5", 0x0008 }, - { "iso-8859-6", 0x0010 }, - { "iso-8859-7", 0x0020 }, - { "iso-8859-8", 0x0040 }, - { "iso-8859-9", 0x0080 }, - { "iso-8859-10", 0x0100 }, - { "iso-8859-13", 0x0200 }, - { "iso-8859-14", 0x0400 }, - { "iso-8859-15", 0x0800 }, - { "windows-1250", 0x1000 }, - { "windows-1252", 0x2000 }, - { "windows-1257", 0x4000 }, - { "koi8-r", 0x8000 }, - { "koi8-u", 0x10000 }, - { "tis620.2533-1", 0x20000 }, - { "armscii-8", 0x40000 }, - { "georgian-academy", 0x80000 }, - { "georgian-ps", 0x100000 }, - { "CP932", 0x200000 }, - { "Shift-JIS", 0x400000 }, -}; - -#define charset_mask(x) \ - (camel_charmap[(x)>>8].bits0?camel_charmap[(x)>>8].bits0[(x)&0xff]<<0:0) \ - | (camel_charmap[(x)>>8].bits1?camel_charmap[(x)>>8].bits1[(x)&0xff]<<8:0) \ - | (camel_charmap[(x)>>8].bits2?camel_charmap[(x)>>8].bits2[(x)&0xff]<<16:0) - diff --git a/camel/camel-charset-map.c b/camel/camel-charset-map.c deleted file mode 100644 index c0b697290b..0000000000 --- a/camel/camel-charset-map.c +++ /dev/null @@ -1,270 +0,0 @@ - -#include <stdio.h> - -/* - if you want to build the charset map, add the root directory of - libunicode to the include path and define BUILD_MAP, - then run it as - ./a.out > camel-charset-map-private.h - - The tables genereated work like this: - - An indirect array for each page of unicode character - Each array element has an indirect pointer to one of the bytes of - the generated bitmask. -*/ - -#ifdef BUILD_MAP -#include "iso/iso8859-2.h" -#include "iso/iso8859-3.h" -#include "iso/iso8859-4.h" -#include "iso/iso8859-5.h" -#include "iso/iso8859-6.h" -#include "iso/iso8859-7.h" -#include "iso/iso8859-8.h" -#include "iso/iso8859-9.h" -#include "iso/iso8859-10.h" -#include "iso/iso8859-13.h" -#include "iso/iso8859-14.h" -#include "iso/iso8859-15.h" -#include "iso/windows-1250.h" -#include "iso/windows-1252.h" -#include "iso/windows-1257.h" -#include "iso/koi8-r.h" -#include "iso/koi8-u.h" -#include "iso/tis620.2533-1.h" -#include "iso/armscii-8.h" -#include "iso/georgian-academy.h" -#include "iso/georgian-ps.h" -#include "msft/cp932.h" -#include "jis/shiftjis.h" - -static struct { - unsigned short *table; - char *name; - int type; /* type of table */ - unsigned int bit; /* assigned bit */ -} tables[] = { - { iso8859_2_table, "iso-8859-2", 0, 0} , - { iso8859_3_table, "iso-8859-3", 0, 0} , - { iso8859_4_table, "iso-8859-4", 0, 0}, - { iso8859_5_table, "iso-8859-5", 0, 0}, -/* apparently -6 has special digits? */ - { iso8859_6_table, "iso-8859-6", 0, 0}, - { iso8859_7_table, "iso-8859-7", 0, 0}, - { iso8859_8_table, "iso-8859-8", 0, 0}, - { iso8859_9_table, "iso-8859-9", 0, 0}, - { iso8859_10_table, "iso-8859-10", 0, 0}, - { iso8859_13_table, "iso-8859-13", 0, 0}, - { iso8859_14_table, "iso-8859-14", 0, 0}, - { iso8859_15_table, "iso-8859-15", 0, 0}, - { windows_1250_table, "windows-1250", 0, 0}, - { windows_1252_table, "windows-1252", 0, 0}, - { windows_1257_table, "windows-1257", 0, 0}, - { koi8_r_table, "koi8-r", 0, 0}, - { koi8_u_table, "koi8-u", 0, 0}, - { tis_620_table, "tis620.2533-1", 0, 0}, - { armscii_8_table, "armscii-8", 0, 0}, - { georgian_academy_table, "georgian-academy", 0, 0}, - { georgian_ps_table, "georgian-ps", 0, 0}, - { cp932_table, "CP932", 1, 0}, - { sjis_table, "Shift-JIS", 1, 0}, - { 0, 0} -}; - -unsigned int encoding_map[256 * 256]; - -static void -add_bigmap(unsigned short **table, int bit) -{ - int i; - int j; - - for (i=0;i<256;i++) { - unsigned short *tab = table[i]; - if (tab) { - for (j=0;j<256;j++) { - if (tab[j]) - encoding_map[tab[j]] |= bit; - } - } - } -} - -void main(void) -{ - int i, j; - unsigned short *tab; - int max, min; - int bit = 0x01; - int k; - int bytes; - -#if 0 - /* iso-latin-1 (not needed-detected in code) */ - for (i=0;i<256;i++) { - encoding_map[i] |= bit; - } - bit <<= 1; -#endif - - /* dont count the terminator */ - bytes = ((sizeof(tables)/sizeof(tables[0]))+7-1)/8; - - /* the other latin charsets */ - for (j=0;tables[j].table;j++) { - switch (tables[j].type) { - case 0: /* table from 128-256 */ - tab = tables[j].table; - for (i=0;i<128;i++) { - /* 0-127 is the common */ - encoding_map[i] |= bit; - encoding_map[tab[i]] |= bit; - } - break; - case 1: /* sparse table */ - add_bigmap(tables[j].table, bit); - break; - } - tables[j].bit = bit; - bit <<= 1; - } - - printf("/* This file is automatically generated: DO NOT EDIT */\n\n"); - - for (i=0;i<256;i++) { - /* first, do we need this block? */ - for (k=0;k<bytes;k++) { - for (j=0;j<256;j++) { - if ((encoding_map[i*256 + j] & (0xff << (k*8))) != 0) - break; - } - if (j < 256) { - /* yes, dump it */ - printf("static unsigned char m%02x%x[256] = {\n\t", i, k); - for (j=0;j<256;j++) { - printf("0x%02x, ", (encoding_map[i*256+j] >> (k*8)) & 0xff ); - if (((j+1)&7) == 0 && j<255) - printf("\n\t"); - } - printf("\n};\n\n"); - } - } - } - - printf("struct {\n"); - for (k=0;k<bytes;k++) { - printf("\tunsigned char *bits%d;\n", k); - } - printf("} camel_charmap[256] = {\n\t"); - for (i=0;i<256;i++) { - /* first, do we need this block? */ - printf("{ "); - for (k=0;k<bytes;k++) { - for (j=0;j<256;j++) { - if ((encoding_map[i*256 + j] & (0xff << (k*8))) != 0) - break; - } - if (j < 256) { - printf("m%02x%x, ", i, k); - } else { - printf("0, "); - } - } - printf("}, "); - if (((i+1)&7) == 0 && i<255) - printf("\n\t"); - } - printf("\n};\n\n"); - - printf("struct {\n\tconst char *name;\n\tunsigned int bit;\n} camel_charinfo[] = {\n"); - for (j=0;tables[j].table;j++) { - printf("\t{ \"%s\", 0x%04x },\n", tables[j].name, tables[j].bit); - } - printf("};\n\n"); - - printf("#define charset_mask(x) \\\n"); - for (k=0;k<bytes;k++) { - if (k!=0) - printf("\t| "); - else - printf("\t"); - printf("(camel_charmap[(x)>>8].bits%d?camel_charmap[(x)>>8].bits%d[(x)&0xff]<<%d:0)", k, k, k*8); - if (k<bytes-1) - printf("\t\\\n"); - } - printf("\n\n"); - -} - -#else - -#include "camel-charset-map.h" -#include "camel-charset-map-private.h" -#include <unicode.h> -#include <glib.h> - -unsigned int -camel_charset_mask(unsigned int c) -{ - if (c>0xffff) - return 0; - - return charset_mask(c); -} - -/* gets the best charset from the mask of chars in it */ -const char * -camel_charset_best_mask(unsigned int mask) -{ - int i; - - for (i=0;i<sizeof(camel_charinfo)/sizeof(camel_charinfo[0]);i++) { - if (camel_charinfo[i].bit & mask) - return camel_charinfo[i].name; - } - return "UTF-8"; -} - -/* finds the minimum charset for this string NULL means US-ASCII */ -const char * -camel_charset_best(const char *in, int len) -{ - unsigned int mask = ~0; - int level = 0; - const char *inptr = in, *inend = in+len; - - /* check what charset a given string will fit in */ - while (inptr < inend) { - unicode_char_t c; - const char *newinptr; - newinptr = unicode_get_utf8(inptr, &c); - if (newinptr == NULL) { - inptr++; - continue; - } - inptr = newinptr; - if (c<=0xffff) { - mask |= camel_charset_mask(c); - - if (c>=128 && c<256) - level = MAX(level, 1); - else if (c>=256) - level = MAX(level, 2); - } else { - mask = 0; - level = MAX(level, 2); - } - } - - if (level == 1) - return "ISO-8859-1"; - else if (level == 2) - return camel_charset_best_mask(mask); - else - return NULL; -} - - -#endif /* !BUILD_MAP */ - diff --git a/camel/camel-charset-map.h b/camel/camel-charset-map.h deleted file mode 100644 index d5ce0799b8..0000000000 --- a/camel/camel-charset-map.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef _CAMEL_CHARSET_MAP_H -#define _CAMEL_CHARSET_MAP_H - -unsigned int camel_charset_mask(unsigned int c); -const char *camel_charset_best(const char *in, int len); -const char *camel_charset_best_mask(unsigned int mask); - -#endif /* ! _CAMEL_CHARSET_MAP_H */ diff --git a/camel/camel-data-wrapper.c b/camel/camel-data-wrapper.c deleted file mode 100644 index 52cf60bd33..0000000000 --- a/camel/camel-data-wrapper.c +++ /dev/null @@ -1,270 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */ -/* camel-data-wrapper.c : Abstract class for a data_wrapper */ - -/* - * - * Authors: Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ -#include <config.h> -#include "camel-data-wrapper.h" -#include "camel-exception.h" - -#include <errno.h> - -#define d(x) - -static CamelObjectClass *parent_class = NULL; - -/* Returns the class for a CamelDataWrapper */ -#define CDW_CLASS(so) CAMEL_DATA_WRAPPER_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - - -static int construct_from_stream(CamelDataWrapper *, CamelStream *); -static int write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream); -static void set_mime_type (CamelDataWrapper *data_wrapper, const gchar *mime_type); -static gchar *get_mime_type (CamelDataWrapper *data_wrapper); -static GMimeContentField *get_mime_type_field (CamelDataWrapper *data_wrapper); -static void set_mime_type_field (CamelDataWrapper *data_wrapper, GMimeContentField *mime_type); - -static void -camel_data_wrapper_class_init (CamelDataWrapperClass *camel_data_wrapper_class) -{ - parent_class = camel_type_get_global_classfuncs (camel_object_get_type ()); - - /* virtual method definition */ - camel_data_wrapper_class->write_to_stream = write_to_stream; - camel_data_wrapper_class->set_mime_type = set_mime_type; - camel_data_wrapper_class->get_mime_type = get_mime_type; - camel_data_wrapper_class->get_mime_type_field = get_mime_type_field; - camel_data_wrapper_class->set_mime_type_field = set_mime_type_field; - - camel_data_wrapper_class->construct_from_stream = construct_from_stream; -} - -static void -camel_data_wrapper_init (gpointer object, gpointer klass) -{ - CamelDataWrapper *camel_data_wrapper = CAMEL_DATA_WRAPPER (object); - - camel_data_wrapper->mime_type = gmime_content_field_new (NULL, NULL); -} - -static void -camel_data_wrapper_finalize (CamelObject *object) -{ - CamelDataWrapper *camel_data_wrapper = CAMEL_DATA_WRAPPER (object); - - if (camel_data_wrapper->mime_type) - gmime_content_field_unref (camel_data_wrapper->mime_type); - - if (camel_data_wrapper->stream) - camel_object_unref (CAMEL_OBJECT (camel_data_wrapper->stream)); -} - -CamelType -camel_data_wrapper_get_type (void) -{ - static CamelType camel_data_wrapper_type = CAMEL_INVALID_TYPE; - - if (camel_data_wrapper_type == CAMEL_INVALID_TYPE) { - camel_data_wrapper_type = camel_type_register (CAMEL_OBJECT_TYPE, "CamelDataWrapper", - sizeof (CamelDataWrapper), - sizeof (CamelDataWrapperClass), - (CamelObjectClassInitFunc) camel_data_wrapper_class_init, - NULL, - (CamelObjectInitFunc) camel_data_wrapper_init, - (CamelObjectFinalizeFunc) camel_data_wrapper_finalize); - } - - return camel_data_wrapper_type; -} - -static int -write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream) -{ - if (data_wrapper->stream == NULL) { - return -1; - } - - if (camel_stream_reset (data_wrapper->stream) == -1) - return -1; - - return camel_stream_write_to_stream (data_wrapper->stream, stream); -} - -CamelDataWrapper * -camel_data_wrapper_new(void) -{ - return (CamelDataWrapper *)camel_object_new(camel_data_wrapper_get_type()); -} - -/** - * camel_data_wrapper_write_to_stream: - * @data_wrapper: a data wrapper - * @stream: stream for data to be written to - * @ex: a CamelException - * - * Writes the data content to @stream in a machine-independent format - * appropriate for the data. It should be possible to construct an - * equivalent data wrapper object later by passing this stream to - * camel_data_construct_from_stream(). - * - * Return value: the number of bytes written, or -1 if an error occurs. - **/ -int -camel_data_wrapper_write_to_stream (CamelDataWrapper *data_wrapper, - CamelStream *stream) -{ - g_return_val_if_fail (CAMEL_IS_DATA_WRAPPER (data_wrapper), -1); - g_return_val_if_fail (CAMEL_IS_STREAM (stream), -1); - - return CDW_CLASS (data_wrapper)->write_to_stream (data_wrapper, stream); -} - -static int -construct_from_stream (CamelDataWrapper *data_wrapper, CamelStream *stream) -{ - if (data_wrapper->stream) - camel_object_unref((CamelObject *)data_wrapper->stream); - - data_wrapper->stream = stream; - camel_object_ref (CAMEL_OBJECT (stream)); - return 0; -} - -/** - * camel_data_wrapper_construct_from_stream: - * @data_wrapper: a data wrapper - * @stream: A stream that can be read from. - * - * Constructs the content of the data wrapper from the - * supplied @stream. - * - * Return value: -1 on error. - **/ -int -camel_data_wrapper_construct_from_stream (CamelDataWrapper *data_wrapper, - CamelStream *stream) -{ - g_return_val_if_fail (CAMEL_IS_DATA_WRAPPER (data_wrapper), -1); - g_return_val_if_fail (CAMEL_IS_STREAM (stream), -1); - - return CDW_CLASS (data_wrapper)->construct_from_stream (data_wrapper, stream); -} - - -static void -set_mime_type (CamelDataWrapper *data_wrapper, const gchar *mime_type) -{ - gmime_content_field_construct_from_string (data_wrapper->mime_type, - mime_type); -} - -/** - * camel_data_wrapper_set_mime_type: - * @data_wrapper: a data wrapper - * @mime_type: the text representation of a MIME type - * - * This sets the data wrapper's MIME type. - * It might fail, but you won't know. It will allow you to set - * Content-Type parameters on the data wrapper, which are meaningless. - * You should not be allowed to change the MIME type of a data wrapper - * that contains data, or at least, if you do, it should invalidate the - * data. - **/ -void -camel_data_wrapper_set_mime_type (CamelDataWrapper *data_wrapper, - const gchar *mime_type) -{ - g_return_if_fail (CAMEL_IS_DATA_WRAPPER (data_wrapper)); - g_return_if_fail (mime_type != NULL); - - CDW_CLASS (data_wrapper)->set_mime_type (data_wrapper, mime_type); -} - -static gchar * -get_mime_type (CamelDataWrapper *data_wrapper) -{ - return gmime_content_field_get_mime_type (data_wrapper->mime_type); -} - -/** - * camel_data_wrapper_get_mime_type: - * @data_wrapper: a data wrapper - * - * Return value: the text form of the data wrapper's MIME type - **/ -gchar * -camel_data_wrapper_get_mime_type (CamelDataWrapper *data_wrapper) -{ - g_return_val_if_fail (CAMEL_IS_DATA_WRAPPER (data_wrapper), NULL); - - return CDW_CLASS (data_wrapper)->get_mime_type (data_wrapper); -} - - -static GMimeContentField * -get_mime_type_field (CamelDataWrapper *data_wrapper) -{ - return data_wrapper->mime_type; -} - -/** - * camel_data_wrapper_get_mime_type_field: - * @data_wrapper: a data wrapper - * - * Return value: the parsed form of the data wrapper's MIME type - **/ -GMimeContentField * -camel_data_wrapper_get_mime_type_field (CamelDataWrapper *data_wrapper) -{ - g_return_val_if_fail (CAMEL_IS_DATA_WRAPPER (data_wrapper), NULL); - - return CDW_CLASS (data_wrapper)->get_mime_type_field (data_wrapper); -} - -/** - * camel_data_wrapper_set_mime_type_field: - * @data_wrapper: a data wrapper - * @mime_type: the parsed representation of a MIME type - * - * This sets the data wrapper's MIME type. It suffers from the same - * flaws as camel_data_wrapper_set_mime_type. - **/ -static void -set_mime_type_field (CamelDataWrapper *data_wrapper, - GMimeContentField *mime_type) -{ - g_return_if_fail (CAMEL_IS_DATA_WRAPPER (data_wrapper)); - g_return_if_fail (mime_type != NULL); - - if (data_wrapper->mime_type) - gmime_content_field_unref (data_wrapper->mime_type); - data_wrapper->mime_type = mime_type; - if (mime_type) - gmime_content_field_ref (data_wrapper->mime_type); -} - -void -camel_data_wrapper_set_mime_type_field (CamelDataWrapper *data_wrapper, - GMimeContentField *mime_type) -{ - CDW_CLASS (data_wrapper)->set_mime_type_field (data_wrapper, mime_type); -} diff --git a/camel/camel-data-wrapper.h b/camel/camel-data-wrapper.h deleted file mode 100644 index ff4dda649f..0000000000 --- a/camel/camel-data-wrapper.h +++ /dev/null @@ -1,95 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-data-wrapper.h : Abstract class for a data wrapper */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_DATA_WRAPPER_H -#define CAMEL_DATA_WRAPPER_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-object.h> -#include <camel/gmime-content-field.h> - -#define CAMEL_DATA_WRAPPER_TYPE (camel_data_wrapper_get_type ()) -#define CAMEL_DATA_WRAPPER(obj) (CAMEL_CHECK_CAST((obj), CAMEL_DATA_WRAPPER_TYPE, CamelDataWrapper)) -#define CAMEL_DATA_WRAPPER_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_DATA_WRAPPER_TYPE, CamelDataWrapperClass)) -#define CAMEL_IS_DATA_WRAPPER(o) (CAMEL_CHECK_TYPE((o), CAMEL_DATA_WRAPPER_TYPE)) - -struct _CamelDataWrapper -{ - CamelObject parent_object; - - GMimeContentField *mime_type; - CamelStream *stream; -}; - -typedef struct { - CamelObjectClass parent_class; - - /* Virtual methods */ - void (*set_output_stream) (CamelDataWrapper *data_wrapper, - CamelStream *stream); - CamelStream * (*get_output_stream) (CamelDataWrapper *data_wrapper); - - void (*set_mime_type) (CamelDataWrapper *data_wrapper, - const gchar * mime_type); - gchar * (*get_mime_type) (CamelDataWrapper *data_wrapper); - GMimeContentField * (*get_mime_type_field) (CamelDataWrapper *data_wrapper); - void (*set_mime_type_field) (CamelDataWrapper *data_wrapper, - GMimeContentField *mime_type_field); - - int (*write_to_stream) (CamelDataWrapper *data_wrapper, - CamelStream *stream); - - int (*construct_from_stream) (CamelDataWrapper *data_wrapper, - CamelStream *); -} CamelDataWrapperClass; - -/* Standard Camel function */ -CamelType camel_data_wrapper_get_type (void); - -/* public methods */ -CamelDataWrapper * camel_data_wrapper_new(void); -int camel_data_wrapper_write_to_stream (CamelDataWrapper *data_wrapper, - CamelStream *stream); -void camel_data_wrapper_set_mime_type (CamelDataWrapper *data_wrapper, - const gchar *mime_type); -gchar * camel_data_wrapper_get_mime_type (CamelDataWrapper *data_wrapper); -GMimeContentField * camel_data_wrapper_get_mime_type_field (CamelDataWrapper *data_wrapper); -void camel_data_wrapper_set_mime_type_field (CamelDataWrapper *data_wrapper, - GMimeContentField *mime_type); - -int camel_data_wrapper_construct_from_stream (CamelDataWrapper *data_wrapper, CamelStream *stream); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_DATA_WRAPPER_H */ diff --git a/camel/camel-exception-list.def b/camel/camel-exception-list.def deleted file mode 100644 index 8fe1e268cf..0000000000 --- a/camel/camel-exception-list.def +++ /dev/null @@ -1,37 +0,0 @@ -/* WARNING: Exceptions MUST NOT be renumbered: they need to be - * consistent across libraries compiled at different times. - * Categories should be widely separated, old unused exceptions can - * never be deleted, and new exceptions can be added only to the - * ends of categories. - */ - -CAMEL_EXCEPTION_NONE = 0, - -/* Generic exceptions */ -CAMEL_EXCEPTION_INVALID_PARAM, -CAMEL_EXCEPTION_SYSTEM, -CAMEL_EXCEPTION_USER_CANCEL, - -/* CamelFolderException */ -CAMEL_EXCEPTION_FOLDER_NULL = 100, -CAMEL_EXCEPTION_FOLDER_INVALID, -CAMEL_EXCEPTION_FOLDER_INVALID_STATE, -CAMEL_EXCEPTION_FOLDER_NON_EMPTY, -CAMEL_EXCEPTION_FOLDER_NON_UID, -CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION, -CAMEL_EXCEPTION_FOLDER_INVALID_PATH, -CAMEL_EXCEPTION_FOLDER_INVALID_UID, -CAMEL_EXCEPTION_FOLDER_SUMMARY_INVALID, - -/* CamelStoreException */ -CAMEL_EXCEPTION_STORE_NULL = 200, -CAMEL_EXCEPTION_STORE_INVALID, -CAMEL_EXCEPTION_STORE_NO_FOLDER, - -/* CamelServiceException */ -CAMEL_EXCEPTION_SERVICE_NULL = 300, -CAMEL_EXCEPTION_SERVICE_INVALID, -CAMEL_EXCEPTION_SERVICE_URL_INVALID, -CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, -CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, -CAMEL_EXCEPTION_SERVICE_NOT_CONNECTED diff --git a/camel/camel-exception.c b/camel/camel-exception.c deleted file mode 100644 index cf5daff9d3..0000000000 --- a/camel/camel-exception.c +++ /dev/null @@ -1,279 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-execpetion.c : exception utils */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> -#include "camel-exception.h" - - - -/** - * camel_exception_new: allocate a new exception object. - * - * Create and returns a new exception object. - * - * - * Return value: The newly allocated exception object. - **/ -CamelException * -camel_exception_new (void) -{ - CamelException *ex; - - ex = g_new (CamelException, 1); - ex->desc = NULL; - - /* set the Exception Id to NULL */ - ex->id = CAMEL_EXCEPTION_NONE; - - return ex; -} - -/** - * camel_exception_init: init a (statically allocated) exception. - * - * Init an exception. This routine is mainly - * useful when using a statically allocated - * exception. - * - * - **/ -void -camel_exception_init (CamelException *ex) -{ - ex->desc = NULL; - - /* set the Exception Id to NULL */ - ex->id = CAMEL_EXCEPTION_NONE; -} - - -/** - * camel_exception_clear: Clear an exception - * @exception: the exception object - * - * Clear an exception, that is, set the - * exception ID to CAMEL_EXCEPTION_NONE and - * free the description text. - * If the exception is NULL, this funtion just - * returns. - **/ -void -camel_exception_clear (CamelException *exception) -{ - if (!exception) return; - - /* free the description text */ - if (exception->desc) - g_free (exception->desc); - exception->desc = NULL; - - /* set the Exception Id to NULL */ - exception->id = CAMEL_EXCEPTION_NONE; -} - - - - -/** - * camel_exception_free: Free an exception - * @exception: The exception object to free - * - * Free an exception object. If the exception - * is NULL, nothing is done, the routine simply - * returns. - **/ -void -camel_exception_free (CamelException *exception) -{ - if (!exception) return; - - /* free the description text */ - if (exception->desc) - g_free (exception->desc); - /* free the exeption itself */ - g_free (exception); -} - -/** - * camel_exception_set: set an exception - * @ex: exception object - * @id: exception id - * @desc: textual description of the exception - * - * Set the value of an exception. The exception id is - * a unique number representing the exception. The - * textual description is a small text explaining - * what happened and provoked the exception. - * - * When @ex is NULL, nothing is done, this routine - * simply returns. - * - **/ -void -camel_exception_set (CamelException *ex, - ExceptionId id, - const char *desc) -{ - /* if no exception is given, do nothing */ - if (!ex) return; - - ex->id = id; - - /* remove the previous exception description */ - if (ex->desc) - g_free (ex->desc); - ex->desc = g_strdup (desc); -} - - -/** - * camel_exception_setv: set an exception - * @ex: exception object - * @id: exception id - * @format: format of the description string. The format string is - * used as in printf(). - * - * Set the value of an exception. The exception id is - * a unique number representing the exception. The - * textual description is a small text explaining - * what happened and provoked the exception. - * In this version, the string is created from the format - * string and the variable argument list. - * - * It is safe to say: - * camel_exception_setv (ex, ..., camel_exception_get_description (ex), ...); - * - * When @ex is NULL, nothing is done, this routine - * simply returns. - * - **/ -void -camel_exception_setv (CamelException *ex, - ExceptionId id, - const char *format, - ...) -{ - va_list args; - gchar *tmp_desc_string; - - - /* if no exception is given, do nothing */ - if (!ex) return; - - - /* create the temporary exception string */ - va_start(args, format); - tmp_desc_string = g_strdup_vprintf (format, args); - va_end (args); - - - /* now set the exception. We don't call - camel_exception_set because we want to - avoid a useless strdup () */ - ex->id = id; - - /* remove the previous exception description */ - if (ex->desc) - g_free (ex->desc); - ex->desc = g_strdup (tmp_desc_string); - -} - - - - - - - -/** - * camel_exception_xfer: transfer an exception - * @ex_dst: Destination exception object - * @ex_src: Source exception object - * - * Transfer the content of an exception from - * an exception object to another. - * The destination exception receives the id and - * the description text of the source exception. - **/ -void -camel_exception_xfer (CamelException *ex_dst, - CamelException *ex_src) -{ - if (ex_dst->desc) - g_free (ex_dst->desc); - - ex_dst->id = ex_src->id; - ex_dst->desc = ex_src->desc; - - ex_src->desc = NULL; - ex_src->id = CAMEL_EXCEPTION_NONE; -} - - - - - - - -/** - * camel_exception_get_id: get the exception id - * @ex: The exception object - * - * Return the id of an exception. - * If @ex is NULL, return CAMEL_EXCEPTION_NONE; - * - * Return value: Exception ID. - **/ -ExceptionId -camel_exception_get_id (CamelException *ex) -{ - if (ex) - return ex->id; - else - return CAMEL_EXCEPTION_NONE; -} - - - - -/** - * camel_exception_get_description: get the description of an exception. - * @ex: The exception object - * - * Return the exception description text. - * If @ex is NULL, return NULL; - * - * - * Return value: Exception description text. - **/ -const gchar * -camel_exception_get_description (CamelException *ex) -{ - if (ex) - return ex->desc; - else - return NULL; -} diff --git a/camel/camel-exception.h b/camel/camel-exception.h deleted file mode 100644 index d5c93e5941..0000000000 --- a/camel/camel-exception.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-execpetion.h : exception utils */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - - -#ifndef CAMEL_EXCEPTION_H -#define CAMEL_EXCEPTION_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <glib.h> -#include <camel/camel-types.h> - -typedef enum { -#include "camel-exception-list.def" - -} ExceptionId; - - -struct _CamelException { - /* do not access the fields directly */ - ExceptionId id; - char *desc; - -}; - - - -/* creation and destruction functions */ -CamelException * camel_exception_new (void); -void camel_exception_free (CamelException *exception); -void camel_exception_init (CamelException *ex); - - -/* exception content manipulation */ -void camel_exception_clear (CamelException *exception); -void camel_exception_set (CamelException *ex, - ExceptionId id, - const char *desc); -void camel_exception_setv (CamelException *ex, - ExceptionId id, - const char *format, - ...); - - -/* exception content transfer */ -void camel_exception_xfer (CamelException *ex_dst, - CamelException *ex_src); - - -/* exception content retrieval */ -ExceptionId camel_exception_get_id (CamelException *ex); -const gchar * camel_exception_get_description (CamelException *ex); - -#define camel_exception_is_set(ex) (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_EXCEPTION_H */ - diff --git a/camel/camel-folder-search.c b/camel/camel-folder-search.c deleted file mode 100644 index ff9539c9ec..0000000000 --- a/camel/camel-folder-search.c +++ /dev/null @@ -1,731 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -/* This is a helper class for folders to implement the search function. - It implements enough to do basic searches on folders that can provide - an in-memory summary and a body index. */ - -#include <stdio.h> -#include <string.h> -#include <glib.h> -#include <sys/types.h> -#include <regex.h> - -#include <gal/widgets/e-unicode.h> -#include "camel-folder-search.h" -#include "string-utils.h" - -#include "camel-exception.h" -#include "camel-medium.h" -#include "camel-multipart.h" -#include "camel-mime-message.h" -#include "gmime-content-field.h" -#include "camel-stream-mem.h" - -#define d(x) x -#define r(x) x - -struct _CamelFolderSearchPrivate { -}; - -#define _PRIVATE(o) (((CamelFolderSearch *)(o))->priv) - -static ESExpResult *search_header_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search); -static ESExpResult *search_match_all(struct _ESExp *f, int argc, struct _ESExpTerm **argv, CamelFolderSearch *search); -static ESExpResult *search_body_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search); -static ESExpResult *search_user_flag(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s); -static ESExpResult *search_user_tag(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s); -static ESExpResult *search_get_sent_date(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s); -static ESExpResult *search_get_received_date(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s); -static ESExpResult *search_get_current_date(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s); - -static ESExpResult *search_dummy(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search); - -static void camel_folder_search_class_init (CamelFolderSearchClass *klass); -static void camel_folder_search_init (CamelFolderSearch *obj); -static void camel_folder_search_finalize (CamelObject *obj); - -static CamelObjectClass *camel_folder_search_parent; - -static void -camel_folder_search_class_init (CamelFolderSearchClass *klass) -{ - camel_folder_search_parent = camel_type_get_global_classfuncs (camel_object_get_type ()); - - klass->match_all = search_match_all; - klass->body_contains = search_body_contains; - klass->header_contains = search_header_contains; - klass->user_tag = search_user_tag; - klass->user_flag = search_user_flag; - klass->get_sent_date = search_get_sent_date; - klass->get_received_date = search_get_received_date; - klass->get_current_date = search_get_current_date; -} - -static void -camel_folder_search_init (CamelFolderSearch *obj) -{ - struct _CamelFolderSearchPrivate *p; - - p = _PRIVATE(obj) = g_malloc0(sizeof(*p)); - - obj->sexp = e_sexp_new(); -} - -static void -camel_folder_search_finalize (CamelObject *obj) -{ - CamelFolderSearch *search = (CamelFolderSearch *)obj; - if (search->sexp) - camel_object_unref((CamelObject *)search->sexp); - - g_free(search->last_search); -} - -CamelType -camel_folder_search_get_type (void) -{ - static CamelType type = CAMEL_INVALID_TYPE; - - if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register (camel_object_get_type (), "CamelFolderSearch", - sizeof (CamelFolderSearch), - sizeof (CamelFolderSearchClass), - (CamelObjectClassInitFunc) camel_folder_search_class_init, - NULL, - (CamelObjectInitFunc) camel_folder_search_init, - (CamelObjectFinalizeFunc) camel_folder_search_finalize); - } - - return type; -} - -#ifdef offsetof -#define CAMEL_STRUCT_OFFSET(type, field) ((gint) offsetof (type, field)) -#else -#define CAMEL_STRUCT_OFFSET(type, field) ((gint) ((gchar*) &((type *) 0)->field)) -#endif - -struct { - char *name; - int offset; - int flags; /* 0x02 = immediate, 0x01 = always enter */ -} builtins[] = { - /* these have default implementations in e-sexp */ - { "and", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, and), 2 }, - { "or", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, or), 2 }, - { "not", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, not), 2 }, - { "<", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, lt), 2 }, - { ">", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, gt), 2 }, - { "=", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, eq), 2 }, - - /* these we have to use our own default if there is none */ - /* they should all be defined in the language? so it poarses, or should they not?? */ - { "match-all", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, match_all), 3 }, - { "body-contains", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, body_contains), 1 }, - { "header-contains", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, header_contains), 1 }, - { "user-tag", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, user_tag), 1 }, - { "user-flag", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, user_flag), 1 }, - { "get-sent-date", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, get_sent_date), 1 }, - { "get-received-date", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, get_received_date), 1 }, - { "get-current-date", CAMEL_STRUCT_OFFSET(CamelFolderSearchClass, get_current_date), 1 } -}; - -void -camel_folder_search_construct (CamelFolderSearch *search) -{ - int i; - CamelFolderSearchClass *klass = (CamelFolderSearchClass *)CAMEL_OBJECT_GET_CLASS(search); - - for (i=0;i<sizeof(builtins)/sizeof(builtins[0]);i++) { - void *func; - /* c is sure messy sometimes */ - func = *((void **)(((char *)klass)+builtins[i].offset)); - if (func == NULL && builtins[i].flags&1) { - g_warning("Search class doesn't implement '%s' method: %s", builtins[i].name, camel_type_to_name(CAMEL_OBJECT_GET_CLASS(search)->s.type)); - func = (void *)search_dummy; - } - if (func != NULL) { - if (builtins[i].flags&2) { - e_sexp_add_ifunction(search->sexp, 0, builtins[i].name, (ESExpIFunc *)func, search); - } else { - e_sexp_add_function(search->sexp, 0, builtins[i].name, (ESExpFunc *)func, search); - } - } - } -} - -/** - * camel_folder_search_new: - * - * Create a new CamelFolderSearch object. - * - * A CamelFolderSearch is a subclassable, extensible s-exp - * evaluator which enforces a particular set of s-expressions. - * Particular methods may be overriden by an implementation to - * implement a search for any sort of backend. - * - * Return value: A new CamelFolderSearch widget. - **/ -CamelFolderSearch * -camel_folder_search_new (void) -{ - CamelFolderSearch *new = CAMEL_FOLDER_SEARCH ( camel_object_new (camel_folder_search_get_type ())); - - camel_folder_search_construct(new); - return new; -} - -/** - * camel_folder_search_set_folder: - * @search: - * @folder: A folder. - * - * Set the folder attribute of the search. This is currently unused, but - * could be used to perform a slow-search when indexes and so forth are not - * available. Or for use by subclasses. - **/ -void -camel_folder_search_set_folder(CamelFolderSearch *search, CamelFolder *folder) -{ - search->folder = folder; -} - -/** - * camel_folder_search_set_summary: - * @search: - * @summary: An array of CamelMessageInfo pointers. - * - * Set the array of summary objects representing the span of the search. - * - * If this is not set, then a subclass must provide the functions - * for searching headers and for the match-all operator. - **/ -void -camel_folder_search_set_summary(CamelFolderSearch *search, GPtrArray *summary) -{ - search->summary = summary; -} - -/** - * camel_folder_search_set_body_index: - * @search: - * @index: - * - * Set the index (ibex) representing the contents of all messages - * in this folder. If this is not set, then the folder implementation - * should sub-class the CamelFolderSearch and provide its own - * body-contains function. - **/ -void -camel_folder_search_set_body_index(CamelFolderSearch *search, ibex *index) -{ - search->body_index = index; -} - -/** - * camel_folder_search_execute_expression: - * @search: - * @expr: - * @ex: - * - * Execute the search expression @expr, returning an array of - * all matches as a GPtrArray of uid's of matching messages. - * - * Note that any settings such as set_body_index(), set_folder(), - * and so on are reset to #NULL once the search has completed. - * - * TODO: The interface should probably return summary items instead - * (since they are much more useful to any client). - * - * Return value: A GPtrArray of strings of all matching messages. - * This must only be freed by camel_folder_search_free_result. - **/ -GPtrArray * -camel_folder_search_execute_expression(CamelFolderSearch *search, const char *expr, CamelException *ex) -{ - ESExpResult *r; - GPtrArray *matches = g_ptr_array_new (); - int i; - GHashTable *results; - - /* only re-parse if the search has changed */ - if (search->last_search == NULL - || strcmp(search->last_search, expr)) { - e_sexp_input_text(search->sexp, expr, strlen(expr)); - e_sexp_parse(search->sexp); - g_free(search->last_search); - search->last_search = g_strdup(expr); - } - r = e_sexp_eval(search->sexp); - - /* now create a folder summary to return?? */ - if (r - && r->type == ESEXP_RES_ARRAY_PTR) { - d(printf("got result ...\n")); - if (search->summary) { - /* reorder result in summary order */ - results = g_hash_table_new(g_str_hash, g_str_equal); - for (i=0;i<r->value.ptrarray->len;i++) { - d(printf("adding match: %s\n", (char *)g_ptr_array_index(r->value.ptrarray, i))); - g_hash_table_insert(results, g_ptr_array_index(r->value.ptrarray, i), (void *)1); - } - for (i=0;i<search->summary->len;i++) { - CamelMessageInfo *info = g_ptr_array_index(search->summary, i); - if (g_hash_table_lookup(results, info->uid)) { - g_ptr_array_add(matches, g_strdup(info->uid)); - } - } - g_hash_table_destroy(results); - } else { - for (i=0;i<r->value.ptrarray->len;i++) { - d(printf("adding match: %s\n", (char *)g_ptr_array_index(r->value.ptrarray, i))); - g_ptr_array_add(matches, g_strdup(g_ptr_array_index(r->value.ptrarray, i))); - } - } - e_sexp_result_free(r); - } else { - printf("no result!\n"); - } - - search->folder = NULL; - search->summary = NULL; - search->current = NULL; - search->body_index = NULL; - - return matches; -} - -void camel_folder_search_free_result(CamelFolderSearch *search, GPtrArray *result) -{ - int i; - - for (i=0;i<result->len;i++) - g_free(g_ptr_array_index(result, i)); - g_ptr_array_free(result, TRUE); -} - -/* dummy function, returns false always, or an empty match array */ -static ESExpResult * -search_dummy(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search) -{ - ESExpResult *r; - - if (search->current == NULL) { - r = e_sexp_result_new(ESEXP_RES_BOOL); - r->value.bool = FALSE; - } else { - r = e_sexp_result_new(ESEXP_RES_ARRAY_PTR); - r->value.ptrarray = g_ptr_array_new(); - } - - return r; -} - -static ESExpResult * -search_match_all(struct _ESExp *f, int argc, struct _ESExpTerm **argv, CamelFolderSearch *search) -{ - int i; - ESExpResult *r, *r1; - - if (argc>1) { - g_warning("match-all only takes a single argument, other arguments ignored"); - } - r = e_sexp_result_new(ESEXP_RES_ARRAY_PTR); - r->value.ptrarray = g_ptr_array_new(); - - if (search->summary == NULL) { - /* TODO: make it work - e.g. use the folder and so forth for a slower search */ - g_warning("No summary supplied, match-all doesn't work with no summary"); - return r; - } - - /* TODO: Could make this a bit faster in the uncommon case (of match-everything) */ - for (i=0;i<search->summary->len;i++) { - search->current = g_ptr_array_index(search->summary, i); - if (argc>0) { - r1 = e_sexp_term_eval(f, argv[0]); - if (r1->type == ESEXP_RES_BOOL) { - if (r1->value.bool) - g_ptr_array_add(r->value.ptrarray, search->current->uid); - } else { - g_warning("invalid syntax, matches require a single bool result"); - } - e_sexp_result_free(r1); - } else { - g_ptr_array_add(r->value.ptrarray, search->current->uid); - } - } - search->current = NULL; - - return r; -} - -static ESExpResult * -search_header_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search) -{ - ESExpResult *r; - int truth = FALSE; - - r(printf("executing header-contains\n")); - - /* are we inside a match-all? */ - if (search->current && argc>1 - && argv[0]->type == ESEXP_RES_STRING) { - char *headername, *header = NULL; - char strbuf[32]; - int i; - - /* only a subset of headers are supported .. */ - headername = argv[0]->value.string; - if (!strcasecmp(headername, "subject")) { - header = search->current->subject; - } else if (!strcasecmp(headername, "date")) { - /* FIXME: not a very useful form of the date */ - sprintf(strbuf, "%d", (int)search->current->date_sent); - header = strbuf; - } else if (!strcasecmp(headername, "from")) { - header = search->current->from; - } else if (!strcasecmp(headername, "to")) { - header = search->current->to; - } else if (!strcasecmp(headername, "cc")) { - header = search->current->cc; - } else { - g_warning("Performing query on unknown header: %s", headername); - } - - if (header) { - /* performs an OR of all words */ - for (i=1;i<argc && !truth;i++) { - if (argv[i]->type == ESEXP_RES_STRING - && e_utf8_strstrcase (header, argv[i]->value.string)) { - r(printf("%s got a match with %s of %s\n", search->current->uid, header, argv[i]->value.string)); - truth = TRUE; - break; - } - } - } - } - /* TODO: else, find all matches */ - - r = e_sexp_result_new(ESEXP_RES_BOOL); - r->value.bool = truth; - - return r; -} - -/* this is just to OR results together */ -struct _glib_sux_donkeys { - int count; - GPtrArray *uids; -}; - -/* or, store all unique values */ -static void -g_lib_sux_htor(char *key, int value, struct _glib_sux_donkeys *fuckup) -{ - g_ptr_array_add(fuckup->uids, key); -} - -/* performs a 'slow' content-based match */ -static gboolean -message_body_contains(CamelDataWrapper *object, regex_t *pattern) -{ - CamelDataWrapper *containee; - int truth = FALSE; - int parts, i; - - containee = camel_medium_get_content_object(CAMEL_MEDIUM(object)); - - if (containee == NULL) - return FALSE; - - /* TODO: I find it odd that get_part and get_content_object do not - add a reference, probably need fixing for multithreading */ - - /* using the object types is more accurate than using the mime/types */ - if (CAMEL_IS_MULTIPART(containee)) { - parts = camel_multipart_get_number(CAMEL_MULTIPART(containee)); - for (i=0;i<parts && truth==FALSE;i++) { - CamelDataWrapper *part = (CamelDataWrapper *)camel_multipart_get_part(CAMEL_MULTIPART(containee), i); - if (part) { - truth = message_body_contains(part, pattern); - } - } - } else if (CAMEL_IS_MIME_MESSAGE(containee)) { - /* for messages we only look at its contents */ - truth = message_body_contains((CamelDataWrapper *)containee, pattern); - } else if (gmime_content_field_is_type(CAMEL_DATA_WRAPPER(containee)->mime_type, "text", "*")) { - /* for all other text parts, we look inside, otherwise we dont care */ - CamelStreamMem *mem = (CamelStreamMem *)camel_stream_mem_new(); - - camel_data_wrapper_write_to_stream(containee, (CamelStream *)mem); - camel_stream_write((CamelStream *)mem, "", 1); - truth = regexec(pattern, mem->buffer->data, 0, NULL, 0) == 0; - camel_object_unref((CamelObject *)mem); - } - return truth; -} - -/* builds the regex into pattern */ -static int -build_match_regex(regex_t *pattern, int argc, struct _ESExpResult **argv) -{ - GString *match = g_string_new(""); - int c, i, count=0, err; - char *word; - - /* build a regex pattern we can use to match the words, we OR them together */ - if (argc>1) - g_string_append_c(match, '('); - for (i=0;i<argc;i++) { - if (argv[i]->type == ESEXP_RES_STRING) { - if (count > 0) - g_string_append_c(match, '|'); - /* escape any special chars (not sure if this list is complete) */ - word = argv[i]->value.string; - while ((c = *word++)) { - if (strchr("*\\.()[]^$+", c) != NULL) { - g_string_append_c(match, '\\'); - } - g_string_append_c(match, c); - } - count++; - } else { - g_warning("Invalid type passed to body-contains match function"); - } - } - if (argc>1) - g_string_append_c(match, ')'); - err = regcomp(pattern, match->str, REG_EXTENDED|REG_ICASE|REG_NOSUB); - if (err != 0) { - char buffer[1024]; /* dont really care if its longer than this ... */ - - regerror(err, pattern, buffer, 1023); - g_warning("Internal error with search pattern: %s: %s", match->str, buffer); - regfree(pattern); - } - d(printf("Built regex: '%s'\n", match->str)); - g_string_free(match, TRUE); - return err; -} - -static int -match_message(CamelFolder *folder, const char *uid, regex_t *pattern) -{ - CamelMimeMessage *msg; - int truth = FALSE; - CamelException *ex; - - ex = camel_exception_new(); - msg = camel_folder_get_message(folder, uid, ex); - if (!camel_exception_is_set(ex) && msg!=NULL) { - truth = message_body_contains((CamelDataWrapper *)msg, pattern); - camel_object_unref((CamelObject *)msg); - } - camel_exception_free(ex); - return truth; -} - -static ESExpResult * -search_body_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search) -{ - ESExpResult *r; - int i, j; - regex_t pattern; - - if (search->current) { - int truth = FALSE; - - r = e_sexp_result_new(ESEXP_RES_BOOL); - if (search->body_index) { - for (i=0;i<argc && !truth;i++) { - if (argv[i]->type == ESEXP_RES_STRING) { - truth = ibex_find_name(search->body_index, search->current->uid, argv[i]->value.string); - } else { - g_warning("Invalid type passed to body-contains match function"); - } - } - } else if (search->folder) { - /* we do a 'slow' direct search */ - if (build_match_regex(&pattern, argc, argv) == 0) { - truth = match_message(search->folder, search->current->uid, &pattern); - regfree(&pattern); - } - } else { - g_warning("Cannot perform indexed body query with no index or folder set"); - } - r->value.bool = truth; - } else { - r = e_sexp_result_new(ESEXP_RES_ARRAY_PTR); - - if (search->body_index) { - if (argc==1) { - /* common case */ - r->value.ptrarray = ibex_find(search->body_index, argv[0]->value.string); - } else { - GHashTable *ht = g_hash_table_new(g_str_hash, g_str_equal); - GPtrArray *pa; - struct _glib_sux_donkeys lambdafoo; - - /* this sux, perform an or operation on the result(s) of each word */ - for (i=0;i<argc;i++) { - if (argv[i]->type == ESEXP_RES_STRING) { - pa = ibex_find(search->body_index, argv[i]->value.string); - for (j=0;j<pa->len;j++) { - g_hash_table_insert(ht, g_ptr_array_index(pa, j), (void *)1); - } - g_ptr_array_free(pa, FALSE); - } else { - g_warning("invalid type passed to body-contains"); - } - } - lambdafoo.uids = g_ptr_array_new(); - g_hash_table_foreach(ht, (GHFunc)g_lib_sux_htor, &lambdafoo); - r->value.ptrarray = lambdafoo.uids; - g_hash_table_destroy(ht); - } - } else if (search->folder) { - /* do a slow search */ - r->value.ptrarray = g_ptr_array_new(); - if (build_match_regex(&pattern, argc, argv) == 0) { - if (search->summary) { - for (i=0;i<search->summary->len;i++) { - CamelMessageInfo *info = g_ptr_array_index(search->summary, i); - - if (match_message(search->folder, info->uid, &pattern)) - g_ptr_array_add(r->value.ptrarray, info->uid); - } - } /* else? we could always get the summary from the folder, but then - we need to free it later somehow */ - regfree(&pattern); - } - } else { - g_warning("Cannot perform indexed body query with no index or folder set"); - r->value.ptrarray = g_ptr_array_new(); - } - } - - return r; -} - -static ESExpResult *search_user_flag(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search) -{ - ESExpResult *r; - int i; - - r(printf("executing user-flag\n")); - - /* are we inside a match-all? */ - if (search->current) { - int truth = FALSE; - /* performs an OR of all words */ - for (i=0;i<argc && !truth;i++) { - if (argv[i]->type == ESEXP_RES_STRING - && camel_flag_get(&search->current->user_flags, argv[i]->value.string)) { - truth = TRUE; - break; - } - } - r = e_sexp_result_new(ESEXP_RES_BOOL); - r->value.bool = truth; - } else { - r = e_sexp_result_new(ESEXP_RES_ARRAY_PTR); - r->value.ptrarray = g_ptr_array_new(); - } - - return r; -} - -static ESExpResult *search_user_tag(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search) -{ - ESExpResult *r; - - r(printf("executing user-tag\n")); - - /* are we inside a match-all? */ - if (search->current) { - const char *value = NULL; - if (argc == 1) { - value = camel_tag_get(&search->current->user_tags, argv[0]->value.string); - } - r = e_sexp_result_new(ESEXP_RES_STRING); - r->value.string = g_strdup(value?value:""); - } else { - r = e_sexp_result_new(ESEXP_RES_ARRAY_PTR); - r->value.ptrarray = g_ptr_array_new(); - } - - return r; -} - -static ESExpResult * -search_get_sent_date(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s) -{ - ESExpResult *r; - - r(printf("executing get-sent-date\n")); - - /* are we inside a match-all? */ - if (s->current) { - r = e_sexp_result_new (ESEXP_RES_INT); - - r->value.number = s->current->date_sent; - } else { - r = e_sexp_result_new (ESEXP_RES_ARRAY_PTR); - r->value.ptrarray = g_ptr_array_new (); - } - - return r; -} - -static ESExpResult * -search_get_received_date(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s) -{ - ESExpResult *r; - - r(printf("executing get-received-date\n")); - - /* are we inside a match-all? */ - if (s->current) { - r = e_sexp_result_new (ESEXP_RES_INT); - - r->value.number = s->current->date_received; - } else { - r = e_sexp_result_new (ESEXP_RES_ARRAY_PTR); - r->value.ptrarray = g_ptr_array_new (); - } - - return r; -} - -static ESExpResult * -search_get_current_date(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s) -{ - ESExpResult *r; - - r(printf("executing get-current-date\n")); - - r = e_sexp_result_new (ESEXP_RES_INT); - r->value.number = time (NULL); - return r; -} - diff --git a/camel/camel-folder-search.h b/camel/camel-folder-search.h deleted file mode 100644 index f74813e6f7..0000000000 --- a/camel/camel-folder-search.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef _CAMEL_FOLDER_SEARCH_H -#define _CAMEL_FOLDER_SEARCH_H - -#include <camel/camel-object.h> -#include <e-util/e-sexp.h> -#include <gal/util/e-util.h> -#include <libibex/ibex.h> -#include <camel/camel-folder.h> - -#define CAMEL_FOLDER_SEARCH(obj) CAMEL_CHECK_CAST (obj, camel_folder_search_get_type (), CamelFolderSearch) -#define CAMEL_FOLDER_SEARCH_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_folder_search_get_type (), CamelFolderSearchClass) -#define IS_CAMEL_FOLDER_SEARCH(obj) CAMEL_CHECK_TYPE (obj, camel_folder_search_get_type ()) - -typedef struct _CamelFolderSearchClass CamelFolderSearchClass; - -struct _CamelFolderSearch { - CamelObject parent; - - struct _CamelFolderSearchPrivate *priv; - - ESExp *sexp; /* s-exp evaluator */ - char *last_search; /* last searched expression */ - - /* these are only valid during the search, and are reset afterwards */ - CamelFolder *folder; /* folder for current search */ - GPtrArray *summary; /* summary array for current search */ - CamelMessageInfo *current; /* current message info, when searching one by one */ - CamelMimeMessage *current_message; /* cache of current message, if required */ - ibex *body_index; -}; - -struct _CamelFolderSearchClass { - CamelObjectClass parent_class; - - /* general bool/comparison options, usually these wont need to be set, unless it is compiling into another language */ - ESExpResult * (*and)(struct _ESExp *f, int argc, struct _ESExpTerm **argv, CamelFolderSearch *s); - ESExpResult * (*or)(struct _ESExp *f, int argc, struct _ESExpTerm **argv, CamelFolderSearch *s); - ESExpResult * (*not)(struct _ESExp *f, int argc, struct _ESExpTerm **argv, CamelFolderSearch *s); - ESExpResult * (*lt)(struct _ESExp *f, int argc, struct _ESExpTerm **argv, CamelFolderSearch *s); - ESExpResult * (*gt)(struct _ESExp *f, int argc, struct _ESExpTerm **argv, CamelFolderSearch *s); - ESExpResult * (*eq)(struct _ESExp *f, int argc, struct _ESExpTerm **argv, CamelFolderSearch *s); - - /* search options */ - /* (match-all [boolean expression]) Apply match to all messages */ - ESExpResult * (*match_all)(struct _ESExp *f, int argc, struct _ESExpTerm **argv, CamelFolderSearch *s); - - /* (body-contains "string1" "string2" ...) Returns a list of matches, or true if in single-message mode */ - ESExpResult * (*body_contains)(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s); - - /* (header-contains "headername" "string1" ...) List of matches, or true if in single-message mode */ - ESExpResult * (*header_contains)(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s); - - /* (user-flag "flagname" "flagname" ...) If one of user-flag set */ - ESExpResult * (*user_flag)(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s); - - /* (user-tag "flagname") Returns the value of a user tag. Can only be used in match-all */ - ESExpResult * (*user_tag)(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s); - - /* (get-sent-date) Retrieve the date that the message was sent on as a time_t */ - ESExpResult * (*get_sent_date)(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s); - - /* (get-received-date) Retrieve the date that the message was received on as a time_t */ - ESExpResult * (*get_received_date)(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s); - - /* (get-current-date) Retrieve 'now' as a time_t */ - ESExpResult * (*get_current_date)(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *s); -}; - -guint camel_folder_search_get_type (void); -CamelFolderSearch *camel_folder_search_new (void); -void camel_folder_search_construct (CamelFolderSearch *search); - -void camel_folder_search_set_folder(CamelFolderSearch *search, CamelFolder *folder); -void camel_folder_search_set_summary(CamelFolderSearch *search, GPtrArray *summary); -void camel_folder_search_set_body_index(CamelFolderSearch *search, ibex *index); -GPtrArray *camel_folder_search_execute_expression(CamelFolderSearch *search, const char *expr, CamelException *ex); -void camel_folder_search_free_result(CamelFolderSearch *search, GPtrArray *); - -#endif /* ! _CAMEL_FOLDER_SEARCH_H */ diff --git a/camel/camel-folder-summary.c b/camel/camel-folder-summary.c deleted file mode 100644 index f68c2a7970..0000000000 --- a/camel/camel-folder-summary.c +++ /dev/null @@ -1,1682 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <unistd.h> -#include <netinet/in.h> -#include <ctype.h> -#include <string.h> -#include <errno.h> -#include <stdlib.h> - -#include "camel-folder-summary.h" - -#include <camel/camel-mime-message.h> - -#include <camel/camel-mime-filter.h> -#include <camel/camel-mime-filter-index.h> -#include <camel/camel-mime-filter-charset.h> -#include <camel/camel-mime-filter-save.h> -#include <camel/camel-mime-filter-basic.h> -#include <camel/camel-mime-message.h> -#include "hash-table-utils.h" - -/* this should probably be conditional on it existing */ -#define USE_BSEARCH - -#define d(x) -#define io(x) /* io debug */ - -#if 0 -extern int strdup_count, malloc_count, free_count; -#endif - -#define CAMEL_FOLDER_SUMMARY_VERSION (8) - -struct _CamelFolderSummaryPrivate { - GHashTable *filter_charset; /* CamelMimeFilterCharset's indexed by source charset */ - - CamelMimeFilterIndex *filter_index; - CamelMimeFilterBasic *filter_64; - CamelMimeFilterBasic *filter_qp; - CamelMimeFilterSave *filter_save; - - ibex *index; -}; - -#define _PRIVATE(o) (((CamelFolderSummary *)(o))->priv) - -/* trivial lists, just because ... */ -struct _node { - struct _node *next; -}; - -static struct _node *my_list_append(struct _node **list, struct _node *n); -static int my_list_size(struct _node **list); - -static int summary_header_load(CamelFolderSummary *, FILE *); -static int summary_header_save(CamelFolderSummary *, FILE *); - -static CamelMessageInfo * message_info_new(CamelFolderSummary *, struct _header_raw *); -static CamelMessageInfo * message_info_new_from_parser(CamelFolderSummary *, CamelMimeParser *); -static CamelMessageInfo * message_info_load(CamelFolderSummary *, FILE *); -static int message_info_save(CamelFolderSummary *, FILE *, CamelMessageInfo *); -static void message_info_free(CamelFolderSummary *, CamelMessageInfo *); - -static CamelMessageContentInfo * content_info_new(CamelFolderSummary *, struct _header_raw *); -static CamelMessageContentInfo * content_info_new_from_parser(CamelFolderSummary *, CamelMimeParser *); -static CamelMessageContentInfo * content_info_load(CamelFolderSummary *, FILE *); -static int content_info_save(CamelFolderSummary *, FILE *, CamelMessageContentInfo *); -static void content_info_free(CamelFolderSummary *, CamelMessageContentInfo *); - -static CamelMessageContentInfo * summary_build_content_info(CamelFolderSummary *s, CamelMimeParser *mp); - -static void camel_folder_summary_class_init (CamelFolderSummaryClass *klass); -static void camel_folder_summary_init (CamelFolderSummary *obj); -static void camel_folder_summary_finalize (CamelObject *obj); - -static CamelObjectClass *camel_folder_summary_parent; - -static void -camel_folder_summary_class_init (CamelFolderSummaryClass *klass) -{ - camel_folder_summary_parent = camel_type_get_global_classfuncs (camel_object_get_type ()); - - klass->summary_header_load = summary_header_load; - klass->summary_header_save = summary_header_save; - - klass->message_info_new = message_info_new; - klass->message_info_new_from_parser = message_info_new_from_parser; - klass->message_info_load = message_info_load; - klass->message_info_save = message_info_save; - klass->message_info_free = message_info_free; - - klass->content_info_new = content_info_new; - klass->content_info_new_from_parser = content_info_new_from_parser; - klass->content_info_load = content_info_load; - klass->content_info_save = content_info_save; - klass->content_info_free = content_info_free; -} - -static void -camel_folder_summary_init (CamelFolderSummary *s) -{ - struct _CamelFolderSummaryPrivate *p; - - p = _PRIVATE(s) = g_malloc0(sizeof(*p)); - - p->filter_charset = g_hash_table_new(g_strcase_hash, g_strcase_equal); - - s->message_info_size = sizeof(CamelMessageInfo); - s->content_info_size = sizeof(CamelMessageContentInfo); - - s->version = CAMEL_FOLDER_SUMMARY_VERSION; - s->flags = 0; - s->time = 0; - s->nextuid = 1; - - s->messages = g_ptr_array_new(); - s->messages_uid = g_hash_table_new(g_str_hash, g_str_equal); -} - -static void free_o_name(void *key, void *value, void *data) -{ - camel_object_unref((CamelObject *)value); - g_free(key); -} - -static void -camel_folder_summary_finalize (CamelObject *obj) -{ - struct _CamelFolderSummaryPrivate *p; - CamelFolderSummary *s = (CamelFolderSummary *)obj; - - p = _PRIVATE(obj); - - camel_folder_summary_clear(s); - g_ptr_array_free(s->messages, TRUE); - g_hash_table_destroy(s->messages_uid); - - g_hash_table_foreach(p->filter_charset, free_o_name, 0); - g_hash_table_destroy(p->filter_charset); - - g_free(s->summary_path); - - if (p->filter_index) - camel_object_unref ((CamelObject *)p->filter_index); - if (p->filter_64) - camel_object_unref ((CamelObject *)p->filter_64); - if (p->filter_qp) - camel_object_unref ((CamelObject *)p->filter_qp); - if (p->filter_save) - camel_object_unref ((CamelObject *)p->filter_save); - - g_free(p); -} - -CamelType -camel_folder_summary_get_type (void) -{ - static CamelType type = CAMEL_INVALID_TYPE; - - if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register (camel_object_get_type (), "CamelFolderSummary", - sizeof (CamelFolderSummary), - sizeof (CamelFolderSummaryClass), - (CamelObjectClassInitFunc) camel_folder_summary_class_init, - NULL, - (CamelObjectInitFunc) camel_folder_summary_init, - (CamelObjectFinalizeFunc) camel_folder_summary_finalize); - } - - return type; -} - -/** - * camel_folder_summary_new: - * - * Create a new CamelFolderSummary object. - * - * Return value: A new CamelFolderSummary widget. - **/ -CamelFolderSummary * -camel_folder_summary_new (void) -{ - CamelFolderSummary *new = CAMEL_FOLDER_SUMMARY ( camel_object_new (camel_folder_summary_get_type ())); - return new; -} - - -void camel_folder_summary_set_filename(CamelFolderSummary *s, const char *name) -{ - g_free(s->summary_path); - s->summary_path = g_strdup(name); -} - -void camel_folder_summary_set_index(CamelFolderSummary *s, ibex *index) -{ - struct _CamelFolderSummaryPrivate *p = _PRIVATE(s); - - p->index = index; -} - -void camel_folder_summary_set_build_content(CamelFolderSummary *s, gboolean state) -{ - s->build_content = state; -} - -int -camel_folder_summary_count(CamelFolderSummary *s) -{ - return s->messages->len; -} - -CamelMessageInfo * -camel_folder_summary_index(CamelFolderSummary *s, int i) -{ - if (i<s->messages->len) - return g_ptr_array_index(s->messages, i); - return NULL; -} - -CamelMessageInfo * -camel_folder_summary_uid(CamelFolderSummary *s, const char *uid) -{ - return g_hash_table_lookup(s->messages_uid, uid); -} - -guint32 camel_folder_summary_next_uid(CamelFolderSummary *s) -{ - guint32 uid = s->nextuid++; - - /* FIXME: sync this to disk */ -/* summary_header_save(s);*/ - return uid; -} - -void camel_folder_summary_set_uid(CamelFolderSummary *s, guint32 uid) -{ - s->nextuid = MAX(s->nextuid, uid); -} - -char * -camel_folder_summary_next_uid_string(CamelFolderSummary *s) -{ - return g_strdup_printf("%u", camel_folder_summary_next_uid(s)); -} - -/* loads the content descriptions, recursively */ -static CamelMessageContentInfo * -perform_content_info_load(CamelFolderSummary *s, FILE *in) -{ - int i; - guint32 count; - CamelMessageContentInfo *ci, *part; - - ci = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->content_info_load(s, in); - camel_folder_summary_decode_uint32(in, &count); - for (i=0;i<count;i++) { - part = perform_content_info_load(s, in); - if (part) { - my_list_append((struct _node **)&ci->childs, (struct _node *)part); - part->parent = ci; - } else { - g_warning("Summary file format messed up?"); - } - } - return ci; -} - -int -camel_folder_summary_load(CamelFolderSummary *s) -{ - FILE *in; - int i; - CamelMessageInfo *mi; - - g_assert(s->summary_path); - - in = fopen(s->summary_path, "r"); - if ( in == NULL ) { - return -1; - } - - if ( ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->summary_header_load(s, in) == -1) { - fclose(in); - return -1; - } - - /* now read in each message ... */ - /* FIXME: check returns */ - for (i=0;i<s->saved_count;i++) { - mi = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->message_info_load(s, in); - - if (s->build_content) { - mi->content = perform_content_info_load(s, in); - } - - camel_folder_summary_add(s, mi); - } - - if (fclose(in) == -1) - return -1; - - s->flags &= ~CAMEL_SUMMARY_DIRTY; - - return 0; -} - -/* saves the content descriptions, recursively */ -static int -perform_content_info_save(CamelFolderSummary *s, FILE *out, CamelMessageContentInfo *ci) -{ - CamelMessageContentInfo *part; - - ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->content_info_save(s, out, ci); - camel_folder_summary_encode_uint32(out, my_list_size((struct _node **)&ci->childs)); - part = ci->childs; - while (part) { - perform_content_info_save(s, out, part); - part = part->next; - } - return 0; -} - -int -camel_folder_summary_save(CamelFolderSummary *s) -{ - FILE *out; - int fd; - int i; - guint32 count; - CamelMessageInfo *mi; - - g_assert(s->summary_path); - - if ((s->flags & CAMEL_SUMMARY_DIRTY) == 0) - return 0; - - fd = open(s->summary_path, O_RDWR|O_CREAT, 0600); - if (fd == -1) - return -1; - out = fdopen(fd, "w"); - if ( out == NULL ) { - close(fd); - return -1; - } - - io(printf("saving header\n")); - - if ( ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->summary_header_save(s, out) == -1) { - fclose(out); - return -1; - } - - /* now write out each message ... */ - /* FIXME: check returns */ - count = camel_folder_summary_count(s); - for (i=0;i<count;i++) { - mi = camel_folder_summary_index(s, i); - ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->message_info_save(s, out, mi); - - if (s->build_content) { - perform_content_info_save(s, out, mi->content); - } - } - if (fclose(out) == -1) - return -1; - - s->flags &= ~CAMEL_SUMMARY_DIRTY; - return 0; -} - -void camel_folder_summary_add(CamelFolderSummary *s, CamelMessageInfo *info) -{ - if (info == NULL) - return; -retry: - if (info->uid == NULL) { - info->uid = camel_folder_summary_next_uid_string(s); - } - if (g_hash_table_lookup(s->messages_uid, info->uid)) { - g_warning("Trying to insert message with clashing uid (%s). new uid re-assigned", info->uid); - g_free(info->uid); - info->uid = NULL; - info->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED; - goto retry; - } - - g_ptr_array_add(s->messages, info); - g_hash_table_insert(s->messages_uid, info->uid, info); - s->flags |= CAMEL_SUMMARY_DIRTY; -} - -CamelMessageInfo *camel_folder_summary_add_from_header(CamelFolderSummary *s, struct _header_raw *h) -{ - CamelMessageInfo *info = NULL; - - info = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s))) -> message_info_new(s, h); - camel_folder_summary_add(s, info); - - return info; -} - -CamelMessageInfo *camel_folder_summary_add_from_parser(CamelFolderSummary *s, CamelMimeParser *mp) -{ - CamelMessageInfo *info = NULL; - char *buffer; - int len; - struct _CamelFolderSummaryPrivate *p = _PRIVATE(s); - - /* should this check the parser is in the right state, or assume it is?? */ - - if (camel_mime_parser_step(mp, &buffer, &len) != HSCAN_EOF) { - info = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->message_info_new_from_parser(s, mp); - - camel_mime_parser_unstep(mp); - - camel_folder_summary_add(s, info); - - if (p->index) { - if (p->filter_index == NULL) - p->filter_index = camel_mime_filter_index_new_ibex(p->index); - camel_mime_filter_index_set_name(p->filter_index, info->uid); - ibex_unindex(p->index, info->uid); - } - - /* build the content info, if we're supposed to */ - if (s->build_content) { - info->content = summary_build_content_info(s, mp); - if (info->content->pos != -1) - info->size = info->content->endpos - info->content->pos; - } else { - camel_mime_parser_drop_step(mp); - } - } - return info; -} - -static void -perform_content_info_free(CamelFolderSummary *s, CamelMessageContentInfo *ci) -{ - CamelMessageContentInfo *pw, *pn; - - pw = ci->childs; - ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->content_info_free(s, ci); - while (pw) { - pn = pw->next; - perform_content_info_free(s, pw); - pw = pn; - } -} - -void -camel_folder_summary_touch(CamelFolderSummary *s) -{ - s->flags |= CAMEL_SUMMARY_DIRTY; -} - -void -camel_folder_summary_clear(CamelFolderSummary *s) -{ - int i; - - if (camel_folder_summary_count(s) == 0) - return; - - for (i=0;i<camel_folder_summary_count(s);i++) { - CamelMessageInfo *mi = camel_folder_summary_index(s, i); - CamelMessageContentInfo *ci = mi->content; - - ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->message_info_free(s, mi); - if (s->build_content && ci) { - perform_content_info_free(s, ci); - } - } - - g_ptr_array_set_size(s->messages, 0); - g_hash_table_destroy(s->messages_uid); - s->messages_uid = g_hash_table_new(g_str_hash, g_str_equal); - s->flags |= CAMEL_SUMMARY_DIRTY; -} - -void camel_folder_summary_remove(CamelFolderSummary *s, CamelMessageInfo *info) -{ - CamelMessageContentInfo *ci = info->content; - - g_hash_table_remove(s->messages_uid, info->uid); - g_ptr_array_remove(s->messages, info); - ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->message_info_free(s, info); - if (s->build_content && ci) { - perform_content_info_free(s, ci); - } - s->flags |= CAMEL_SUMMARY_DIRTY; -} - -void camel_folder_summary_remove_uid(CamelFolderSummary *s, const char *uid) -{ - CamelMessageInfo *oldinfo; - char *olduid; - - if (g_hash_table_lookup_extended(s->messages_uid, uid, (void *)&olduid, (void *)&oldinfo)) { - camel_folder_summary_remove(s, oldinfo); - g_free(olduid); - } -} - -void camel_folder_summary_remove_index(CamelFolderSummary *s, int index) -{ - CamelMessageInfo *oldinfo; - - oldinfo = camel_folder_summary_index (s, index); - if (oldinfo) - camel_folder_summary_remove(s, oldinfo); -} - -int -camel_folder_summary_encode_uint32(FILE *out, guint32 value) -{ - int i; - - io(printf("Encoding int %u\n", value)); - - for (i=28;i>0;i-=7) { - if (value >= (1<<i)) { - unsigned int c = (value>>i) & 0x7f; - if (fputc(c, out) == -1) - return -1; - } - } - return fputc(value | 0x80, out); -} - -int -camel_folder_summary_decode_uint32(FILE *in, guint32 *dest) -{ - guint32 value=0, v; - - /* until we get the last byte, keep decoding 7 bits at a time */ - while ( ((v = fgetc(in)) & 0x80) == 0 && v!=EOF) { - value |= v; - value <<= 7; - } - if (v == EOF) { - *dest = value>>7; - return 01; - } - *dest = value | (v&0x7f); - - io(printf("Decoding int %u\n", *dest)); - - return 0; -} - -int -camel_folder_summary_encode_fixed_int32(FILE *out, gint32 value) -{ - guint32 save; - - save = htonl(value); - if (fwrite(&save, sizeof(save), 1, out) != 1) - return -1; - return 0; -} - -int -camel_folder_summary_decode_fixed_int32(FILE *in, gint32 *dest) -{ - guint32 save; - - if (fread(&save, sizeof(save), 1, in) == 1) { - *dest = ntohl(save); - return 0; - } else { - return -1; - } -} - -int -camel_folder_summary_encode_time_t(FILE *out, time_t value) -{ - int i; - - for (i=sizeof(time_t)-1;i>=0;i--) { - if (fputc((value >> (i*8)) & 0xff, out) == -1) - return -1; - } - return 0; -} - -int -camel_folder_summary_decode_time_t(FILE *in, time_t *dest) -{ - time_t save = 0; - unsigned int v; - int i = sizeof(time_t) - 1; - - while ( i>=0 && (v = fgetc(in)) != EOF) { - save |= v << (i*8); - i--; - } - *dest = save; - return 0; -} - -/* should be sorted, for binary search */ -/* This is a tokenisation mechanism for strings written to the - summary - to save space. - This list can have at most 31 words. */ -static char * tokens[] = { - "7bit", - "8bit", - "alternative", - "application", - "base64", - "boundary", - "charset", - "filename", - "html", - "image", - "iso-8859-1", - "iso-8859-8", - "message", - "mixed", - "multipart", - "name", - "octet-stream", - "parallel", - "plain", - "postscript", - "quoted-printable", - "related", - "rfc822", - "text", - "us-ascii", /* 25 words */ -}; - -#define tokens_len (sizeof(tokens)/sizeof(tokens[0])) - -/* baiscally ... - 0 = null - 1-tokens_len == tokens[id-1] - >=32 string, length = n-32 -*/ - -#ifdef USE_BSEARCH -static int -token_search_cmp(char *key, char **index) -{ - d(printf("comparing '%s' to '%s'\n", key, *index)); - return strcmp(key, *index); -} -#endif - -int -camel_folder_summary_encode_token(FILE *out, char *str) -{ - io(printf("Encoding token: '%s'\n", str)); - - if (str == NULL) { - return camel_folder_summary_encode_uint32(out, 0); - } else { - int len = strlen(str); - int i, token=-1; - - if (len <= 16) { - char lower[32]; - char **match; - - for (i=0;i<len;i++) - lower[i] = tolower(str[i]); - lower[i] = 0; -#ifdef USE_BSEARCH - match = bsearch(lower, tokens, tokens_len, sizeof(char *), (int (*)(const void *, const void *))token_search_cmp); - if (match) - token = match-tokens; -#else - for (i=0;i<tokens_len;i++) { - if (!strcmp(tokens[i], lower)) { - token = i; - break; - } - } -#endif - } - if (token != -1) { - return camel_folder_summary_encode_uint32(out, token+1); - } else { - if (camel_folder_summary_encode_uint32(out, len+32) == -1) - return -1; - if (fwrite(str, len, 1, out) != 1) - return -1; - } - } - return 0; -} - -int -camel_folder_summary_decode_token(FILE *in, char **str) -{ - char *ret; - guint32 len; - - io(printf("Decode token ...\n")); - - if (camel_folder_summary_decode_uint32(in, &len) == -1) { - g_warning("Could not decode token from file"); - *str = NULL; - return -1; - } - - if (len<32) { - if (len <= 0) { - ret = NULL; - } else if (len<= tokens_len) { - ret = g_strdup(tokens[len-1]); - } else { - g_warning("Invalid token encountered: %d", len); - *str = NULL; - return -1; - } - } else if (len > 10240) { - g_warning("Got broken string header length: %d bytes", len); - *str = NULL; - return -1; - } else { - len -= 32; - ret = g_malloc(len+1); - if (fread(ret, len, 1, in) != 1) { - g_free(ret); - *str = NULL; - return -1; - } - ret[len]=0; - } - - io(printf("Token = '%s'\n", ret)); - - *str = ret; - return 0; -} - -int -camel_folder_summary_encode_string(FILE *out, char *str) -{ - register int len; - - io(printf("Encoding string: '%s'\n", str)); - - if (str == NULL) - return camel_folder_summary_encode_uint32(out, 0); - - len = strlen(str); - if (camel_folder_summary_encode_uint32(out, len+1) == -1) - return -1; - if (fwrite(str, len, 1, out) == 1) - return 0; - return -1; -} - - -int -camel_folder_summary_decode_string(FILE *in, char **str) -{ - gint32 len; - register char *ret; - - io(printf("Decode string ...\n", str)); - - if (camel_folder_summary_decode_uint32(in, &len) == -1) { - *str = NULL; - return -1; - } - - len--; - if (len < 0) { - *str = NULL; - io(printf("String = '%s'\n", *str)); - return -1; - } - - ret = g_malloc(len+1); - if (fread(ret, len, 1, in) != 1) { - g_free(ret); - *str = NULL; - return -1; - } - - io(printf("String = '%s'\n", ret)); - - ret[len] = 0; - *str = ret; - return 0; -} - -void -camel_folder_summary_offset_content(CamelMessageContentInfo *content, off_t offset) -{ - content->pos += offset; - content->bodypos += offset; - content->endpos += offset; - content = content->childs; - while (content) { - camel_folder_summary_offset_content(content, offset); - content = content->next; - } -} - -static struct _node * -my_list_append(struct _node **list, struct _node *n) -{ - struct _node *ln = (struct _node *)list; - while (ln->next) - ln = ln->next; - n->next = 0; - ln->next = n; - return n; -} - -static int -my_list_size(struct _node **list) -{ - int len = 0; - struct _node *ln = (struct _node *)list; - while (ln->next) { - ln = ln->next; - len++; - } - return len; -} - -static int -summary_header_load(CamelFolderSummary *s, FILE *in) -{ - gint32 version, flags, nextuid, count, utime; - - fseek(in, 0, SEEK_SET); - - io(printf("Loading header\n")); - - if (camel_folder_summary_decode_fixed_int32(in, &version) == -1 - || camel_folder_summary_decode_fixed_int32(in, &flags) == -1 - || camel_folder_summary_decode_fixed_int32(in, &nextuid) == -1 - || camel_folder_summary_decode_fixed_int32(in, &utime) == -1 - || camel_folder_summary_decode_fixed_int32(in, &count) == -1) { - return -1; - } - - s->nextuid = nextuid; - s->flags = flags; - s->time = (time_t) utime; - s->saved_count = count; - if (s->version != version) { - g_warning("Summary header version mismatch"); - return -1; - } - return 0; -} - -static int -summary_header_save(CamelFolderSummary *s, FILE *out) -{ - fseek(out, 0, SEEK_SET); - - io(printf("Savining header\n")); - - camel_folder_summary_encode_fixed_int32(out, s->version); - camel_folder_summary_encode_fixed_int32(out, s->flags); - camel_folder_summary_encode_fixed_int32(out, s->nextuid); - camel_folder_summary_encode_fixed_int32(out, s->time); - return camel_folder_summary_encode_fixed_int32(out, camel_folder_summary_count(s)); -} - -/* are these even useful for anything??? */ -static CamelMessageInfo * message_info_new_from_parser(CamelFolderSummary *s, CamelMimeParser *mp) -{ - CamelMessageInfo *mi = NULL; - int state; - - state = camel_mime_parser_state(mp); - switch (state) { - case HSCAN_HEADER: - case HSCAN_MESSAGE: - case HSCAN_MULTIPART: - mi = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->message_info_new(s, camel_mime_parser_headers_raw(mp)); - break; - default: - g_error("Invalid parser state"); - } - - return mi; -} - -static CamelMessageContentInfo * content_info_new_from_parser(CamelFolderSummary *s, CamelMimeParser *mp) -{ - CamelMessageContentInfo *ci = NULL; - - switch (camel_mime_parser_state(mp)) { - case HSCAN_HEADER: - case HSCAN_MESSAGE: - case HSCAN_MULTIPART: - ci = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->content_info_new(s, camel_mime_parser_headers_raw(mp)); - if (ci) { - ci->type = camel_mime_parser_content_type(mp); - header_content_type_ref(ci->type); - } - break; - default: - g_error("Invalid parser state"); - } - - return ci; -} - -char * -camel_folder_summary_format_address(struct _header_raw *h, const char *name) -{ - struct _header_address *addr; - const char *text; - char *ret, *tmp; - - text = header_raw_find (&h, name, NULL); - addr = header_address_decode (text); - if (addr) { - /* FIXME: perhaps decoding would be best done in header_address_list_format */ - tmp = header_address_list_format (addr); - ret = header_decode_string (tmp); - g_free (tmp); - header_address_list_clear (&addr); - } else { - ret = g_strdup (text); - } - - return ret; -} - -char * -camel_folder_summary_format_string(struct _header_raw *h, const char *name) -{ - const char *text; - - text = header_raw_find(&h, name, NULL); - if (text) { - while (isspace(*text)) - text++; - return header_decode_string(text); - } else { - return NULL; - } -} - -static CamelMessageInfo * -message_info_new(CamelFolderSummary *s, struct _header_raw *h) -{ - CamelMessageInfo *mi; - const char *received; - - mi = g_malloc0(s->message_info_size); - - mi->subject = camel_folder_summary_format_string(h, "subject"); - mi->from = camel_folder_summary_format_address(h, "from"); - mi->to = camel_folder_summary_format_address(h, "to"); - mi->cc = camel_folder_summary_format_address(h, "cc"); - mi->user_flags = NULL; - mi->user_tags = NULL; - mi->date_sent = header_decode_date(header_raw_find(&h, "date", NULL), NULL); - received = header_raw_find(&h, "received", NULL); - if (received) - received = strrchr(received, ';'); - if (received) - mi->date_received = header_decode_date(received + 1, NULL); - else - mi->date_received = 0; - mi->message_id = header_msgid_decode(header_raw_find(&h, "message-id", NULL)); - /* if we have a references, use that, otherwise, see if we have an in-reply-to - header, with parsable content, otherwise *shrug* */ - mi->references = header_references_decode(header_raw_find(&h, "references", NULL)); - if (mi->references == NULL) - mi->references = header_references_decode(header_raw_find(&h, "in-reply-to", NULL)); - return mi; -} - - -static CamelMessageInfo * -message_info_load(CamelFolderSummary *s, FILE *in) -{ - CamelMessageInfo *mi; - guint count; - int i; - - mi = g_malloc0(s->message_info_size); - - io(printf("Loading message info\n")); - - camel_folder_summary_decode_string(in, &mi->uid); - camel_folder_summary_decode_uint32(in, &mi->flags); - camel_folder_summary_decode_uint32(in, &mi->size); - camel_folder_summary_decode_time_t(in, &mi->date_sent); - camel_folder_summary_decode_time_t(in, &mi->date_received); - camel_folder_summary_decode_string(in, &mi->subject); - camel_folder_summary_decode_string(in, &mi->from); - camel_folder_summary_decode_string(in, &mi->to); - camel_folder_summary_decode_string(in, &mi->cc); - mi->content = NULL; - - camel_folder_summary_decode_string(in, &mi->message_id); - - camel_folder_summary_decode_uint32(in, &count); - for (i=0;i<count;i++) { - char *id; - camel_folder_summary_decode_string(in, &id); - header_references_list_append_asis(&mi->references, id); - } - - camel_folder_summary_decode_uint32(in, &count); - for (i=0;i<count;i++) { - char *name; - camel_folder_summary_decode_string(in, &name); - camel_flag_set(&mi->user_flags, name, TRUE); - g_free(name); - } - - camel_folder_summary_decode_uint32(in, &count); - for (i=0;i<count;i++) { - char *name, *value; - camel_folder_summary_decode_string(in, &name); - camel_folder_summary_decode_string(in, &value); - camel_tag_set(&mi->user_tags, name, value); - g_free(name); - g_free(value); - } - - return mi; -} - -static int -message_info_save(CamelFolderSummary *s, FILE *out, CamelMessageInfo *mi) -{ - guint32 count; - CamelFlag *flag; - CamelTag *tag; - struct _header_references *refs; - - io(printf("Saving message info\n")); - - camel_folder_summary_encode_string(out, mi->uid); - camel_folder_summary_encode_uint32(out, mi->flags); - camel_folder_summary_encode_uint32(out, mi->size); - camel_folder_summary_encode_time_t(out, mi->date_sent); - camel_folder_summary_encode_time_t(out, mi->date_received); - camel_folder_summary_encode_string(out, mi->subject); - camel_folder_summary_encode_string(out, mi->from); - camel_folder_summary_encode_string(out, mi->to); - camel_folder_summary_encode_string(out, mi->cc); - - camel_folder_summary_encode_string(out, mi->message_id); - - count = header_references_list_size(&mi->references); - camel_folder_summary_encode_uint32(out, count); - refs = mi->references; - while (refs) { - camel_folder_summary_encode_string(out, refs->id); - refs = refs->next; - } - - count = camel_flag_list_size(&mi->user_flags); - camel_folder_summary_encode_uint32(out, count); - flag = mi->user_flags; - while (flag) { - camel_folder_summary_encode_string(out, flag->name); - flag = flag->next; - } - - count = camel_tag_list_size(&mi->user_tags); - camel_folder_summary_encode_uint32(out, count); - tag = mi->user_tags; - while (tag) { - camel_folder_summary_encode_string(out, tag->name); - camel_folder_summary_encode_string(out, tag->value); - tag = tag->next; - } - - return ferror(out); -} - -static void -message_info_free(CamelFolderSummary *s, CamelMessageInfo *mi) -{ - camel_message_info_free(mi); -} - -static CamelMessageContentInfo * -content_info_new(CamelFolderSummary *s, struct _header_raw *h) -{ - CamelMessageContentInfo *ci; - - ci = g_malloc0(s->content_info_size); - - ci->id = header_msgid_decode(header_raw_find(&h, "content-id", NULL)); - ci->description = header_decode_string(header_raw_find(&h, "content-description", NULL)); - ci->encoding = header_content_encoding_decode(header_raw_find(&h, "content-transfer-encoding", NULL)); - - ci->pos = -1; - ci->bodypos = -1; - ci->endpos = -1; - return ci; -} - -static CamelMessageContentInfo * -content_info_load(CamelFolderSummary *s, FILE *in) -{ - CamelMessageContentInfo *ci; - char *type, *subtype; - guint32 count, i, upos, ubodypos, uendpos; - struct _header_content_type *ct; - - io(printf("Loading content info\n")); - - ci = g_malloc0(s->content_info_size); - - camel_folder_summary_decode_uint32(in, &upos); - camel_folder_summary_decode_uint32(in, &ubodypos); - camel_folder_summary_decode_uint32(in, &uendpos); - - ci->pos = (off_t) upos; - ci->bodypos = (off_t) ubodypos; - ci->endpos = (off_t) uendpos; - - camel_folder_summary_decode_token(in, &type); - camel_folder_summary_decode_token(in, &subtype); - ct = header_content_type_new(type, subtype); - g_free(type); /* can this be removed? */ - g_free(subtype); - camel_folder_summary_decode_uint32(in, &count); - for (i=0;i<count;i++) { - char *name, *value; - camel_folder_summary_decode_token(in, &name); - camel_folder_summary_decode_token(in, &value); - header_content_type_set_param(ct, name, value); - /* TODO: do this so we dont have to double alloc/free */ - g_free(name); - g_free(value); - } - ci->type = ct; - - camel_folder_summary_decode_token(in, &ci->id); - camel_folder_summary_decode_token(in, &ci->description); - camel_folder_summary_decode_token(in, &ci->encoding); - - ci->childs = NULL; - return ci; -} - -static int -content_info_save(CamelFolderSummary *s, FILE *out, CamelMessageContentInfo *ci) -{ - struct _header_content_type *ct; - struct _header_param *hp; - - io(printf("Saving content info\n")); - - camel_folder_summary_encode_uint32(out, ci->pos); - camel_folder_summary_encode_uint32(out, ci->bodypos); - camel_folder_summary_encode_uint32(out, ci->endpos); - - ct = ci->type; - if (ct) { - camel_folder_summary_encode_token(out, ct->type); - camel_folder_summary_encode_token(out, ct->subtype); - camel_folder_summary_encode_uint32(out, my_list_size((struct _node **)&ct->params)); - hp = ct->params; - while (hp) { - camel_folder_summary_encode_token(out, hp->name); - camel_folder_summary_encode_token(out, hp->value); - hp = hp->next; - } - } else { - camel_folder_summary_encode_token(out, NULL); - camel_folder_summary_encode_token(out, NULL); - camel_folder_summary_encode_uint32(out, 0); - } - camel_folder_summary_encode_token(out, ci->id); - camel_folder_summary_encode_token(out, ci->description); - return camel_folder_summary_encode_token(out, ci->encoding); -} - -static void -content_info_free(CamelFolderSummary *s, CamelMessageContentInfo *ci) -{ - header_content_type_unref(ci->type); - g_free(ci->id); - g_free(ci->description); - g_free(ci->encoding); - g_free(ci); -} - -/* - OK - Now this is where all the "smarts" happen, where the content info is built, - and any indexing and what not is performed -*/ - -static CamelMessageContentInfo * -summary_build_content_info(CamelFolderSummary *s, CamelMimeParser *mp) -{ - int state, len; - char *buffer; - CamelMessageContentInfo *info = NULL; - struct _header_content_type *ct; - int body; - int enc_id = -1, chr_id = -1, idx_id = -1; - struct _CamelFolderSummaryPrivate *p = _PRIVATE(s); - CamelMimeFilterCharset *mfc; - CamelMessageContentInfo *part; - - d(printf("building content info\n")); - - /* start of this part */ - state = camel_mime_parser_step(mp, &buffer, &len); - body = camel_mime_parser_tell(mp); - - info = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->content_info_new_from_parser(s, mp); - - info->pos = camel_mime_parser_tell_start_headers(mp); - info->bodypos = body; - - switch(state) { - case HSCAN_HEADER: - /* check content type for indexing, then read body */ - ct = camel_mime_parser_content_type(mp); - if (p->index && header_content_type_is(ct, "text", "*")) { - char *encoding; - const char *charset; - - d(printf("generating index:\n")); - - encoding = header_content_encoding_decode(camel_mime_parser_header(mp, "content-transfer-encoding", NULL)); - if (encoding) { - if (!strcasecmp(encoding, "base64")) { - d(printf(" decoding base64\n")); - if (p->filter_64 == NULL) - p->filter_64 = camel_mime_filter_basic_new_type(CAMEL_MIME_FILTER_BASIC_BASE64_DEC); - enc_id = camel_mime_parser_filter_add(mp, (CamelMimeFilter *)p->filter_64); - } else if (!strcasecmp(encoding, "quoted-printable")) { - d(printf(" decoding quoted-printable\n")); - if (p->filter_qp == NULL) - p->filter_qp = camel_mime_filter_basic_new_type(CAMEL_MIME_FILTER_BASIC_QP_DEC); - enc_id = camel_mime_parser_filter_add(mp, (CamelMimeFilter *)p->filter_qp); - } else { - d(printf(" ignoring encoding %s\n", encoding)); - } - g_free(encoding); - } - - charset = header_content_type_param(ct, "charset"); - if (charset!=NULL - && !(strcasecmp(charset, "us-ascii")==0 - || strcasecmp(charset, "utf-8")==0)) { - d(printf(" Adding conversion filter from %s to UTF-8\n", charset)); - mfc = g_hash_table_lookup(p->filter_charset, charset); - if (mfc == NULL) { - mfc = camel_mime_filter_charset_new_convert(charset, "UTF-8"); - if (mfc) - g_hash_table_insert(p->filter_charset, g_strdup(charset), mfc); - } - if (mfc) { - chr_id = camel_mime_parser_filter_add(mp, (CamelMimeFilter *)mfc); - } else { - g_warning("Cannot convert '%s' to 'UTF-8', message index may be corrupt", charset); - } - } - - /* and this filter actually does the indexing */ - idx_id = camel_mime_parser_filter_add(mp, (CamelMimeFilter *)p->filter_index); - } - /* and scan/index everything */ - while (camel_mime_parser_step(mp, &buffer, &len) != HSCAN_BODY_END) - ; - /* and remove the filters */ - camel_mime_parser_filter_remove(mp, enc_id); - camel_mime_parser_filter_remove(mp, chr_id); - camel_mime_parser_filter_remove(mp, idx_id); - break; - case HSCAN_MULTIPART: - d(printf("Summarising multipart\n")); - while (camel_mime_parser_step(mp, &buffer, &len) != HSCAN_MULTIPART_END) { - camel_mime_parser_unstep(mp); - part = summary_build_content_info(s, mp); - if (part) { - part->parent = info; - my_list_append((struct _node **)&info->childs, (struct _node *)part); - } else { - g_error("Parsing failed: could not build part of a multipart"); - } - } - break; - case HSCAN_MESSAGE: - d(printf("Summarising message\n")); - part = summary_build_content_info(s, mp); - if (part) { - part->parent = info; - my_list_append((struct _node **)&info->childs, (struct _node *)part); - } else { - g_error("Parsing failed: no content of a message?"); - } - state = camel_mime_parser_step(mp, &buffer, &len); - if (state != HSCAN_MESSAGE_END) { - g_error("Bad parser state: Expecing MESSAGE_END or MESSAGE_EOF, got: %d", state); - camel_mime_parser_unstep(mp); - } - break; - } - - info->endpos = camel_mime_parser_tell(mp); - - d(printf("finished building content info\n")); - - return info; -} - -gboolean -camel_flag_get(CamelFlag **list, const char *name) -{ - CamelFlag *flag; - flag = *list; - while (flag) { - if (!strcmp(flag->name, name)) - return TRUE; - flag = flag->next; - } - return FALSE; -} - -void -camel_flag_set(CamelFlag **list, const char *name, gboolean value) -{ - CamelFlag *flag, *tmp; - - /* this 'trick' works because flag->next is the first element */ - flag = (CamelFlag *)list; - while (flag->next) { - tmp = flag->next; - if (!strcmp(flag->next->name, name)) { - if (!value) { - flag->next = tmp->next; - g_free(tmp); - } - return; - } - flag = tmp; - } - - if (value) { - tmp = g_malloc(sizeof(*tmp) + strlen(name)); - strcpy(tmp->name, name); - tmp->next = 0; - flag->next = tmp; - } -} - -int -camel_flag_list_size(CamelFlag **list) -{ - int count=0; - CamelFlag *flag; - - flag = *list; - while (flag) { - count++; - flag = flag->next; - } - return count; -} - -void -camel_flag_list_free(CamelFlag **list) -{ - CamelFlag *flag, *tmp; - flag = *list; - while (flag) { - tmp = flag->next; - g_free(flag); - flag = tmp; - } - *list = NULL; -} - -const char *camel_tag_get(CamelTag **list, const char *name) -{ - CamelTag *tag; - - tag = *list; - while (tag) { - if (!strcmp(tag->name, name)) - return (const char *)tag->value; - tag = tag->next; - } - return NULL; -} - -void camel_tag_set(CamelTag **list, const char *name, const char *value) -{ - CamelTag *tag, *tmp; - - /* this 'trick' works because tag->next is the first element */ - tag = (CamelTag *)list; - while (tag->next) { - tmp = tag->next; - if (!strcmp(tmp->name, name)) { - if (value == NULL) { /* clear it? */ - tag->next = tmp->next; - g_free(tmp->value); - g_free(tmp); - } else if (strcmp(tmp->value, value)) { /* has it changed? */ - g_free(tmp->value); - tmp->value = g_strdup(value); - } - return; - } - tag = tmp; - } - - if (value) { - tmp = g_malloc(sizeof(*tmp)+strlen(name)); - strcpy(tmp->name, name); - tmp->value = g_strdup(value); - tmp->next = 0; - tag->next = tmp; - } -} - -int camel_tag_list_size(CamelTag **list) -{ - int count=0; - CamelTag *tag; - - tag = *list; - while (tag) { - count++; - tag = tag->next; - } - return count; -} - -void camel_tag_list_free(CamelTag **list) -{ - CamelTag *tag, *tmp; - tag = *list; - while (tag) { - tmp = tag->next; - g_free(tag->value); - g_free(tag); - tag = tmp; - } - *list = NULL; -} - -/** - * camel_message_info_dup_to: - * @from: source message info - * @to: destination message info - * - * Duplicates the contents of one CamelMessageInfo structure into another. - * (The destination is assumed to be empty: its contents are not freed.) - * The slightly odd interface is to allow this to be used to initialize - * "subclasses" of CamelMessageInfo. - **/ -void -camel_message_info_dup_to(const CamelMessageInfo *from, CamelMessageInfo *to) -{ - CamelFlag *flag; - CamelTag *tag; - - /* Copy numbers */ - to->flags = from->flags; - to->size = from->size; - to->date_sent = from->date_sent; - to->date_received = from->date_received; - - /* Copy strings */ - to->subject = g_strdup(from->subject); - to->from = g_strdup(from->from); - to->to = g_strdup(from->to); - to->cc = g_strdup(from->cc); - to->uid = g_strdup(from->uid); - to->message_id = g_strdup(from->message_id); - - /* Copy structures */ - to->references = header_references_dup(from->references); - flag = from->user_flags; - while (flag) { - camel_flag_set(&to->user_flags, flag->name, TRUE); - flag = flag->next; - } - - tag = from->user_tags; - while (tag) { - camel_tag_set(&to->user_tags, tag->name, tag->value); - tag = tag->next; - } - - /* FIXME some day */ - to->content = NULL; -} - -/** - * camel_message_info_free: - * @mi: the message info - * - * Frees a CamelMessageInfo and its contents. - **/ -void -camel_message_info_free(CamelMessageInfo *mi) -{ - g_free(mi->uid); - g_free(mi->subject); - g_free(mi->from); - g_free(mi->to); - g_free(mi->cc); - g_free(mi->message_id); - header_references_list_clear(&mi->references); - camel_flag_list_free(&mi->user_flags); - camel_tag_list_free(&mi->user_tags); - /* FIXME: content info? */ - g_free(mi); -} - -#if 0 -static void -content_info_dump(CamelMessageContentInfo *ci, int depth) -{ - char *p; - - p = alloca(depth*4+1); - memset(p, ' ', depth*4); - p[depth*4] = 0; - - if (ci == NULL) { - printf("%s<empty>\n", p); - return; - } - - printf("%sconent-type: %s/%s\n", p, ci->type->type, ci->type->subtype); - printf("%sontent-transfer-encoding: %s\n", p, ci->encoding); - printf("%scontent-description: %s\n", p, ci->description); - printf("%sbytes: %d %d %d\n", p, (int)ci->pos, (int)ci->bodypos, (int)ci->endpos); - ci = ci->childs; - while (ci) { - content_info_dump(ci, depth+1); - ci = ci->next; - } -} - -static void -message_info_dump(CamelMessageInfo *mi) -{ - if (mi == NULL) { - printf("No message?\n"); - return; - } - - printf("Subject: %s\n", mi->subject); - printf("To: %s\n", mi->to); - printf("Cc: %s\n", mi->cc); - printf("From: %s\n", mi->from); - printf("UID: %s\n", mi->uid); - printf("Flags: %04x\n", mi->flags & 0xffff); - content_info_dump(mi->content, 0); -} - -int main(int argc, char **argv) -{ - CamelMimeParser *mp; - int fd; - CamelFolderSummary *s; - char *buffer; - int len; - int i; - ibex *index; - - /*g_tk_init(&argc, &argv);*/ - -#if 0 - { - int i; - char *s; - char buf[1024]; - - for (i=0;i<434712;i++) { - memcpy(buf, " ", 50); - buf[50] = 0; -#if 0 - s = g_strdup(buf); - g_free(s); -#endif - } - return 0; - } -#endif - - if (argc < 2 ) { - printf("usage: %s mbox\n", argv[0]); - return 1; - } - - fd = open(argv[1], O_RDONLY); - - index = ibex_open("index.ibex", O_CREAT|O_RDWR, 0600); - - mp = camel_mime_parser_new(); - camel_mime_parser_scan_from(mp, TRUE); -/* camel_mime_parser_set_header_regex(mp, "^(content-[^:]*|subject|from|to|date):");*/ - camel_mime_parser_init_with_fd(mp, fd); - - s = camel_folder_summary_new(); - camel_folder_summary_set_build_content(s, TRUE); -/* camel_folder_summary_set_index(s, index);*/ - - while (camel_mime_parser_step(mp, &buffer, &len) == HSCAN_FROM) { - /*printf("Parsing message ...\n");*/ - camel_folder_summary_add_from_parser(s, mp); - if (camel_mime_parser_step(mp, &buffer, &len) != HSCAN_FROM_END) { - g_warning("Uknown state encountered, excpecting %d, got %d\n", HSCAN_FROM_END, camel_mime_parser_state(mp)); - break; - } - } - - printf("Printing summary\n"); - for (i=0;i<camel_folder_summary_count(s);i++) { - message_info_dump(camel_folder_summary_index(s, i)); - } - - printf("Saivng summary\n"); - camel_folder_summary_set_filename(s, "index.summary"); - camel_folder_summary_save(s); - - { - CamelFolderSummary *n; - - printf("\nLoading summary\n"); - n = camel_folder_summary_new(); - camel_folder_summary_set_build_content(n, TRUE); - camel_folder_summary_set_filename(n, "index.summary"); - camel_folder_summary_load(n); - - printf("Printing summary\n"); - for (i=0;i<camel_folder_summary_count(n);i++) { - message_info_dump(camel_folder_summary_index(n, i)); - } - camel_object_unref(n); - } - - - camel_object_unref(mp); - camel_object_unref(s); - - printf("summarised %d messages\n", camel_folder_summary_count(s)); -#if 0 - printf("g_strdup count = %d\n", strdup_count); - printf("g_malloc count = %d\n", malloc_count); - printf("g_free count = %d\n", free_count); -#endif - return 0; -} - -#endif diff --git a/camel/camel-folder-summary.h b/camel/camel-folder-summary.h deleted file mode 100644 index 95b394c69f..0000000000 --- a/camel/camel-folder-summary.h +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef _CAMEL_FOLDER_SUMMARY_H -#define _CAMEL_FOLDER_SUMMARY_H - -#include <camel/camel-object.h> -#include <stdio.h> -#include <time.h> -#include <camel/camel-mime-parser.h> -#include <libibex/ibex.h> - -#define CAMEL_FOLDER_SUMMARY(obj) CAMEL_CHECK_CAST (obj, camel_folder_summary_get_type (), CamelFolderSummary) -#define CAMEL_FOLDER_SUMMARY_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_folder_summary_get_type (), CamelFolderSummaryClass) -#define IS_CAMEL_FOLDER_SUMMARY(obj) CAMEL_CHECK_TYPE (obj, camel_folder_summary_get_type ()) - -/*typedef struct _CamelFolderSummary CamelFolderSummary;*/ -typedef struct _CamelFolderSummaryClass CamelFolderSummaryClass; - -/* A tree of message content info structures - describe the content structure of the message (if it has any) */ -typedef struct _CamelMessageContentInfo { - struct _CamelMessageContentInfo *next; - - struct _CamelMessageContentInfo *childs; - struct _CamelMessageContentInfo *parent; - - struct _header_content_type *type; - char *id; - char *description; - char *encoding; - - /* information about where this object lives in the stream. - if pos is -1 these are all invalid */ - off_t pos; - off_t bodypos; - off_t endpos; -} CamelMessageContentInfo; - -/* system flag bits */ -enum _CamelMessageFlags { - CAMEL_MESSAGE_ANSWERED = 1<<0, - CAMEL_MESSAGE_DELETED = 1<<1, - CAMEL_MESSAGE_DRAFT = 1<<2, - CAMEL_MESSAGE_FLAGGED = 1<<3, - CAMEL_MESSAGE_SEEN = 1<<4, - /* following flags are for the folder, and are not really permanent flags */ - CAMEL_MESSAGE_FOLDER_FLAGGED = 1<<16, /* for use by the folder implementation */ - CAMEL_MESSAGE_USER = 1<<31 /* supports user flags */ -}; - -typedef struct _CamelFlag { - struct _CamelFlag *next; - char name[1]; /* name allocated as part of the structure */ -} CamelFlag; - -typedef struct _CamelTag { - struct _CamelTag *next; - char *value; - char name[1]; /* name allocated as part of the structure */ -} CamelTag; - -/* information about a given object */ -typedef struct { - /* public fields */ - gchar *subject; - gchar *from; - gchar *to; - gchar *cc; - - gchar *uid; - guint32 flags; - guint32 size; - - time_t date_sent; - time_t date_received; - - /* Message-ID / References structures */ - char *message_id; /* for this message */ - struct _header_references *references; /* from parent to root */ - - struct _CamelFlag *user_flags; - struct _CamelTag *user_tags; - - /* tree of content description - NULL if it is not available */ - CamelMessageContentInfo *content; -} CamelMessageInfo; - -enum _CamelFolderSummaryFlags { - CAMEL_SUMMARY_DIRTY = 1<<0, -}; - -struct _CamelFolderSummary { - CamelObject parent; - - struct _CamelFolderSummaryPrivate *priv; - - /* header info */ - guint32 version; /* version of file required, should be set by implementors */ - guint32 flags; /* flags */ - guint32 nextuid; /* next uid? */ - guint32 saved_count; /* how many were saved/loaded */ - time_t time; /* timestamp for this summary (for implementors to use) */ - - /* sizes of memory objects */ - guint32 message_info_size; - guint32 content_info_size; - - char *summary_path; - gboolean build_content; /* do we try and parse/index the content, or not? */ - - GPtrArray *messages; /* CamelMessageInfo's */ - GHashTable *messages_uid; /* CamelMessageInfo's by uid */ -}; - -struct _CamelFolderSummaryClass { - CamelObjectClass parent_class; - - /* load/save the global info */ - int (*summary_header_load)(CamelFolderSummary *, FILE *); - int (*summary_header_save)(CamelFolderSummary *, FILE *); - - /* create/save/load an individual message info */ - CamelMessageInfo * (*message_info_new)(CamelFolderSummary *, struct _header_raw *); - CamelMessageInfo * (*message_info_new_from_parser)(CamelFolderSummary *, CamelMimeParser *); - CamelMessageInfo * (*message_info_load)(CamelFolderSummary *, FILE *); - int (*message_info_save)(CamelFolderSummary *, FILE *, CamelMessageInfo *); - void (*message_info_free)(CamelFolderSummary *, CamelMessageInfo *); - - /* save/load individual content info's */ - CamelMessageContentInfo * (*content_info_new)(CamelFolderSummary *, struct _header_raw *); - CamelMessageContentInfo * (*content_info_new_from_parser)(CamelFolderSummary *, CamelMimeParser *); - CamelMessageContentInfo * (*content_info_load)(CamelFolderSummary *, FILE *); - int (*content_info_save)(CamelFolderSummary *, FILE *, CamelMessageContentInfo *); - void (*content_info_free)(CamelFolderSummary *, CamelMessageContentInfo *); -}; - -guint camel_folder_summary_get_type (void); -CamelFolderSummary *camel_folder_summary_new (void); - -void camel_folder_summary_set_filename(CamelFolderSummary *, const char *); -void camel_folder_summary_set_index(CamelFolderSummary *, ibex *); -void camel_folder_summary_set_build_content(CamelFolderSummary *, gboolean state); - -guint32 camel_folder_summary_next_uid (CamelFolderSummary *s); -char *camel_folder_summary_next_uid_string (CamelFolderSummary *s); -void camel_folder_summary_set_uid (CamelFolderSummary *s, guint32 uid); - -/* load/save the summary in its entirety */ -int camel_folder_summary_load(CamelFolderSummary *); -int camel_folder_summary_save(CamelFolderSummary *); - -/* set the dirty bit on the summary */ -void camel_folder_summary_touch(CamelFolderSummary *s); - -/* add a new raw summary item */ -void camel_folder_summary_add(CamelFolderSummary *, CamelMessageInfo *info); - -/* build/add raw summary items */ -CamelMessageInfo *camel_folder_summary_add_from_header(CamelFolderSummary *, struct _header_raw *); -CamelMessageInfo *camel_folder_summary_add_from_parser(CamelFolderSummary *, CamelMimeParser *); - -/* removes a summary item, doesn't fix content offsets */ -void camel_folder_summary_remove(CamelFolderSummary *s, CamelMessageInfo *info); -void camel_folder_summary_remove_uid(CamelFolderSummary *s, const char *uid); -void camel_folder_summary_remove_index(CamelFolderSummary *s, int); -/* remove all items */ -void camel_folder_summary_clear(CamelFolderSummary *s); - -/* lookup functions */ -int camel_folder_summary_count(CamelFolderSummary *); -CamelMessageInfo *camel_folder_summary_index(CamelFolderSummary *, int); -CamelMessageInfo *camel_folder_summary_uid(CamelFolderSummary *, const char *uid); - -/* shift content ... */ -void camel_folder_summary_offset_content(CamelMessageContentInfo *content, off_t offset); - -/* summary formatting utils */ -char *camel_folder_summary_format_address (struct _header_raw *h, const char *name); -char *camel_folder_summary_format_string (struct _header_raw *h, const char *name); - -/* summary file loading/saving helper functions */ -int camel_folder_summary_encode_fixed_int32(FILE *, gint32); -int camel_folder_summary_decode_fixed_int32(FILE *, gint32 *); - -int camel_folder_summary_encode_uint32(FILE *, guint32); -int camel_folder_summary_decode_uint32(FILE *, guint32 *); - -int camel_folder_summary_encode_time_t(FILE *out, time_t value); -int camel_folder_summary_decode_time_t(FILE *in, time_t *dest); - -int camel_folder_summary_encode_string(FILE *, char *); -int camel_folder_summary_decode_string(FILE *, char **); - -/* basically like strings, but certain keywords can be compressed and de-cased */ -int camel_folder_summary_encode_token(FILE *, char *); -int camel_folder_summary_decode_token(FILE *, char **); - -/* message flag operations */ -gboolean camel_flag_get(CamelFlag **list, const char *name); -void camel_flag_set(CamelFlag **list, const char *name, gboolean state); -int camel_flag_list_size(CamelFlag **list); -void camel_flag_list_free(CamelFlag **list); - -/* message tag operations */ -const char *camel_tag_get(CamelTag **list, const char *name); -void camel_tag_set(CamelTag **list, const char *name, const char *value); -int camel_tag_list_size(CamelTag **list); -void camel_tag_list_free(CamelTag **list); - -/* message info utils */ -void camel_message_info_dup_to(const CamelMessageInfo *from, CamelMessageInfo *to); -void camel_message_info_free(CamelMessageInfo *mi); - -#endif /* ! _CAMEL_FOLDER_SUMMARY_H */ diff --git a/camel/camel-folder.c b/camel/camel-folder.c deleted file mode 100644 index 1d929fb4f0..0000000000 --- a/camel/camel-folder.c +++ /dev/null @@ -1,1360 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-folder.c: Abstract class for an email folder */ - -/* - * Author: - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> -#include <string.h> -#include "camel-folder.h" -#include "camel-exception.h" -#include "camel-store.h" -#include "camel-mime-message.h" -#include "string-utils.h" - -static CamelObjectClass *parent_class = NULL; - -/* Returns the class for a CamelFolder */ -#define CF_CLASS(so) CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - -static void camel_folder_finalize (CamelObject *object); - -static void refresh_info (CamelFolder *folder, CamelException *ex); - -static void folder_sync (CamelFolder *folder, gboolean expunge, - CamelException *ex); - -static const gchar *get_name (CamelFolder *folder); -static const gchar *get_full_name (CamelFolder *folder); -static CamelStore *get_parent_store (CamelFolder *folder); - -static guint32 get_permanent_flags (CamelFolder *folder); -static guint32 get_message_flags (CamelFolder *folder, const char *uid); -static void set_message_flags (CamelFolder *folder, const char *uid, - guint32 flags, guint32 set); -static gboolean get_message_user_flag (CamelFolder *folder, const char *uid, const char *name); -static void set_message_user_flag (CamelFolder *folder, const char *uid, - const char *name, gboolean value); -static const char *get_message_user_tag(CamelFolder *folder, const char *uid, const char *name); -static void set_message_user_tag(CamelFolder *folder, const char *uid, const char *name, const char *value); - -static gint get_message_count (CamelFolder *folder); -static gint get_unread_message_count (CamelFolder *folder); - -static void expunge (CamelFolder *folder, - CamelException *ex); - - -static void append_message (CamelFolder *folder, CamelMimeMessage *message, - const CamelMessageInfo *info, CamelException *ex); - - -static GPtrArray *get_uids (CamelFolder *folder); -static void free_uids (CamelFolder *folder, - GPtrArray *array); -static GPtrArray *get_summary (CamelFolder *folder); -static void free_summary (CamelFolder *folder, - GPtrArray *array); - -static CamelMimeMessage *get_message (CamelFolder *folder, - const gchar *uid, - CamelException *ex); - -static const CamelMessageInfo *get_message_info (CamelFolder *folder, - const char *uid); - -static GPtrArray *search_by_expression (CamelFolder *folder, - const char *exp, - CamelException *ex); -static void search_free (CamelFolder * folder, - GPtrArray * result); - -static void copy_message_to (CamelFolder *source, - const char *uid, - CamelFolder *dest, - CamelException *ex); - -static void move_message_to (CamelFolder *source, - const char *uid, - CamelFolder *dest, - CamelException *ex); - -static void freeze (CamelFolder *folder); -static void thaw (CamelFolder *folder); - -static gboolean folder_changed (CamelObject *object, - gpointer event_data); -static gboolean message_changed (CamelObject *object, - /*const char *uid*/gpointer event_data); - -static void -camel_folder_class_init (CamelFolderClass *camel_folder_class) -{ - CamelObjectClass *camel_object_class = - CAMEL_OBJECT_CLASS (camel_folder_class); - - parent_class = camel_type_get_global_classfuncs (camel_object_get_type ()); - - /* virtual method definition */ - camel_folder_class->sync = folder_sync; - camel_folder_class->refresh_info = refresh_info; - camel_folder_class->get_name = get_name; - camel_folder_class->get_full_name = get_full_name; - camel_folder_class->get_parent_store = get_parent_store; - camel_folder_class->expunge = expunge; - camel_folder_class->get_message_count = get_message_count; - camel_folder_class->get_unread_message_count = get_unread_message_count; - camel_folder_class->append_message = append_message; - camel_folder_class->get_permanent_flags = get_permanent_flags; - camel_folder_class->get_message_flags = get_message_flags; - camel_folder_class->set_message_flags = set_message_flags; - camel_folder_class->get_message_user_flag = get_message_user_flag; - camel_folder_class->set_message_user_flag = set_message_user_flag; - camel_folder_class->get_message_user_tag = get_message_user_tag; - camel_folder_class->set_message_user_tag = set_message_user_tag; - camel_folder_class->get_message = get_message; - camel_folder_class->get_uids = get_uids; - camel_folder_class->free_uids = free_uids; - camel_folder_class->get_summary = get_summary; - camel_folder_class->free_summary = free_summary; - camel_folder_class->search_by_expression = search_by_expression; - camel_folder_class->search_free = search_free; - camel_folder_class->get_message_info = get_message_info; - camel_folder_class->copy_message_to = copy_message_to; - camel_folder_class->move_message_to = move_message_to; - camel_folder_class->freeze = freeze; - camel_folder_class->thaw = thaw; - - /* virtual method overload */ - camel_object_class_declare_event (camel_object_class, - "folder_changed", folder_changed); - camel_object_class_declare_event (camel_object_class, - "message_changed", message_changed); -} - -static void -camel_folder_init (gpointer object, gpointer klass) -{ - CamelFolder *folder = object; - - folder->frozen = 0; - folder->changed_frozen = camel_folder_change_info_new(); -} - -static void -camel_folder_finalize (CamelObject *object) -{ - CamelFolder *camel_folder = CAMEL_FOLDER (object); - - g_free (camel_folder->name); - g_free (camel_folder->full_name); - - if (camel_folder->parent_store) - camel_object_unref (CAMEL_OBJECT (camel_folder->parent_store)); - - camel_folder_change_info_free(camel_folder->changed_frozen); -} - -CamelType -camel_folder_get_type (void) -{ - static CamelType camel_folder_type = CAMEL_INVALID_TYPE; - - if (camel_folder_type == CAMEL_INVALID_TYPE) { - camel_folder_type = camel_type_register (CAMEL_OBJECT_TYPE, "CamelFolder", - sizeof (CamelFolder), - sizeof (CamelFolderClass), - (CamelObjectClassInitFunc) camel_folder_class_init, - NULL, - (CamelObjectInitFunc) camel_folder_init, - (CamelObjectFinalizeFunc) camel_folder_finalize ); - } - - return camel_folder_type; -} - - -/** - * camel_folder_construct: - * @folder: folder object to construct - * @parent_store: parent store object of the folder - * @full_name: full name of the folder - * @name: short name of the folder - * - * Initalizes the folder by setting the parent store and name. - **/ -void -camel_folder_construct (CamelFolder *folder, CamelStore *parent_store, - const char *full_name, const char *name) -{ - g_return_if_fail (CAMEL_IS_FOLDER (folder)); - g_return_if_fail (CAMEL_IS_STORE (parent_store)); - g_return_if_fail (folder->parent_store == NULL); - g_return_if_fail (folder->name == NULL); - - folder->parent_store = parent_store; - camel_object_ref (CAMEL_OBJECT (parent_store)); - - folder->name = g_strdup (name); - folder->full_name = g_strdup (full_name); -} - - -static void -folder_sync (CamelFolder *folder, gboolean expunge, CamelException *ex) -{ - g_warning ("CamelFolder::sync not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); -} - -/** - * camel_folder_sync: - * @folder: The folder object - * @expunge: whether or not to expunge deleted messages - * @ex: exception object - * - * Sync changes made to a folder to its backing store, possibly expunging - * deleted messages as well. - **/ -void -camel_folder_sync (CamelFolder *folder, gboolean expunge, CamelException *ex) -{ - g_return_if_fail (CAMEL_IS_FOLDER (folder)); - - CF_CLASS (folder)->sync (folder, expunge, ex); -} - - -static void -refresh_info (CamelFolder *folder, CamelException *ex) -{ - /* No op */ -} - -/** - * camel_folder_refresh_info: - * @folder: The folder object - * @ex: exception object - * - * Updates a folder's summary to be in sync with its backing store. - **/ -void -camel_folder_refresh_info (CamelFolder *folder, CamelException *ex) -{ - g_return_if_fail (CAMEL_IS_FOLDER (folder)); - - CF_CLASS (folder)->refresh_info (folder, ex); -} - - -static const char * -get_name (CamelFolder *folder) -{ - return folder->name; -} - -/** - * camel_folder_get_name: - * @folder: a folder - * - * Get the (short) name of the folder. The fully qualified name - * can be obtained with the get_full_name method. - * - * Return value: name of the folder - **/ -const char * -camel_folder_get_name (CamelFolder * folder) -{ - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); - - return CF_CLASS (folder)->get_name (folder); -} - - -static const char * -get_full_name (CamelFolder *folder) -{ - return folder->full_name; -} - -/** - * camel_folder_get_full_name: - * @folder: a folder - * - * Get the (full) name of the folder. - * - * Return value: full name of the folder - **/ -const char * -camel_folder_get_full_name (CamelFolder *folder) -{ - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); - - return CF_CLASS (folder)->get_full_name (folder); -} - - -static CamelStore * -get_parent_store (CamelFolder * folder) -{ - return folder->parent_store; -} - -/** - * camel_folder_get_parent_store: - * @folder: folder to get the parent of - * - * Return value: the parent store of the folder. - **/ -CamelStore * -camel_folder_get_parent_store (CamelFolder *folder) -{ - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); - - return CF_CLASS (folder)->get_parent_store (folder); -} - - -static void -expunge (CamelFolder *folder, CamelException *ex) -{ - g_warning ("CamelFolder::expunge not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); -} - - -/** - * camel_folder_expunge: - * @folder: the folder - * @ex: a CamelException - * - * Delete messages which have been marked as "DELETED" - **/ -void -camel_folder_expunge (CamelFolder *folder, CamelException *ex) -{ - g_return_if_fail (CAMEL_IS_FOLDER (folder)); - - CF_CLASS (folder)->expunge (folder, ex); -} - - -static int -get_message_count (CamelFolder *folder) -{ - g_warning ("CamelFolder::get_message_count not implemented " - "for `%s'", camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); - return -1; -} - -/** - * camel_folder_get_message_count: - * @folder: A CamelFolder object - * - * Return value: the number of messages in the folder, or -1 if unknown. - **/ -int -camel_folder_get_message_count (CamelFolder *folder) -{ - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), -1); - - return CF_CLASS (folder)->get_message_count (folder); -} - - -static int -get_unread_message_count (CamelFolder *folder) -{ - g_warning ("CamelFolder::get_unread_message_count not implemented " - "for `%s'", camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); - return -1; -} - -/** - * camel_folder_unread_get_message_count: - * @folder: A CamelFolder object - * - * Return value: the number of unread messages in the folder, or -1 if unknown. - **/ -int -camel_folder_get_unread_message_count (CamelFolder *folder) -{ - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), -1); - - return CF_CLASS (folder)->get_unread_message_count (folder); -} - - -static void -append_message (CamelFolder *folder, CamelMimeMessage *message, - const CamelMessageInfo *info, CamelException *ex) -{ - g_warning ("CamelFolder::append_message not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); - return; - -} - -/** - * camel_folder_append_message: add a message to a folder - * @folder: folder object to add the message to - * @message: message object - * @info: message info with additional flags/etc to set on - * new message, or %NULL - * @ex: exception object - * - * Add a message to a folder. Only the flag and tag data from @info - * is used. If @info is %NULL, no flags or tags will be set. - **/ -void -camel_folder_append_message (CamelFolder *folder, CamelMimeMessage *message, - const CamelMessageInfo *info, CamelException *ex) -{ - g_return_if_fail (CAMEL_IS_FOLDER (folder)); - - CF_CLASS (folder)->append_message (folder, message, info, ex); -} - - -static guint32 -get_permanent_flags (CamelFolder *folder) -{ - return folder->permanent_flags; -} - -/** - * camel_folder_get_permanent_flags: - * @folder: a CamelFolder - * - * Return value: the set of CamelMessageFlags that can be permanently - * stored on a message between sessions. If it includes %CAMEL_FLAG_USER, - * then user-defined flags will be remembered. - **/ -guint32 -camel_folder_get_permanent_flags (CamelFolder *folder) -{ - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), 0); - - return CF_CLASS (folder)->get_permanent_flags (folder); -} - - -static guint32 -get_message_flags (CamelFolder *folder, const char *uid) -{ - g_warning ("CamelFolder::get_message_flags not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); - return 0; -} - -/** - * camel_folder_get_message_flags: - * @folder: a CamelFolder - * @uid: the UID of a message in @folder - * - * Return value: the CamelMessageFlags that are set on the indicated - * message. - **/ -guint32 -camel_folder_get_message_flags (CamelFolder *folder, const char *uid) -{ - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), 0); - - return CF_CLASS (folder)->get_message_flags (folder, uid); -} - - -static void -set_message_flags (CamelFolder *folder, const char *uid, - guint32 flags, guint32 set) -{ - g_warning ("CamelFolder::set_message_flags not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); -} - -/** - * camel_folder_set_message_flags: - * @folder: a CamelFolder - * @uid: the UID of a message in @folder - * @flags: a set of CamelMessageFlag values to set - * @set: the mask of values in @flags to use. - * - * Sets those flags specified by @set to the values specified by @flags - * on the indicated message. (This may or may not persist after the - * folder or store is closed. See camel_folder_get_permanent_flags().) - **/ -void -camel_folder_set_message_flags (CamelFolder *folder, const char *uid, - guint32 flags, guint32 set) -{ - g_return_if_fail (CAMEL_IS_FOLDER (folder)); - - CF_CLASS (folder)->set_message_flags (folder, uid, flags, set); -} - - -static gboolean -get_message_user_flag (CamelFolder *folder, const char *uid, - const char *name) -{ - g_warning ("CamelFolder::get_message_user_flag not implemented " - "for `%s'", camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); - return FALSE; -} - -/** - * camel_folder_get_message_user_flag: - * @folder: a CamelFolder - * @uid: the UID of a message in @folder - * @name: the name of a user flag - * - * Return value: whether or not the given user flag is set on the message. - **/ -gboolean -camel_folder_get_message_user_flag (CamelFolder *folder, const char *uid, - const char *name) -{ - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), 0); - - return CF_CLASS (folder)->get_message_user_flag (folder, uid, name); -} - - -static void -set_message_user_flag (CamelFolder *folder, const char *uid, - const char *name, gboolean value) -{ - g_warning ("CamelFolder::set_message_user_flag not implemented " - "for `%s'", camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); -} - -/** - * camel_folder_set_message_user_flag: - * @folder: a CamelFolder - * @uid: the UID of a message in @folder - * @name: the name of the user flag to set - * @value: the value to set it to - * - * Sets the user flag specified by @name to the value specified by @value - * on the indicated message. (This may or may not persist after the - * folder or store is closed. See camel_folder_get_permanent_flags().) - **/ -void -camel_folder_set_message_user_flag (CamelFolder *folder, const char *uid, - const char *name, gboolean value) -{ - g_return_if_fail (CAMEL_IS_FOLDER (folder)); - - CF_CLASS (folder)->set_message_user_flag (folder, uid, name, value); -} - -static const char *get_message_user_tag(CamelFolder *folder, const char *uid, const char *name) -{ - g_warning ("CamelFolder::get_message_user_tag not implemented " - "for `%s'", camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); - return NULL; -} - -/** - * camel_folder_get_message_user_tag: - * @folder: a CamelFolder - * @uid: the UID of a message in @folder - * @name: the name of a user tag - * - * Return value: Returns the value of the user tag. - **/ -const char * -camel_folder_get_message_user_tag (CamelFolder *folder, const char *uid, const char *name) -{ - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), 0); - - return CF_CLASS (folder)->get_message_user_tag (folder, uid, name); -} - - -static void -set_message_user_tag(CamelFolder *folder, const char *uid, const char *name, const char *value) -{ - g_warning ("CamelFolder::set_message_user_tag not implemented " - "for `%s'", camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); -} - -/** - * camel_folder_set_message_user_tag: - * @folder: a CamelFolder - * @uid: the UID of a message in @folder - * @name: the name of the user tag to set - * @value: the value to set it to - * - * Sets the user tag specified by @name to the value specified by @value - * on the indicated message. (This may or may not persist after the - * folder or store is closed. See camel_folder_get_permanent_flags().) - **/ -void -camel_folder_set_message_user_tag (CamelFolder *folder, const char *uid, const char *name, const char *value) -{ - g_return_if_fail (CAMEL_IS_FOLDER (folder)); - - CF_CLASS (folder)->set_message_user_tag (folder, uid, name, value); -} - - -static const CamelMessageInfo * -get_message_info (CamelFolder *folder, const char *uid) -{ - g_warning ("CamelFolder::get_message_info not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); - return NULL; -} - -/** - * camel_folder_get_message_info: - * @folder: a CamelFolder - * @uid: the uid of a message - * - * Return value: the summary information for the indicated message - **/ -const CamelMessageInfo * -camel_folder_get_message_info (CamelFolder *folder, const char *uid) -{ - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); - g_return_val_if_fail (uid != NULL, NULL); - - return CF_CLASS (folder)->get_message_info (folder, uid); -} - - -/* TODO: is this function required anyway? */ -gboolean -camel_folder_has_summary_capability (CamelFolder *folder) -{ - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), FALSE); - - return folder->has_summary_capability; -} - - -/* UIDs stuff */ - -static CamelMimeMessage * -get_message (CamelFolder *folder, const gchar *uid, CamelException *ex) -{ - g_warning ("CamelFolder::get_message not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); - return NULL; -} - -/** - * camel_folder_get_message: - * @folder: the folder object - * @uid: the UID - * @ex: a CamelException - * - * Get a message from its UID in the folder. Messages are cached - * within a folder, that is, asking twice for the same UID returns the - * same message object. (FIXME: is this true?) - * - * Return value: Message corresponding to the UID - **/ -CamelMimeMessage * -camel_folder_get_message (CamelFolder *folder, const gchar *uid, - CamelException *ex) -{ - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); - - return CF_CLASS (folder)->get_message (folder, uid, ex); -} - - -static GPtrArray * -get_uids (CamelFolder *folder) -{ - g_warning ("CamelFolder::get_uids not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); - return NULL; -} - -/** - * camel_folder_get_uids: - * @folder: folder object - * - * Get the list of UIDs available in a folder. This routine is useful - * for finding what messages are available when the folder does not - * support summaries. The returned array shoudl not be modified, and - * must be freed by passing it to camel_folder_free_uids(). - * - * Return value: GPtrArray of UIDs corresponding to the messages - * available in the folder. - **/ -GPtrArray * -camel_folder_get_uids (CamelFolder *folder) -{ - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); - - return CF_CLASS (folder)->get_uids (folder); -} - - -static void -free_uids (CamelFolder *folder, GPtrArray *array) -{ - g_warning ("CamelFolder::free_uids not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); -} - -/** - * camel_folder_free_uids: - * @folder: folder object - * @array: the array of uids to free - * - * Frees the array of UIDs returned by camel_folder_get_uids(). - **/ -void -camel_folder_free_uids (CamelFolder *folder, GPtrArray *array) -{ - g_return_if_fail (CAMEL_IS_FOLDER (folder)); - - CF_CLASS (folder)->free_uids (folder, array); -} - - -static GPtrArray * -get_summary (CamelFolder *folder) -{ - g_warning ("CamelFolder::get_summary not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); - return NULL; -} - -/** - * camel_folder_get_summary: - * @folder: a folder object - * - * This returns the summary information for the folder. This array - * should not be modified, and must be freed with - * camel_folder_free_summary(). - * - * Return value: an array of CamelMessageInfo - **/ -GPtrArray * -camel_folder_get_summary (CamelFolder *folder) -{ - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); - - return CF_CLASS (folder)->get_summary (folder); -} - - -static void -free_summary (CamelFolder *folder, GPtrArray *array) -{ - g_warning ("CamelFolder::free_summary not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); -} - -/** - * camel_folder_free_summary: - * @folder: folder object - * @array: the summary array to free - * - * Frees the summary array returned by camel_folder_get_summary(). - **/ -void camel_folder_free_summary(CamelFolder * folder, GPtrArray * array) -{ - g_return_if_fail(CAMEL_IS_FOLDER(folder)); - - CF_CLASS(folder)->free_summary(folder, array); -} - -/** - * camel_folder_has_search_capability: - * @folder: Folder object - * - * Checks if a folder supports searching. - * - * Return value: %TRUE if the folder supports searching - **/ -gboolean -camel_folder_has_search_capability (CamelFolder *folder) -{ - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), FALSE); - - return folder->has_search_capability; -} - -static GPtrArray * -search_by_expression (CamelFolder *folder, const char *expression, - CamelException *ex) -{ - g_warning ("CamelFolder::search_by_expression not implemented for " - "`%s'", camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); - return NULL; -} - -/** - * camel_folder_search_by_expression: - * @folder: Folder object - * @expression: a search expression - * @ex: a CamelException - * - * Searches the folder for messages matching the given search expression. - * - * Return value: a list of uids of matching messages. The caller must - * free the list and each of the elements when it is done. - **/ -GPtrArray * -camel_folder_search_by_expression (CamelFolder *folder, const char *expression, - CamelException *ex) -{ - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); - g_return_val_if_fail (folder->has_search_capability, NULL); - - return CF_CLASS (folder)->search_by_expression (folder, expression, ex); -} - -static void -search_free (CamelFolder *folder, GPtrArray *result) -{ - int i; - - for (i = 0; i < result->len; i++) - g_free (g_ptr_array_index (result, i)); - g_ptr_array_free (result, TRUE); -} - -/** - * camel_folder_search_free: - * @folder: - * @result: - * - * Free the result of a search. - **/ -void -camel_folder_search_free (CamelFolder *folder, GPtrArray *result) -{ - g_return_if_fail (CAMEL_IS_FOLDER (folder)); - g_return_if_fail (folder->has_search_capability); - - return CF_CLASS (folder)->search_free (folder, result); -} - - -static void -copy_message_to (CamelFolder *source, const char *uid, CamelFolder *dest, - CamelException *ex) -{ - CamelMimeMessage *msg; - const CamelMessageInfo *info; - - /* Default implementation. */ - - msg = camel_folder_get_message (source, uid, ex); - if (!msg) - return; - info = camel_folder_get_message_info (source, uid); - camel_folder_append_message (dest, msg, info, ex); - camel_object_unref (CAMEL_OBJECT (msg)); -} - -/** - * camel_folder_copy_message_to: - * @source: source folder - * @uid: UID of message in @source - * @dest: destination folder - * @ex: a CamelException - * - * This copies a message from one folder to another. If the @source and - * @dest folders have the same parent_store, this may be more efficient - * than a camel_folder_append_message(). - **/ -void -camel_folder_copy_message_to (CamelFolder *source, const char *uid, - CamelFolder *dest, CamelException *ex) -{ - g_return_if_fail (CAMEL_IS_FOLDER (source)); - g_return_if_fail (CAMEL_IS_FOLDER (dest)); - g_return_if_fail (uid != NULL); - - if (source->parent_store == dest->parent_store) { - return CF_CLASS (source)->copy_message_to (source, uid, - dest, ex); - } else - return copy_message_to (source, uid, dest, ex); -} - - -static void -move_message_to (CamelFolder *source, const char *uid, - CamelFolder *dest, CamelException *ex) -{ - CamelMimeMessage *msg; - const CamelMessageInfo *info; - - /* Default implementation. */ - - msg = camel_folder_get_message (source, uid, ex); - if (!msg) - return; - info = camel_folder_get_message_info (source, uid); - camel_folder_append_message (dest, msg, info, ex); - camel_object_unref (CAMEL_OBJECT (msg)); - if (camel_exception_is_set(ex)) - return; - camel_folder_delete_message (source, uid); -} - -/** - * camel_folder_move_message_to: - * @source: source folder - * @uid: UID of message in @source - * @dest: destination folder - * @ex: a CamelException - * - * This moves a message from one folder to another. If the @source and - * @dest folders have the same parent_store, this may be more efficient - * than a camel_folder_append_message() followed by - * camel_folder_delete_message(). - **/ -void -camel_folder_move_message_to (CamelFolder *source, const char *uid, - CamelFolder *dest, CamelException *ex) -{ - g_return_if_fail (CAMEL_IS_FOLDER (source)); - g_return_if_fail (CAMEL_IS_FOLDER (dest)); - g_return_if_fail (uid != NULL); - - if (source->parent_store == dest->parent_store) { - return CF_CLASS (source)->move_message_to (source, uid, - dest, ex); - } else - return move_message_to (source, uid, dest, ex); -} - -static void -freeze (CamelFolder *folder) -{ - folder->frozen++; -} - -/** - * camel_folder_freeze: - * @folder: a folder - * - * Freezes the folder so that a series of operation can be performed - * without "message_changed" and "folder_changed" signals being emitted. - * When the folder is later thawed with camel_folder_thaw(), the - * suppressed signals will be emitted. - **/ -void -camel_folder_freeze (CamelFolder * folder) -{ - g_return_if_fail (CAMEL_IS_FOLDER (folder)); - - CF_CLASS (folder)->freeze (folder); -} - -static void -thaw (CamelFolder * folder) -{ - int i; - CamelFolderChangeInfo *info; - - folder->frozen--; - if (folder->frozen != 0) - return; - - /* If we have more or less messages, do a folder changed, otherwise just - do a message changed for each one. - TODO: message_changed is now probably irrelevant and not required */ - info = folder->changed_frozen; - if (info->uid_added->len > 0 || info->uid_removed->len > 0) { - camel_object_trigger_event(CAMEL_OBJECT(folder), "folder_changed", info); - } else if (info->uid_changed->len > 0) { - for (i=0;i<info->uid_changed->len;i++) { - camel_object_trigger_event(CAMEL_OBJECT(folder), "message_changed", info->uid_changed->pdata[i]); - } - } - - camel_folder_change_info_clear(info); -} - -/** - * camel_folder_thaw: - * @folder: a folder - * - * Thaws the folder and emits any pending folder_changed or - * message_changed signals. - **/ -void -camel_folder_thaw (CamelFolder *folder) -{ - g_return_if_fail (CAMEL_IS_FOLDER (folder)); - g_return_if_fail (folder->frozen != 0); - - CF_CLASS (folder)->thaw (folder); -} - - -/* Event hooks that block emission when frozen */ -static gboolean -folder_changed (CamelObject *obj, gpointer event_data) -{ - CamelFolder *folder = CAMEL_FOLDER (obj); - CamelFolderChangeInfo *changed = event_data; - - if (folder->frozen) { - if (changed != NULL) - camel_folder_change_info_cat(folder->changed_frozen, changed); - else - g_warning("Class %s is passing NULL to folder_changed event", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); - return FALSE; - } - return TRUE; -} - -static gboolean -message_changed (CamelObject *obj, /*const char *uid*/gpointer event_data) -{ - CamelFolder *folder = CAMEL_FOLDER (obj); - - if (folder->frozen) { - camel_folder_change_info_change_uid(folder->changed_frozen, (char *)event_data); - return FALSE; - } - - return TRUE; -} - - -/** - * camel_folder_free_nop: - * @folder: a folder - * @array: an array of uids or CamelMessageInfo - * - * "Frees" the provided array by doing nothing. Used by CamelFolder - * subclasses as an implementation for free_uids, or free_summary when - * the returned array is "static" information and should not be freed. - **/ -void -camel_folder_free_nop (CamelFolder *folder, GPtrArray *array) -{ - ; -} - -/** - * camel_folder_free_shallow: - * @folder: a folder - * @array: an array of uids or CamelMessageInfo - * - * Frees the provided array but not its contents. Used by CamelFolder - * subclasses as an implementation for free_uids or free_summary when - * the returned array needs to be freed but its contents come from - * "static" information. - **/ -void -camel_folder_free_shallow (CamelFolder *folder, GPtrArray *array) -{ - g_ptr_array_free (array, TRUE); -} - -/** - * camel_folder_free_deep: - * @folder: a folder - * @array: an array of uids - * - * Frees the provided array and its contents. Used by CamelFolder - * subclasses as an implementation for free_uids when the provided - * information was created explicitly by the corresponding get_ call. - **/ -void -camel_folder_free_deep (CamelFolder *folder, GPtrArray *array) -{ - int i; - - for (i = 0; i < array->len; i++) - g_free (array->pdata[i]); - g_ptr_array_free (array, TRUE); -} - -/** - * camel_folder_change_info_new: - * @void: - * - * Create a new folder change info structure. - * - * Return value: - **/ -CamelFolderChangeInfo * -camel_folder_change_info_new(void) -{ - CamelFolderChangeInfo *info; - - info = g_malloc(sizeof(*info)); - info->uid_added = g_ptr_array_new(); - info->uid_removed = g_ptr_array_new(); - info->uid_changed = g_ptr_array_new(); - info->uid_source = NULL; - - return info; -} - -/** - * camel_folder_change_info_add_source: - * @info: - * @uid: - * - * Add a source uid for generating a changeset. - **/ -void -camel_folder_change_info_add_source(CamelFolderChangeInfo *info, const char *uid) -{ - if (info->uid_source == NULL) - info->uid_source = g_hash_table_new(g_str_hash, g_str_equal); - - if (g_hash_table_lookup(info->uid_source, uid) == NULL) - g_hash_table_insert(info->uid_source, g_strdup(uid), (void *)1); -} - -/** - * camel_folder_change_info_add_source_list: - * @info: - * @list: - * - * Add a list of source uid's for generating a changeset. - **/ -void -camel_folder_change_info_add_source_list(CamelFolderChangeInfo *info, const GPtrArray *list) -{ - int i; - - if (info->uid_source == NULL) - info->uid_source = g_hash_table_new(g_str_hash, g_str_equal); - - for (i=0;i<list->len;i++) { - char *uid = list->pdata[i]; - - if (g_hash_table_lookup(info->uid_source, uid) == NULL) - g_hash_table_insert(info->uid_source, g_strdup(uid), (void *)1); - } -} - -/** - * camel_folder_change_info_add_update: - * @info: - * @uid: - * - * Add a uid from the updated list, used to generate a changeset diff. - **/ -void -camel_folder_change_info_add_update(CamelFolderChangeInfo *info, const char *uid) -{ - char *key; - int value; - - if (info->uid_source == NULL) { - camel_folder_change_info_add_uid(info, uid); - return; - } - - if (g_hash_table_lookup_extended(info->uid_source, uid, (void **)&key, (void **)&value)) { - g_hash_table_remove(info->uid_source, key); - g_free(key); - } else { - camel_folder_change_info_add_uid(info, uid); - } -} - -/** - * camel_folder_change_info_add_update_list: - * @info: - * @list: - * - * Add a list of uid's from the updated list. - **/ -void -camel_folder_change_info_add_update_list(CamelFolderChangeInfo *info, const GPtrArray *list) -{ - int i; - - for (i=0;i<list->len;i++) { - camel_folder_change_info_add_update(info, list->pdata[i]); - } -} - -static void -change_info_remove(char *key, void *value, CamelFolderChangeInfo *info) -{ - camel_folder_change_info_remove_uid(info, key); - g_free(key); -} - -static void -change_info_free_update(char *key, void *value, CamelFolderChangeInfo *info) -{ - g_free(key); -} - -/** - * camel_folder_change_info_build_diff: - * @info: - * - * Compare the source uid set to the updated uid set and generate the differences - * into the added and removed lists. - **/ -void -camel_folder_change_info_build_diff(CamelFolderChangeInfo *info) -{ - if (info->uid_source) { - g_hash_table_foreach(info->uid_source, (GHFunc)change_info_remove, info); - g_hash_table_destroy(info->uid_source); - info->uid_source = NULL; - } -} - -static void -change_info_add_uid(CamelFolderChangeInfo *info, GPtrArray *uids, const char *uid) -{ - int i; - - /* TODO: Check that it is in the other arrays and remove it from them/etc? */ - for (i=0;i<uids->len;i++) { - if (!strcmp(uids->pdata[i], uid)) - return; - } - g_ptr_array_add(uids, g_strdup(uid)); -} - -static void -change_info_cat(CamelFolderChangeInfo *info, GPtrArray *uids, GPtrArray *source) -{ - int i; - - for (i=0;i<source->len;i++) { - change_info_add_uid(info, uids, source->pdata[i]); - } -} - -/** - * camel_folder_change_info_cat: - * @info: - * @source: - * - * Concatenate one change info onto antoher. Can be used to copy - * them too. - **/ -void -camel_folder_change_info_cat(CamelFolderChangeInfo *info, CamelFolderChangeInfo *source) -{ - change_info_cat(info, info->uid_added, source->uid_added); - change_info_cat(info, info->uid_removed, source->uid_removed); - change_info_cat(info, info->uid_changed, source->uid_changed); -} - -/** - * camel_folder_change_info_add_uid: - * @info: - * @uid: - * - * Add a new uid to the changeinfo. - **/ -void -camel_folder_change_info_add_uid(CamelFolderChangeInfo *info, const char *uid) -{ - change_info_add_uid(info, info->uid_added, uid); -} - -/** - * camel_folder_change_info_remove_uid: - * @info: - * @uid: - * - * Add a uid to the removed uid list. - **/ -void -camel_folder_change_info_remove_uid(CamelFolderChangeInfo *info, const char *uid) -{ - change_info_add_uid(info, info->uid_removed, uid); -} - -/** - * camel_folder_change_info_change_uid: - * @info: - * @uid: - * - * Add a uid to the changed uid list. - **/ -void -camel_folder_change_info_change_uid(CamelFolderChangeInfo *info, const char *uid) -{ - change_info_add_uid(info, info->uid_changed, uid); -} - -static void -change_info_clear(GPtrArray *uids) -{ - int i; - - for (i=0;i<uids->len;i++) { - g_free(uids->pdata[i]); - } - g_ptr_array_set_size(uids, 0); -} - -/** - * camel_folder_change_info_clear: - * @info: - * - * Empty out the change info; called after changes have been processed. - **/ -void -camel_folder_change_info_clear(CamelFolderChangeInfo *info) -{ - change_info_clear(info->uid_added); - change_info_clear(info->uid_removed); - change_info_clear(info->uid_changed); -} - -/** - * camel_folder_change_info_free: - * @info: - * - * Free memory associated with the folder change info lists. - **/ -void -camel_folder_change_info_free(CamelFolderChangeInfo *info) -{ - if (info->uid_source) { - g_hash_table_foreach(info->uid_source, (GHFunc)change_info_free_update, info); - g_hash_table_destroy(info->uid_source); - } - - camel_folder_change_info_clear(info); - - g_ptr_array_free(info->uid_added, TRUE); - g_ptr_array_free(info->uid_removed, TRUE); - g_ptr_array_free(info->uid_changed, TRUE); - g_free(info); -} - - - diff --git a/camel/camel-folder.h b/camel/camel-folder.h deleted file mode 100644 index 12fe86f4b8..0000000000 --- a/camel/camel-folder.h +++ /dev/null @@ -1,297 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-folder.h: Abstract class for an email folder */ - -/* - * Author: - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_FOLDER_H -#define CAMEL_FOLDER_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-object.h> -#include <camel/camel-folder-summary.h> - -#define CAMEL_FOLDER_TYPE (camel_folder_get_type ()) -#define CAMEL_FOLDER(obj) (CAMEL_CHECK_CAST((obj), CAMEL_FOLDER_TYPE, CamelFolder)) -#define CAMEL_FOLDER_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_FOLDER_TYPE, CamelFolderClass)) -#define CAMEL_IS_FOLDER(o) (CAMEL_CHECK_TYPE((o), CAMEL_FOLDER_TYPE)) - -typedef struct _CamelFolderChangeInfo CamelFolderChangeInfo; - -struct _CamelFolderChangeInfo { - GPtrArray *uid_added; - GPtrArray *uid_removed; - GPtrArray *uid_changed; - - GHashTable *uid_source; /* used to create unique lists */ -}; - -struct _CamelFolder -{ - CamelObject parent_object; - - int frozen; - CamelFolderChangeInfo *changed_frozen; /* queues changed events */ - - char *name; - char *full_name; - CamelStore *parent_store; - - guint32 permanent_flags; - gboolean has_summary_capability:1; - gboolean has_search_capability:1; -}; - -typedef struct { - CamelObjectClass parent_class; - - /* Virtual methods */ - void (*refresh_info) (CamelFolder *folder, CamelException *ex); - - void (*sync) (CamelFolder *folder, gboolean expunge, - CamelException *ex); - - const char * (*get_name) (CamelFolder *folder); - const char * (*get_full_name) (CamelFolder *folder); - - CamelStore * (*get_parent_store) (CamelFolder *folder); - - void (*expunge) (CamelFolder *folder, - CamelException *ex); - - int (*get_message_count) (CamelFolder *folder); - - int (*get_unread_message_count) (CamelFolder *folder); - - void (*append_message) (CamelFolder *folder, - CamelMimeMessage *message, - const CamelMessageInfo *info, - CamelException *ex); - - guint32 (*get_permanent_flags) (CamelFolder *folder); - guint32 (*get_message_flags) (CamelFolder *folder, - const char *uid); - void (*set_message_flags) (CamelFolder *folder, - const char *uid, - guint32 flags, guint32 set); - - gboolean (*get_message_user_flag) (CamelFolder *folder, - const char *uid, - const char *name); - void (*set_message_user_flag) (CamelFolder *folder, - const char *uid, - const char *name, - gboolean value); - - const char * (*get_message_user_tag) (CamelFolder *folder, - const char *uid, - const char *name); - void (*set_message_user_tag) (CamelFolder *folder, - const char *uid, - const char *name, - const char *value); - - CamelMimeMessage * (*get_message) (CamelFolder *folder, - const char *uid, - CamelException *ex); - - GPtrArray * (*get_uids) (CamelFolder *folder); - void (*free_uids) (CamelFolder *folder, - GPtrArray *array); - - GPtrArray * (*get_summary) (CamelFolder *folder); - void (*free_summary) (CamelFolder *folder, - GPtrArray *summary); - - gboolean (*has_search_capability) (CamelFolder *folder); - - GPtrArray * (*search_by_expression) (CamelFolder *folder, - const char *expression, - CamelException *ex); - - void (*search_free) (CamelFolder *folder, GPtrArray *result); - - const CamelMessageInfo * (*get_message_info) (CamelFolder *, const char *uid); - - void (*copy_message_to) (CamelFolder *source, - const char *uid, - CamelFolder *destination, - CamelException *ex); - - void (*move_message_to) (CamelFolder *source, - const char *uid, - CamelFolder *destination, - CamelException *ex); - - void (*freeze) (CamelFolder *folder); - void (*thaw) (CamelFolder *folder); -} CamelFolderClass; - -/* Standard Camel function */ -CamelType camel_folder_get_type (void); - - -/* public methods */ -void camel_folder_construct (CamelFolder *folder, - CamelStore *parent_store, - const char *full_name, - const char *name); - -void camel_folder_refresh_info (CamelFolder * folder, - CamelException * ex); -void camel_folder_sync (CamelFolder *folder, - gboolean expunge, - CamelException *ex); - -CamelStore * camel_folder_get_parent_store (CamelFolder *folder); - - -/* delete operations */ -void camel_folder_expunge (CamelFolder *folder, - CamelException *ex); - - -/* folder name operations */ -const char * camel_folder_get_name (CamelFolder *folder); -const char * camel_folder_get_full_name (CamelFolder *folder); - - -/* various properties accessors */ -guint32 camel_folder_get_permanent_flags (CamelFolder *folder); - -guint32 camel_folder_get_message_flags (CamelFolder *folder, - const char *uid); - -void camel_folder_set_message_flags (CamelFolder *folder, - const char *uid, - guint32 flags, - guint32 set); - -gboolean camel_folder_get_message_user_flag (CamelFolder *folder, - const char *uid, - const char *name); - -void camel_folder_set_message_user_flag (CamelFolder *folder, - const char *uid, - const char *name, - gboolean value); -const char * camel_folder_get_message_user_tag (CamelFolder *folder, - const char *uid, - const char *name); - -void camel_folder_set_message_user_tag (CamelFolder *folder, - const char *uid, - const char *name, - const char *value); - - - -/* message manipulation */ -void camel_folder_append_message (CamelFolder *folder, - CamelMimeMessage *message, - const CamelMessageInfo *info, - CamelException *ex); - - -/* summary related operations */ -gboolean camel_folder_has_summary_capability (CamelFolder *folder); - - -int camel_folder_get_message_count (CamelFolder *folder); - -int camel_folder_get_unread_message_count (CamelFolder *folder); - -GPtrArray * camel_folder_get_summary (CamelFolder *folder); -void camel_folder_free_summary (CamelFolder *folder, - GPtrArray *array); - -/* uid based access operations */ -CamelMimeMessage * camel_folder_get_message (CamelFolder *folder, - const char *uid, - CamelException *ex); -#define camel_folder_delete_message(folder, uid) \ - camel_folder_set_message_flags (folder, uid, CAMEL_MESSAGE_DELETED, CAMEL_MESSAGE_DELETED) - -GPtrArray * camel_folder_get_uids (CamelFolder *folder); -void camel_folder_free_uids (CamelFolder *folder, - GPtrArray *array); - -/* search api */ -gboolean camel_folder_has_search_capability (CamelFolder *folder); -GPtrArray * camel_folder_search_by_expression (CamelFolder *folder, - const char *expression, - CamelException *ex); -void camel_folder_search_free (CamelFolder *folder, GPtrArray *); - -/* summary info */ -const CamelMessageInfo *camel_folder_get_message_info (CamelFolder *summary, - const char *uid); - -void camel_folder_copy_message_to (CamelFolder *source, - const char *uid, - CamelFolder *dest, - CamelException *ex); - -void camel_folder_move_message_to (CamelFolder *source, - const char *uid, - CamelFolder *dest, - CamelException *ex); - -void camel_folder_freeze (CamelFolder *folder); -void camel_folder_thaw (CamelFolder *folder); - - -/* For use by subclasses (for free_{uids,summary,subfolder_names}) */ -void camel_folder_free_nop (CamelFolder *folder, GPtrArray *array); -void camel_folder_free_shallow (CamelFolder *folder, GPtrArray *array); -void camel_folder_free_deep (CamelFolder *folder, GPtrArray *array); - -/* update functions for change info */ -CamelFolderChangeInfo * camel_folder_change_info_new (void); -void camel_folder_change_info_clear (CamelFolderChangeInfo *info); -void camel_folder_change_info_free (CamelFolderChangeInfo *info); - -/* for building diff's automatically */ -void camel_folder_change_info_add_source (CamelFolderChangeInfo *info, const char *uid); -void camel_folder_change_info_add_source_list(CamelFolderChangeInfo *info, const GPtrArray *list); -void camel_folder_change_info_add_update (CamelFolderChangeInfo *info, const char *uid); -void camel_folder_change_info_add_update_list(CamelFolderChangeInfo *info, const GPtrArray *list); -void camel_folder_change_info_build_diff (CamelFolderChangeInfo *info); - -/* for manipulating diff's directly */ -void camel_folder_change_info_cat (CamelFolderChangeInfo *info, CamelFolderChangeInfo *s); -void camel_folder_change_info_add_uid (CamelFolderChangeInfo *info, const char *uid); -void camel_folder_change_info_remove_uid (CamelFolderChangeInfo *info, const char *uid); -void camel_folder_change_info_change_uid (CamelFolderChangeInfo *info, const char *uid); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_FOLDER_H */ - diff --git a/camel/camel-internet-address.c b/camel/camel-internet-address.c deleted file mode 100644 index 878ff1ca7b..0000000000 --- a/camel/camel-internet-address.c +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "camel-mime-utils.h" -#include "camel-internet-address.h" - -static int internet_decode (CamelAddress *, const char *raw); -static char * internet_encode (CamelAddress *); -static void internet_remove (CamelAddress *, int index); - -static void camel_internet_address_class_init (CamelInternetAddressClass *klass); -static void camel_internet_address_init (CamelInternetAddress *obj); - -static CamelAddressClass *camel_internet_address_parent; - -struct _address { - char *name; - char *address; -}; - -static void -camel_internet_address_class_init(CamelInternetAddressClass *klass) -{ - CamelAddressClass *address = (CamelAddressClass *) klass; - - camel_internet_address_parent = CAMEL_ADDRESS_CLASS(camel_type_get_global_classfuncs(camel_address_get_type())); - - address->decode = internet_decode; - address->encode = internet_encode; - address->remove = internet_remove; -} - -static void -camel_internet_address_init(CamelInternetAddress *obj) -{ -} - -CamelType -camel_internet_address_get_type(void) -{ - static CamelType type = CAMEL_INVALID_TYPE; - - if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register(camel_address_get_type(), "CamelInternetAddress", - sizeof (CamelInternetAddress), - sizeof (CamelInternetAddressClass), - (CamelObjectClassInitFunc) camel_internet_address_class_init, - NULL, - (CamelObjectInitFunc) camel_internet_address_init, - NULL); - } - - return type; -} - -static int -internet_decode (CamelAddress *a, const char *raw) -{ - struct _header_address *ha, *n; - - /* Should probably use its own decoder or something */ - ha = header_address_decode(raw); - if (ha) { - n = ha; - while (n) { - if (n->type == HEADER_ADDRESS_NAME) { - camel_internet_address_add((CamelInternetAddress *)a, n->name, n->v.addr); - } else if (n->type == HEADER_ADDRESS_GROUP) { - struct _header_address *g = n->v.members; - while (g) { - if (g->type == HEADER_ADDRESS_NAME) - camel_internet_address_add((CamelInternetAddress *)a, g->name, g->v.addr); - /* otherwise, it's an error, infact */ - g = g->next; - } - } - n = n->next; - } - header_address_list_clear(&ha); - } - - return 0; -} - -static char * -internet_encode (CamelAddress *a) -{ - int i; - GString *out; - char *ret; - - if (a->addresses->len == 0) - return NULL; - - out = g_string_new(""); - - for (i = 0;i < a->addresses->len; i++) { - struct _address *addr = g_ptr_array_index(a->addresses, i); - char *name = header_encode_phrase(addr->name); - - if (i != 0) - g_string_append(out, ", "); - - if (name) { - if (*name) { - g_string_sprintfa(out, "%s <%s>", name, addr->address); - } else if (addr->address) - g_string_sprintfa(out, "%s", addr->address); - g_free(name); - } else - g_string_sprintfa(out, "%s", addr->address); - } - - ret = out->str; - g_string_free(out, FALSE); - - return ret; -} - -static void -internet_remove (CamelAddress *a, int index) -{ - struct _address *addr; - - if (index < 0 || index >= a->addresses->len) - return; - - addr = g_ptr_array_index(a->addresses, index); - g_free(addr->name); - g_free(addr->address); - g_free(addr); - g_ptr_array_remove_index(a->addresses, index); -} - -/** - * camel_internet_address_new: - * - * Create a new CamelInternetAddress object. - * - * Return value: A new CamelInternetAddress object. - **/ -CamelInternetAddress * -camel_internet_address_new (void) -{ - CamelInternetAddress *new = CAMEL_INTERNET_ADDRESS(camel_object_new(camel_internet_address_get_type())); - return new; -} - -/** - * camel_internet_address_add: - * @a: internet address object - * @name: - * @address: - * - * Add a new internet address to the address object. - * - * Return value: Index of added entry. - **/ -int -camel_internet_address_add (CamelInternetAddress *a, const char *name, const char *address) -{ - struct _address *new; - int index; - - g_assert(IS_CAMEL_INTERNET_ADDRESS(a)); - - new = g_malloc(sizeof(*new)); - new->name = g_strdup(name); - new->address = g_strdup(address); - index = ((CamelAddress *)a)->addresses->len; - g_ptr_array_add(((CamelAddress *)a)->addresses, new); - - return index; -} - -/** - * camel_internet_address_get: - * @a: internet address object - * @index: address's array index - * @namep: Holder for the returned name, or NULL, if not required. - * @addressp: Holder for the returned address, or NULL, if not required. - * - * Get the address at @index. - * - * Return value: TRUE if such an address exists, or FALSE otherwise. - **/ -gboolean -camel_internet_address_get (const CamelInternetAddress *a, int index, const char **namep, const char **addressp) -{ - struct _address *addr; - - g_assert(IS_CAMEL_INTERNET_ADDRESS(a)); - g_return_val_if_fail(index >= 0, -1); - - if (index >= ((CamelAddress *)a)->addresses->len) - return FALSE; - - addr = g_ptr_array_index( ((CamelAddress *)a)->addresses, index); - if (namep) - *namep = addr->name; - if (addressp) - *addressp = addr->address; - return TRUE; -} - -/** - * camel_internet_address_find_name: - * @a: - * @name: - * @addressp: Holder for address part, or NULL, if not required. - * - * Find address by real name. - * - * Return value: The index of the address matching the name, or -1 - * if no match was found. - **/ -int -camel_internet_address_find_name(CamelInternetAddress *a, const char *name, const char **addressp) -{ - struct _address *addr; - int i, len; - - g_assert(IS_CAMEL_INTERNET_ADDRESS(a)); - - len = ((CamelAddress *)a)->addresses->len; - for (i=0;i<len;i++) { - addr = g_ptr_array_index( ((CamelAddress *)a)->addresses, i ); - if (!strcmp(addr->name, name)) { - if (addressp) - *addressp = addr->address; - return i; - } - } - return -1; -} - -/** - * camel_internet_address_find_address: - * @a: - * @address: - * @namep: Return for the matching name, or NULL, if not required. - * - * Find an address by address. - * - * Return value: The index of the address, or -1 if not found. - **/ -int -camel_internet_address_find_address(CamelInternetAddress *a, const char *address, const char **namep) -{ - struct _address *addr; - int i, len; - - g_assert(IS_CAMEL_INTERNET_ADDRESS(a)); - - len = ((CamelAddress *)a)->addresses->len; - for (i=0;i<len;i++) { - addr = g_ptr_array_index( ((CamelAddress *)a)->addresses, i ); - if (!strcmp(addr->address, address)) { - if (namep) - *namep = addr->name; - return i; - } - } - return -1; -} diff --git a/camel/camel-internet-address.h b/camel/camel-internet-address.h deleted file mode 100644 index 6b303eef8f..0000000000 --- a/camel/camel-internet-address.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef _CAMEL_INTERNET_ADDRESS_H -#define _CAMEL_INTERNET_ADDRESS_H - -#include <camel/camel-address.h> - -#define CAMEL_INTERNET_ADDRESS(obj) CAMEL_CHECK_CAST (obj, camel_internet_address_get_type (), CamelInternetAddress) -#define CAMEL_INTERNET_ADDRESS_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_internet_address_get_type (), CamelInternetAddressClass) -#define IS_CAMEL_INTERNET_ADDRESS(obj) CAMEL_CHECK_TYPE (obj, camel_internet_address_get_type ()) - -typedef struct _CamelInternetAddressClass CamelInternetAddressClass; - -struct _CamelInternetAddress { - CamelAddress parent; - - struct _CamelInternetAddressPrivate *priv; -}; - -struct _CamelInternetAddressClass { - CamelAddressClass parent_class; -}; - -guint camel_internet_address_get_type (void); -CamelInternetAddress *camel_internet_address_new (void); - -int camel_internet_address_add (CamelInternetAddress *, const char *, const char *); -gboolean camel_internet_address_get (const CamelInternetAddress *, int, const char **, const char **); - -int camel_internet_address_find_name(CamelInternetAddress *, const char *, const char **); -int camel_internet_address_find_address(CamelInternetAddress *, const char *, const char **); - -#endif /* ! _CAMEL_INTERNET_ADDRESS_H */ diff --git a/camel/camel-medium.c b/camel/camel-medium.c deleted file mode 100644 index 3c5954e40f..0000000000 --- a/camel/camel-medium.c +++ /dev/null @@ -1,266 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* camelMedium.c : Abstract class for a medium - * - * Authors: Bertrand Guiheneuf <bertrand@helixcode.com> - * Michael Zucchi <notzed@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ -#include <config.h> -#include <stdio.h> -#include <ctype.h> -#include "camel-medium.h" -#include "gmime-content-field.h" -#include "string-utils.h" -#include "hash-table-utils.h" - -#define d(x) - -static CamelDataWrapperClass *parent_class = NULL; - -/* Returns the class for a CamelMedium */ -#define CM_CLASS(so) CAMEL_MEDIUM_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - -static void add_header (CamelMedium *medium, const gchar *header_name, - const void *header_value); -static void set_header (CamelMedium *medium, const gchar *header_name, const void *header_value); -static void remove_header (CamelMedium *medium, const gchar *header_name); -static const void *get_header (CamelMedium *medium, const gchar *header_name); - -static CamelDataWrapper *get_content_object (CamelMedium *medium); -static void set_content_object (CamelMedium *medium, - CamelDataWrapper *content); - -static void -camel_medium_class_init (CamelMediumClass *camel_medium_class) -{ - /* - * CamelDataWrapperClass *camel_data_wrapper_class = - * CAMEL_DATA_WRAPPER_CLASS (camel_medium_class); - */ - - parent_class = CAMEL_DATA_WRAPPER_CLASS (camel_type_get_global_classfuncs (camel_data_wrapper_get_type ())); - - /* virtual method definition */ - camel_medium_class->add_header = add_header; - camel_medium_class->set_header = set_header; - camel_medium_class->remove_header = remove_header; - camel_medium_class->get_header = get_header; - - camel_medium_class->set_content_object = set_content_object; - camel_medium_class->get_content_object = get_content_object; -} - -static void -camel_medium_init (gpointer object, gpointer klass) -{ - CamelMedium *camel_medium = CAMEL_MEDIUM (object); - - camel_medium->content = NULL; -} - -static void -camel_medium_finalize (CamelObject *object) -{ - CamelMedium *medium = CAMEL_MEDIUM (object); - - if (medium->content) - camel_object_unref (CAMEL_OBJECT (medium->content)); -} - - -CamelType -camel_medium_get_type (void) -{ - static CamelType camel_medium_type = CAMEL_INVALID_TYPE; - - if (camel_medium_type == CAMEL_INVALID_TYPE) { - camel_medium_type = camel_type_register (CAMEL_DATA_WRAPPER_TYPE, "medium", - sizeof (CamelMedium), - sizeof (CamelMediumClass), - (CamelObjectClassInitFunc) camel_medium_class_init, - NULL, - (CamelObjectInitFunc) camel_medium_init, - (CamelObjectFinalizeFunc) camel_medium_finalize); - } - - return camel_medium_type; -} - -static void -add_header (CamelMedium *medium, const gchar *header_name, - const void *header_value) -{ - g_warning("No %s::add_header implemented, adding %s", camel_type_to_name(CAMEL_OBJECT_GET_TYPE(medium)), header_name); -} - -/** - * camel_medium_add_header: - * @medium: a CamelMedium - * @header_name: name of the header - * @header_value: value of the header - * - * Adds a header to a medium. - * - * FIXME: Where does it add it? We need to be able to prepend and - * append headers, and also be able to insert them relative to other - * headers. No we dont, order isn't important! Z - **/ -void -camel_medium_add_header (CamelMedium *medium, const gchar *header_name, - const void *header_value) -{ - g_return_if_fail (CAMEL_IS_MEDIUM (medium)); - g_return_if_fail (header_name != NULL); - g_return_if_fail (header_value != NULL); - - CM_CLASS (medium)->add_header (medium, header_name, header_value); -} - -static void -set_header (CamelMedium *medium, const gchar *header_name, const void *header_value) -{ - g_warning("No %s::set_header implemented, setting %s", camel_type_to_name(CAMEL_OBJECT_GET_TYPE(medium)), header_name); -} - -/** - * camel_medium_set_header: - * @medium: a CamelMedium - * @header_name: name of the header - * @header_value: value of the header - * - * Sets the value of a header. Any other occurances of the header - * will be removed. - **/ -void -camel_medium_set_header (CamelMedium *medium, const gchar *header_name, const void *header_value) -{ - g_return_if_fail (CAMEL_IS_MEDIUM (medium)); - g_return_if_fail (header_name != NULL); - g_return_if_fail (header_value != NULL); - - CM_CLASS (medium)->add_header (medium, header_name, header_value); -} - -static void -remove_header (CamelMedium *medium, const gchar *header_name) -{ - g_warning("No %s::remove_header implemented, removing %s", camel_type_to_name(CAMEL_OBJECT_GET_TYPE(medium)), header_name); -} - -/** - * camel_medium_remove_header: - * @medium: a medium - * @header_name: the name of the header - * - * Removes the named header from the medium. All occurances of the - * header are removed. - **/ -void -camel_medium_remove_header (CamelMedium *medium, const gchar *header_name) -{ - g_return_if_fail (CAMEL_IS_MEDIUM (medium)); - g_return_if_fail (header_name != NULL); - - CM_CLASS (medium)->remove_header (medium, header_name); -} - - -static const void * -get_header (CamelMedium *medium, const gchar *header_name) -{ - g_warning("No %s::get_header implemented, getting %s", camel_type_to_name(CAMEL_OBJECT_GET_TYPE(medium)), header_name); - return NULL; -} - -/** - * camel_medium_get_header: - * @medium: a medium - * @header_name: the name of the header - * - * Returns the value of the named header in the medium, or %NULL if - * it is unset. The caller should not modify or free the data. - * - * FIXME: What if the header occurs more than once? - * - * Return value: the value of the named header, or %NULL - **/ -const void * -camel_medium_get_header (CamelMedium *medium, const gchar *header_name) -{ - g_return_val_if_fail (CAMEL_IS_MEDIUM (medium), NULL); - g_return_val_if_fail (header_name != NULL, NULL); - -#ifndef NO_WARNINGS -#warning No way to get multi-valued headers? -#endif - - return CM_CLASS (medium)->get_header (medium, header_name); -} - - -static CamelDataWrapper * -get_content_object (CamelMedium *medium) -{ - return medium->content; -} - -/** - * camel_medium_get_content_object: - * @medium: a medium - * - * Returns a data wrapper that represents the content of the medium, - * without its headers. - * - * Return value: the medium's content object. - **/ -CamelDataWrapper * -camel_medium_get_content_object (CamelMedium *medium) -{ - g_return_val_if_fail (CAMEL_IS_MEDIUM (medium), NULL); - - return CM_CLASS (medium)->get_content_object (medium); -} - - -static void -set_content_object (CamelMedium *medium, CamelDataWrapper *content) -{ - if (medium->content) - camel_object_unref (CAMEL_OBJECT (medium->content)); - camel_object_ref (CAMEL_OBJECT (content)); - medium->content = content; -} - -/** - * camel_medium_set_content_object: - * @medium: a medium - * @content: a data wrapper representing the medium's content - * - * Sets the content of @medium to be @content. - **/ -void -camel_medium_set_content_object (CamelMedium *medium, - CamelDataWrapper *content) -{ - g_return_if_fail (CAMEL_IS_MEDIUM (medium)); - g_return_if_fail (CAMEL_IS_DATA_WRAPPER (content)); - - CM_CLASS (medium)->set_content_object (medium, content); -} diff --git a/camel/camel-medium.h b/camel/camel-medium.h deleted file mode 100644 index 9ce548ba1d..0000000000 --- a/camel/camel-medium.h +++ /dev/null @@ -1,92 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-medium.h : class for a medium object */ - -/* - * - * Authors: Bertrand Guiheneuf <bertrand@helixcode.com> - * Michael Zucchi <notzed@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_MEDIUM_H -#define CAMEL_MEDIUM_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-data-wrapper.h> - -#define CAMEL_MEDIUM_TYPE (camel_medium_get_type ()) -#define CAMEL_MEDIUM(obj) (CAMEL_CHECK_CAST((obj), CAMEL_MEDIUM_TYPE, CamelMedium)) -#define CAMEL_MEDIUM_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_MEDIUM_TYPE, CamelMediumClass)) -#define CAMEL_IS_MEDIUM(o) (CAMEL_CHECK_TYPE((o), CAMEL_MEDIUM_TYPE)) - - -struct _CamelMedium -{ - CamelDataWrapper parent_object; - - /* The content of the medium, as opposed to our parent - * CamelDataWrapper, which wraps both the headers and the - * content. - */ - CamelDataWrapper *content; - -}; - - - -typedef struct { - CamelDataWrapperClass parent_class; - - /* Virtual methods */ - void (*add_header) (CamelMedium *medium, const gchar *header_name, const void *header_value); - void (*set_header) (CamelMedium *medium, const gchar *header_name, const void *header_value); - void (*remove_header) (CamelMedium *medium, const gchar *header_name); - const void * (*get_header) (CamelMedium *medium, const gchar *header_name); - - CamelDataWrapper * (*get_content_object) (CamelMedium *medium); - void (*set_content_object) (CamelMedium *medium, CamelDataWrapper *content); - -} CamelMediumClass; - -/* Standard Camel function */ -CamelType camel_medium_get_type (void); - -/* Header get/set interface */ -void camel_medium_add_header (CamelMedium *medium, const gchar *header_name, const void *header_value); -void camel_medium_set_header (CamelMedium *medium, const gchar *header_name, const void *header_value); -void camel_medium_remove_header (CamelMedium *medium, const gchar *header_name); -const void *camel_medium_get_header (CamelMedium *medium, const gchar *header_name); - -/* accessor methods */ -CamelDataWrapper *camel_medium_get_content_object (CamelMedium *medium); -void camel_medium_set_content_object (CamelMedium *medium, - CamelDataWrapper *content); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MEDIUM_H */ - diff --git a/camel/camel-mime-filter-basic.c b/camel/camel-mime-filter-basic.c deleted file mode 100644 index 8dd94e1580..0000000000 --- a/camel/camel-mime-filter-basic.c +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "camel-mime-filter-basic.h" - -#include "camel-mime-utils.h" - -static void reset(CamelMimeFilter *mf); -static void complete(CamelMimeFilter *mf, char *in, size_t len, - size_t prespace, char **out, - size_t *outlen, size_t *outprespace); -static void filter(CamelMimeFilter *mf, char *in, size_t len, - size_t prespace, char **out, - size_t *outlen, size_t *outprespace); - -static void camel_mime_filter_basic_class_init (CamelMimeFilterBasicClass *klass); -static void camel_mime_filter_basic_init (CamelMimeFilterBasic *obj); - -static CamelMimeFilterClass *camel_mime_filter_basic_parent; - -static void -camel_mime_filter_basic_class_init (CamelMimeFilterBasicClass *klass) -{ - CamelMimeFilterClass *filter_class = (CamelMimeFilterClass *) klass; - - camel_mime_filter_basic_parent = CAMEL_MIME_FILTER_CLASS(camel_type_get_global_classfuncs (camel_mime_filter_get_type ())); - - filter_class->reset = reset; - filter_class->filter = filter; - filter_class->complete = complete; -} - -static void -camel_mime_filter_basic_init (CamelMimeFilterBasic *obj) -{ - obj->state = 0; - obj->save = 0; -} - - -CamelType -camel_mime_filter_basic_get_type (void) -{ - static CamelType type = CAMEL_INVALID_TYPE; - - if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register (camel_mime_filter_get_type (), "CamelMimeFilterBasic", - sizeof (CamelMimeFilterBasic), - sizeof (CamelMimeFilterBasicClass), - (CamelObjectClassInitFunc) camel_mime_filter_basic_class_init, - NULL, - (CamelObjectInitFunc) camel_mime_filter_basic_init, - NULL); - } - - return type; -} - -/* should this 'flush' outstanding state/data bytes? */ -static void -reset(CamelMimeFilter *mf) -{ - CamelMimeFilterBasic *f = (CamelMimeFilterBasic *)mf; - - switch(f->type) { - case CAMEL_MIME_FILTER_BASIC_QP_ENC: - f->state = -1; - break; - default: - f->state = 0; - } - f->save = 0; -} - -static void -complete(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlen, size_t *outprespace) -{ - CamelMimeFilterBasic *f = (CamelMimeFilterBasic *)mf; - int newlen; - - switch(f->type) { - case CAMEL_MIME_FILTER_BASIC_BASE64_ENC: - /* wont go to more than 2x size (overly conservative) */ - camel_mime_filter_set_size(mf, len*2, FALSE); - newlen = base64_encode_close(in, len, TRUE, mf->outbuf, &f->state, &f->save); - break; - case CAMEL_MIME_FILTER_BASIC_QP_ENC: - /* *4 is definetly more than needed ... */ - camel_mime_filter_set_size(mf, len*4, FALSE); - newlen = quoted_encode_close(in, len, mf->outbuf, &f->state, &f->save); - break; - case CAMEL_MIME_FILTER_BASIC_BASE64_DEC: - /* output can't possibly exceed the input size */ - camel_mime_filter_set_size(mf, len, FALSE); - newlen = base64_decode_step(in, len, mf->outbuf, &f->state, &f->save); - break; - case CAMEL_MIME_FILTER_BASIC_QP_DEC: - /* output can't possibly exceed the input size */ - camel_mime_filter_set_size(mf, len, FALSE); - newlen = quoted_decode_step(in, len, mf->outbuf, &f->state, &f->save); - break; - default: - g_warning("unknown type %d in CamelMimeFilterBasic", f->type); - goto donothing; - } - - *out = mf->outbuf; - *outlen = newlen; - *outprespace = mf->outpre; - - return; -donothing: - *out = in; - *outlen = len; - *outprespace = prespace; -} - -/* here we do all of the basic mime filtering */ -static void -filter(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlen, size_t *outprespace) -{ - CamelMimeFilterBasic *f = (CamelMimeFilterBasic *)mf; - int newlen; - - switch(f->type) { - case CAMEL_MIME_FILTER_BASIC_BASE64_ENC: - /* wont go to more than 2x size (overly conservative) */ - camel_mime_filter_set_size(mf, len*2, FALSE); - newlen = base64_encode_step(in, len, TRUE, mf->outbuf, &f->state, &f->save); - break; - case CAMEL_MIME_FILTER_BASIC_QP_ENC: - /* *4 is overly conservative, but will do */ - camel_mime_filter_set_size(mf, len*4, FALSE); - newlen = quoted_encode_step(in, len, mf->outbuf, &f->state, &f->save); - break; - case CAMEL_MIME_FILTER_BASIC_BASE64_DEC: - /* output can't possibly exceed the input size */ - camel_mime_filter_set_size(mf, len, FALSE); - newlen = base64_decode_step(in, len, mf->outbuf, &f->state, &f->save); - break; - case CAMEL_MIME_FILTER_BASIC_QP_DEC: - /* output can't possibly exceed the input size */ - camel_mime_filter_set_size(mf, len, FALSE); - newlen = quoted_decode_step(in, len, mf->outbuf, &f->state, &f->save); - break; - default: - g_warning("unknown type %d in CamelMimeFilterBasic", f->type); - goto donothing; - } - - *out = mf->outbuf; - *outlen = newlen; - *outprespace = mf->outpre; - - return; -donothing: - *out = in; - *outlen = len; - *outprespace = prespace; -} - -/** - * camel_mime_filter_basic_new: - * - * Create a new CamelMimeFilterBasic object. - * - * Return value: A new CamelMimeFilterBasic widget. - **/ -CamelMimeFilterBasic * -camel_mime_filter_basic_new (void) -{ - CamelMimeFilterBasic *new = CAMEL_MIME_FILTER_BASIC ( camel_object_new (camel_mime_filter_basic_get_type ())); - return new; -} - -CamelMimeFilterBasic * -camel_mime_filter_basic_new_type(CamelMimeFilterBasicType type) -{ - CamelMimeFilterBasic *new; - - switch (type) { - case CAMEL_MIME_FILTER_BASIC_BASE64_ENC: - case CAMEL_MIME_FILTER_BASIC_QP_ENC: - case CAMEL_MIME_FILTER_BASIC_BASE64_DEC: - case CAMEL_MIME_FILTER_BASIC_QP_DEC: - new = camel_mime_filter_basic_new(); - new->type = type; - break; - default: - g_warning("Invalid type of CamelMimeFilterBasic requested: %d", type); - new = NULL; - break; - } - camel_mime_filter_reset((CamelMimeFilter *)new); - return new; -} - diff --git a/camel/camel-mime-filter-basic.h b/camel/camel-mime-filter-basic.h deleted file mode 100644 index 42713e334d..0000000000 --- a/camel/camel-mime-filter-basic.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef _CAMEL_MIME_FILTER_BASIC_H -#define _CAMEL_MIME_FILTER_BASIC_H - -#include <camel/camel-mime-filter.h> - -#define CAMEL_MIME_FILTER_BASIC(obj) CAMEL_CHECK_CAST (obj, camel_mime_filter_basic_get_type (), CamelMimeFilterBasic) -#define CAMEL_MIME_FILTER_BASIC_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_mime_filter_basic_get_type (), CamelMimeFilterBasicClass) -#define IS_CAMEL_MIME_FILTER_BASIC(obj) CAMEL_CHECK_TYPE (obj, camel_mime_filter_basic_get_type ()) - -typedef struct _CamelMimeFilterBasicClass CamelMimeFilterBasicClass; - -typedef enum { - CAMEL_MIME_FILTER_BASIC_BASE64_ENC = 1, - CAMEL_MIME_FILTER_BASIC_BASE64_DEC, - CAMEL_MIME_FILTER_BASIC_QP_ENC, - CAMEL_MIME_FILTER_BASIC_QP_DEC, -} CamelMimeFilterBasicType; - -struct _CamelMimeFilterBasic { - CamelMimeFilter parent; - - struct _CamelMimeFilterBasicPrivate *priv; - - CamelMimeFilterBasicType type; - - int state; - int save; -}; - -struct _CamelMimeFilterBasicClass { - CamelMimeFilterClass parent_class; -}; - -guint camel_mime_filter_basic_get_type (void); -CamelMimeFilterBasic *camel_mime_filter_basic_new (void); -CamelMimeFilterBasic *camel_mime_filter_basic_new_type (CamelMimeFilterBasicType type); - -#endif /* ! _CAMEL_MIME_FILTER_BASIC_H */ diff --git a/camel/camel-mime-filter-charset.c b/camel/camel-mime-filter-charset.c deleted file mode 100644 index c91c7f061f..0000000000 --- a/camel/camel-mime-filter-charset.c +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - - -#include <unicode.h> - -#include <string.h> -#include <errno.h> - -#include "camel-mime-filter-charset.h" - - -static void camel_mime_filter_charset_class_init (CamelMimeFilterCharsetClass *klass); -static void camel_mime_filter_charset_init (CamelMimeFilterCharset *obj); -static void camel_mime_filter_charset_finalize (CamelObject *o); - -static CamelMimeFilterClass *camel_mime_filter_charset_parent; - -CamelType -camel_mime_filter_charset_get_type (void) -{ - static CamelType type = CAMEL_INVALID_TYPE; - - if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register (camel_mime_filter_get_type (), "CamelMimeFilterCharset", - sizeof (CamelMimeFilterCharset), - sizeof (CamelMimeFilterCharsetClass), - (CamelObjectClassInitFunc) camel_mime_filter_charset_class_init, - NULL, - (CamelObjectInitFunc) camel_mime_filter_charset_init, - (CamelObjectFinalizeFunc) camel_mime_filter_charset_finalize); - } - - return type; -} - -static void -camel_mime_filter_charset_finalize(CamelObject *o) -{ - CamelMimeFilterCharset *f = (CamelMimeFilterCharset *)o; - - g_free(f->from); - g_free(f->to); - if (f->ic != (unicode_iconv_t)-1) { - unicode_iconv_close(f->ic); - f->ic = (unicode_iconv_t) -1; - } -} - -static void -reset(CamelMimeFilter *mf) -{ - CamelMimeFilterCharset *f = (CamelMimeFilterCharset *)mf; - char buf[16]; - char *buffer; - int outlen = 16; - - /* what happens with the output bytes if this resets the state? */ - if (f->ic != (unicode_iconv_t) -1) { - buffer = buf; - unicode_iconv(f->ic, NULL, 0, &buffer, &outlen); - } -} - -static void -complete(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlenptr, size_t *outprespace) -{ - CamelMimeFilterCharset *f = (CamelMimeFilterCharset *)mf; - int converted; - const char *inbuf; - char *outbuf; - int inlen, outlen; - - if (f->ic == (unicode_iconv_t) -1) { - goto donothing; - } - - /* FIXME: there's probably a safer way to size this ...? */ - /* We could always resize if we run out of room in outbuf (but it'd be nice not - to have to) */ - camel_mime_filter_set_size(mf, len*5, FALSE); - inbuf = in; - inlen = len; - outbuf = mf->outbuf; - outlen = mf->outsize; - - if (inlen>0) { - converted = unicode_iconv(f->ic, &inbuf, &inlen, &outbuf, &outlen); - if (converted == -1) { - if (errno != EINVAL) { - g_warning("error occured converting: %s", strerror(errno)); - goto donothing; - } - } - - if (inlen>0) { - g_warning("Output lost in character conversion, invalid sequence encountered?"); - } - } - - /* this 'resets' the output stream, returning back to the initial - shift state for multishift charactersets */ - converted = unicode_iconv(f->ic, NULL, 0, &outbuf, &outlen); - if (converted == -1) { - g_warning("Conversion failed to complete: %s", strerror(errno)); - } - - *out = mf->outbuf; - *outlenptr = mf->outsize - outlen; - *outprespace = mf->outpre; - return; - -donothing: - *out = in; - *outlenptr = len; - *outprespace = prespace; -} - -static void -filter(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlenptr, size_t *outprespace) -{ - CamelMimeFilterCharset *f = (CamelMimeFilterCharset *)mf; - int converted; - const char *inbuf; - char *outbuf; - int inlen, outlen; - - if (f->ic == (unicode_iconv_t) -1) { - goto donothing; - } - - /* FIXME: there's probably a safer way to size this ...? */ - camel_mime_filter_set_size(mf, len*5, FALSE); - inbuf = in; - inlen = len; - outbuf = mf->outbuf; - outlen = mf->outsize; - converted = unicode_iconv(f->ic, &inbuf, &inlen, &outbuf, &outlen); - if (converted == -1) { - if (errno != EINVAL) { - g_warning("error occured converting: %s", strerror(errno)); - goto donothing; - } - } - - /* - NOTE: This assumes EINVAL only occurs because we ran out of - bytes for a multibyte sequence, if not, we're in trouble. - */ - - if (inlen>0) { - camel_mime_filter_backup(mf, inbuf, inlen); - } - - *out = mf->outbuf; - *outlenptr = mf->outsize - outlen; - *outprespace = mf->outpre; - return; - -donothing: - *out = in; - *outlenptr = len; - *outprespace = prespace; -} - -static void -camel_mime_filter_charset_class_init (CamelMimeFilterCharsetClass *klass) -{ - CamelMimeFilterClass *filter_class = (CamelMimeFilterClass *) klass; - - camel_mime_filter_charset_parent = CAMEL_MIME_FILTER_CLASS (camel_type_get_global_classfuncs (camel_mime_filter_get_type ())); - - filter_class->reset = reset; - filter_class->filter = filter; - filter_class->complete = complete; -} - -static void -camel_mime_filter_charset_init (CamelMimeFilterCharset *obj) -{ - obj->ic = (unicode_iconv_t)-1; -} - -/** - * camel_mime_filter_charset_new: - * - * Create a new CamelMimeFilterCharset object. - * - * Return value: A new CamelMimeFilterCharset widget. - **/ -CamelMimeFilterCharset * -camel_mime_filter_charset_new (void) -{ - CamelMimeFilterCharset *new = CAMEL_MIME_FILTER_CHARSET ( camel_object_new (camel_mime_filter_charset_get_type ())); - return new; -} - -CamelMimeFilterCharset * -camel_mime_filter_charset_new_convert(const char *from_charset, const char *to_charset) -{ - CamelMimeFilterCharset *new = CAMEL_MIME_FILTER_CHARSET ( camel_object_new (camel_mime_filter_charset_get_type ())); - - new->ic = unicode_iconv_open(to_charset, from_charset); - if (new->ic == (unicode_iconv_t) -1) { - g_warning("Cannot create charset conversion from %s to %s: %s", from_charset, to_charset, strerror(errno)); - camel_object_unref((CamelObject *)new); - new = NULL; - } else { - new->from = g_strdup(from_charset); - new->to = g_strdup(to_charset); - } - return new; -} diff --git a/camel/camel-mime-filter-charset.h b/camel/camel-mime-filter-charset.h deleted file mode 100644 index c53254c8ab..0000000000 --- a/camel/camel-mime-filter-charset.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef _CAMEL_MIME_FILTER_CHARSET_H -#define _CAMEL_MIME_FILTER_CHARSET_H - -#include <camel/camel-mime-filter.h> -#include <unicode.h> - -#define CAMEL_MIME_FILTER_CHARSET(obj) CAMEL_CHECK_CAST (obj, camel_mime_filter_charset_get_type (), CamelMimeFilterCharset) -#define CAMEL_MIME_FILTER_CHARSET_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_mime_filter_charset_get_type (), CamelMimeFilterCharsetClass) -#define IS_CAMEL_MIME_FILTER_CHARSET(obj) CAMEL_CHECK_TYPE (obj, camel_mime_filter_charset_get_type ()) - -typedef struct _CamelMimeFilterCharsetClass CamelMimeFilterCharsetClass; - -struct _CamelMimeFilterCharset { - CamelMimeFilter parent; - - struct _CamelMimeFilterCharsetPrivate *priv; - - unicode_iconv_t ic; - char *from; - char *to; -}; - -struct _CamelMimeFilterCharsetClass { - CamelMimeFilterClass parent_class; -}; - -guint camel_mime_filter_charset_get_type (void); -CamelMimeFilterCharset *camel_mime_filter_charset_new (void); - -CamelMimeFilterCharset *camel_mime_filter_charset_new_convert (const char *from_charset, const char *to_charset); - -#endif /* ! _CAMEL_MIME_FILTER_CHARSET_H */ diff --git a/camel/camel-mime-filter-crlf.c b/camel/camel-mime-filter-crlf.c deleted file mode 100644 index 71a3e8bace..0000000000 --- a/camel/camel-mime-filter-crlf.c +++ /dev/null @@ -1,150 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Copyright (C) 2000 Helix Code, Inc. - * - * Authors: Dan Winship <danw@helixcode.com> - * Jeffrey Stedfast <fejj@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "camel-mime-filter-crlf.h" - -static void filter (CamelMimeFilter *f, char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace); -static void complete (CamelMimeFilter *f, char *in, size_t len, - size_t prespace, char **out, size_t *outlen, - size_t *outprespace); -static void reset (CamelMimeFilter *f); - - -static void -camel_mime_filter_crlf_class_init (CamelMimeFilterCRLFClass *klass) -{ - CamelMimeFilterClass *mime_filter_class = - (CamelMimeFilterClass *) klass; - - mime_filter_class->filter = filter; - mime_filter_class->complete = complete; - mime_filter_class->reset = reset; -} - -CamelType -camel_mime_filter_crlf_get_type (void) -{ - static CamelType type = CAMEL_INVALID_TYPE; - - if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register (camel_mime_filter_get_type(), "CamelMimeFilterCRLF", - sizeof (CamelMimeFilterCRLF), - sizeof (CamelMimeFilterCRLFClass), - (CamelObjectClassInitFunc) camel_mime_filter_crlf_class_init, - NULL, - NULL, - NULL); - } - - return type; -} - -static void -filter (CamelMimeFilter *f, char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace) -{ - CamelMimeFilterCRLF *crlf = (CamelMimeFilterCRLF *)f; - gboolean do_dots; - char *p, *q; - - do_dots = crlf->mode == CAMEL_MIME_FILTER_CRLF_MODE_CRLF_DOTS; - - if (crlf->direction == CAMEL_MIME_FILTER_CRLF_ENCODE) { - camel_mime_filter_set_size (f, 3 * len, FALSE); - - p = in; - q = f->outbuf; - while (p < in + len) { - if (*p == '\n') - *q++ = '\r'; - else - if (do_dots && *(p - 1) == '\n' && *p == '.') - *q++ = '.'; - *q++ = *p++; - } - } else { - camel_mime_filter_set_size (f, len, FALSE); - - p = in; - q = f->outbuf; - while (p < in + len) { - if (*p == '\r') { - crlf->saw_cr = TRUE; - } else { - if (crlf->saw_cr) { - if (*p != '\n') - *q++ = '\r'; - crlf->saw_cr = FALSE; - } - *q++ = *p; - } - - if (do_dots) { - if (*p == '.' && *(p - 1) == '\n') { - crlf->saw_dot = TRUE; - } else { - if (crlf->saw_dot) { - if (*p == '.') - p++; - crlf->saw_dot = FALSE; - } - *q++ = *p; - } - } - - p++; - } - } - - *out = f->outbuf; - *outlen = q - f->outbuf; - *outprespace = f->outpre; -} - -static void -complete (CamelMimeFilter *f, char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace) -{ - if (len) - filter (f, in, len, prespace, out, outlen, outprespace); -} - -static void -reset (CamelMimeFilter *f) -{ - CamelMimeFilterCRLF *crlf = (CamelMimeFilterCRLF *)f; - - crlf->saw_cr = FALSE; -} - -CamelMimeFilter * -camel_mime_filter_crlf_new (CamelMimeFilterCRLFDirection direction, CamelMimeFilterCRLFMode mode) -{ - CamelMimeFilterCRLF *crlf = CAMEL_MIME_FILTER_CRLF(camel_object_new (CAMEL_MIME_FILTER_CRLF_TYPE)); - - crlf->direction = direction; - crlf->mode = mode; - crlf->saw_cr = FALSE; - - return (CamelMimeFilter *)crlf; -} diff --git a/camel/camel-mime-filter-crlf.h b/camel/camel-mime-filter-crlf.h deleted file mode 100644 index 6ba109d154..0000000000 --- a/camel/camel-mime-filter-crlf.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Dan Winship <danw@helixcode.com> - * Jeffrey Stedfast <fejj@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef _CAMEL_MIME_FILTER_CRLF_H -#define _CAMEL_MIME_FILTER_CRLF_H - -#include <camel/camel-mime-filter.h> - -#define CAMEL_MIME_FILTER_CRLF_TYPE (camel_mime_filter_crlf_get_type ()) -#define CAMEL_MIME_FILTER_CRLF(obj) CAMEL_CHECK_CAST (obj, CAMEL_MIME_FILTER_CRLF_TYPE, CamelMimeFilterCRLF) -#define CAMEL_MIME_FILTER_CRLF_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, CAMEL_MIME_FILTER_CRLF_TYPE, CamelMimeFilterCRLFClass) -#define CAMEL_IS_MIME_FILTER_CRLF(obj) CAMEL_CHECK_TYPE (obj, CAMEL_MIME_FILTER_CRLF_TYPE) - -typedef struct _CamelMimeFilterCRLFClass CamelMimeFilterCRLFClass; - -typedef enum { - CAMEL_MIME_FILTER_CRLF_ENCODE, - CAMEL_MIME_FILTER_CRLF_DECODE -} CamelMimeFilterCRLFDirection; - -typedef enum { - CAMEL_MIME_FILTER_CRLF_MODE_CRLF_DOTS, - CAMEL_MIME_FILTER_CRLF_MODE_CRLF_ONLY, -} CamelMimeFilterCRLFMode; - -struct _CamelMimeFilterCRLF { - CamelMimeFilter parent; - - CamelMimeFilterCRLFDirection direction; - CamelMimeFilterCRLFMode mode; - gboolean saw_cr; - gboolean saw_dot; -}; - -struct _CamelMimeFilterCRLFClass { - CamelMimeFilterClass parent_class; -}; - -CamelType camel_mime_filter_crlf_get_type (void); - -CamelMimeFilter *camel_mime_filter_crlf_new (CamelMimeFilterCRLFDirection direction, CamelMimeFilterCRLFMode mode); - -#endif /* ! _CAMEL_MIME_FILTER_CRLF_H */ diff --git a/camel/camel-mime-filter-from.c b/camel/camel-mime-filter-from.c deleted file mode 100644 index 017a256471..0000000000 --- a/camel/camel-mime-filter-from.c +++ /dev/null @@ -1,221 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "camel-mime-filter-from.h" -#include <string.h> - -#define d(x) - -struct _CamelMimeFilterFromPrivate { -}; - -#define _PRIVATE(o) (((CamelMimeFilterFrom *)(o))->priv) - -static void camel_mime_filter_from_class_init (CamelMimeFilterFromClass *klass); -static void camel_mime_filter_from_init (CamelMimeFilterFrom *obj); - -static CamelMimeFilterClass *camel_mime_filter_from_parent; - -CamelType -camel_mime_filter_from_get_type (void) -{ - static CamelType type = CAMEL_INVALID_TYPE; - - if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register (camel_mime_filter_get_type (), "CamelMimeFilterFrom", - sizeof (CamelMimeFilterFrom), - sizeof (CamelMimeFilterFromClass), - (CamelObjectClassInitFunc) camel_mime_filter_from_class_init, - NULL, - (CamelObjectInitFunc) camel_mime_filter_from_init, - NULL); - } - - return type; -} - -struct fromnode { - struct fromnode *next; - char *pointer; -}; - -static void -complete(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlen, size_t *outprespace) -{ - *out = in; - *outlen = len; - *outprespace = prespace; -} - -/* Yes, it is complicated ... */ -static void -filter(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlen, size_t *outprespace) -{ - CamelMimeFilterFrom *f = (CamelMimeFilterFrom *)mf; - register char *inptr, *inend; - int left; - int midline = f->midline; - int fromcount = 0; - struct fromnode *head = NULL, *tail = (struct fromnode *)&head, *node; - char *outptr; - - inptr = in; - inend = inptr+len; - - d(printf("Filtering '%.*s'\n", len, in)); - - /* first, see if we need to escape any from's */ - while (inptr<inend) { - register int c = -1; - - if (midline) - while (inptr < inend && (c = *inptr++) != '\n') - ; - - if (c == '\n' || !midline) { - left = inend-inptr; - if (left > 0) { - midline = TRUE; - if (left < 5) { - if (inptr[0] == 'F') { - camel_mime_filter_backup(mf, inptr, left); - midline = FALSE; - inend = inptr; - break; - } - } else { - if (!strncmp(inptr, "From ", 5)) { - fromcount++; - /* yes, we do alloc them on the stack ... at most we're going to get - len / 7 of them anyway */ - node = alloca(sizeof(*node)); - node->pointer = inptr; - node->next = NULL; - tail->next = node; - tail = node; - inptr += 5; - } - } - } else { - /* \n is at end of line, check next buffer */ - midline = FALSE; - } - } - } - - f->midline = midline; - - if (fromcount > 0) { - camel_mime_filter_set_size(mf, len + fromcount, FALSE); - node = head; - inptr = in; - outptr = mf->outbuf; - while (node) { - memcpy(outptr, inptr, node->pointer - inptr); - outptr += node->pointer - inptr; - *outptr++ = '>'; - inptr = node->pointer; - node = node->next; - } - memcpy(outptr, inptr, inend - inptr); - outptr += inend - inptr; - *out = mf->outbuf; - *outlen = outptr - mf->outbuf; - *outprespace = mf->outbuf - mf->outreal; - - d(printf("Filtered '%.*s'\n", *outlen, *out)); - } else { - *out = in; - *outlen = inend - in; - *outprespace = prespace; - - d(printf("Filtered '%.*s'\n", *outlen, *out)); - } -} - -static void -camel_mime_filter_from_class_init (CamelMimeFilterFromClass *klass) -{ - CamelMimeFilterClass *filter_class = (CamelMimeFilterClass *) klass; - - camel_mime_filter_from_parent = CAMEL_MIME_FILTER_CLASS (camel_type_get_global_classfuncs (camel_mime_filter_get_type ())); - - filter_class->filter = filter; - filter_class->complete = complete; -} - -static void -camel_mime_filter_from_init (CamelMimeFilterFrom *obj) -{ - struct _CamelMimeFilterFromPrivate *p; - - p = _PRIVATE(obj) = g_malloc0(sizeof(*p)); - obj->midline = FALSE; -} - -/** - * camel_mime_filter_from_new: - * - * Create a new CamelMimeFilterFrom object. - * - * Return value: A new CamelMimeFilterFrom widget. - **/ -CamelMimeFilterFrom * -camel_mime_filter_from_new (void) -{ - CamelMimeFilterFrom *new = CAMEL_MIME_FILTER_FROM ( camel_object_new (camel_mime_filter_from_get_type ())); - return new; -} - -#if 0 - -#include <stdio.h> - -int main(int argc, char **argv) -{ - CamelMimeFilterFrom *f; - char *buffer; - int len, prespace; - - g_tk_init(&argc, &argv); - - - f = camel_mime_filter_from_new(); - - buffer = "This is a test\nFrom Someone\nTo someone. From Someone else, From\n From blah\nFromblah\nBye! \nFrom "; - len = strlen(buffer); - prespace = 0; - - printf("input = '%.*s'\n", len, buffer); - camel_mime_filter_filter(f, buffer, len, prespace, &buffer, &len, &prespace); - printf("output = '%.*s'\n", len, buffer); - buffer = ""; - len = 0; - prespace = 0; - camel_mime_filter_complete(f, buffer, len, prespace, &buffer, &len, &prespace); - printf("complete = '%.*s'\n", len, buffer); - - - return 0; -} - -#endif diff --git a/camel/camel-mime-filter-from.h b/camel/camel-mime-filter-from.h deleted file mode 100644 index ac526b6e15..0000000000 --- a/camel/camel-mime-filter-from.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef _CAMEL_MIME_FILTER_FROM_H -#define _CAMEL_MIME_FILTER_FROM_H - -#include <camel/camel-mime-filter.h> - -#define CAMEL_MIME_FILTER_FROM(obj) CAMEL_CHECK_CAST (obj, camel_mime_filter_from_get_type (), CamelMimeFilterFrom) -#define CAMEL_MIME_FILTER_FROM_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_mime_filter_from_get_type (), CamelMimeFilterFromClass) -#define IS_CAMEL_MIME_FILTER_FROM(obj) CAMEL_CHECK_TYPE (obj, camel_mime_filter_from_get_type ()) - -typedef struct _CamelMimeFilterFrom CamelMimeFilterFrom; -typedef struct _CamelMimeFilterFromClass CamelMimeFilterFromClass; - -struct _CamelMimeFilterFrom { - CamelMimeFilter parent; - - struct _CamelMimeFilterFromPrivate *priv; - - int midline; /* are we between lines? */ -}; - -struct _CamelMimeFilterFromClass { - CamelMimeFilterClass parent_class; -}; - -guint camel_mime_filter_from_get_type (void); -CamelMimeFilterFrom *camel_mime_filter_from_new (void); - -#endif /* ! _CAMEL_MIME_FILTER_FROM_H */ diff --git a/camel/camel-mime-filter-index.c b/camel/camel-mime-filter-index.c deleted file mode 100644 index 46e0f3f5e8..0000000000 --- a/camel/camel-mime-filter-index.c +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "camel-mime-filter-index.h" - - -static void camel_mime_filter_index_class_init (CamelMimeFilterIndexClass *klass); -static void camel_mime_filter_index_finalize (CamelObject *o); - -static CamelMimeFilterClass *camel_mime_filter_index_parent; - -CamelType -camel_mime_filter_index_get_type (void) -{ - static CamelType type = CAMEL_INVALID_TYPE; - - if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register (camel_mime_filter_get_type (), "CamelMimeFilterIndex", - sizeof (CamelMimeFilterIndex), - sizeof (CamelMimeFilterIndexClass), - (CamelObjectClassInitFunc) camel_mime_filter_index_class_init, - NULL, - NULL, - (CamelObjectFinalizeFunc) camel_mime_filter_index_finalize); - } - - return type; -} - -static void -camel_mime_filter_index_finalize(CamelObject *o) -{ - CamelMimeFilterIndex *f = (CamelMimeFilterIndex *)o; - - g_free(f->name); - f->index = NULL; /* ibex's need refcounting? */ -} - -static void -complete(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlenptr, size_t *outprespace) -{ - CamelMimeFilterIndex *f = (CamelMimeFilterIndex *)mf; - - if (f->index == NULL || f->name==NULL) { - goto donothing; - } - - ibex_index_buffer(f->index, f->name, in, len, NULL); - -donothing: - *out = in; - *outlenptr = len; - *outprespace = prespace; -} - -static void -filter(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlenptr, size_t *outprespace) -{ - CamelMimeFilterIndex *f = (CamelMimeFilterIndex *)mf; - int inleft = 0; - - if (f->index == NULL || f->name==NULL) { - goto donothing; - } - - ibex_index_buffer(f->index, f->name, in, len, &inleft); - - if (inleft>0) { - camel_mime_filter_backup(mf, in+(len-inleft), inleft); - } - - *out = in; - *outlenptr = len-inleft; - *outprespace = prespace; - return; - -donothing: - *out = in; - *outlenptr = len; - *outprespace = prespace; -} - -static void -camel_mime_filter_index_class_init (CamelMimeFilterIndexClass *klass) -{ - CamelMimeFilterClass *filter_class = (CamelMimeFilterClass *) klass; - - camel_mime_filter_index_parent = CAMEL_MIME_FILTER_CLASS (camel_type_get_global_classfuncs (camel_mime_filter_get_type ())); - - /*filter_class->reset = reset;*/ - filter_class->filter = filter; - filter_class->complete = complete; -} - -/** - * camel_mime_filter_index_new: - * - * Create a new CamelMimeFilterIndex object. - * - * Return value: A new CamelMimeFilterIndex widget. - **/ -CamelMimeFilterIndex * -camel_mime_filter_index_new (void) -{ - CamelMimeFilterIndex *new = CAMEL_MIME_FILTER_INDEX ( camel_object_new (camel_mime_filter_index_get_type ())); - return new; -} - -CamelMimeFilterIndex *camel_mime_filter_index_new_ibex (ibex *index) -{ - CamelMimeFilterIndex *new = camel_mime_filter_index_new(); - - if (new) { - new->index = index; - new->name = g_strdup(""); - } - return new; -} - -/* Set the match name for any indexed words */ -void camel_mime_filter_index_set_name (CamelMimeFilterIndex *mf, char *name) -{ - g_free(mf->name); - mf->name = g_strdup(name); -} - -void camel_mime_filter_index_set_ibex (CamelMimeFilterIndex *mf, ibex *index) -{ - if (mf->index) { - char *out; - size_t outlen, outspace; - - camel_mime_filter_complete((CamelMimeFilter *)mf, "", 0, 0, &out, &outlen, &outspace); - } - mf->index = index; -} - - - diff --git a/camel/camel-mime-filter-index.h b/camel/camel-mime-filter-index.h deleted file mode 100644 index b0a9107852..0000000000 --- a/camel/camel-mime-filter-index.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef _CAMEL_MIME_FILTER_INDEX_H -#define _CAMEL_MIME_FILTER_INDEX_H - -#include <camel/camel-mime-filter.h> -#include <libibex/ibex.h> - -#define CAMEL_MIME_FILTER_INDEX(obj) CAMEL_CHECK_CAST (obj, camel_mime_filter_index_get_type (), CamelMimeFilterIndex) -#define CAMEL_MIME_FILTER_INDEX_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_mime_filter_index_get_type (), CamelMimeFilterIndexClass) -#define IS_CAMEL_MIME_FILTER_INDEX(obj) CAMEL_CHECK_TYPE (obj, camel_mime_filter_index_get_type ()) - -typedef struct _CamelMimeFilterIndexClass CamelMimeFilterIndexClass; - -struct _CamelMimeFilterIndex { - CamelMimeFilter parent; - - struct _CamelMimeFilterIndexPrivate *priv; - - ibex *index; - char *name; -}; - -struct _CamelMimeFilterIndexClass { - CamelMimeFilterClass parent_class; -}; - -guint camel_mime_filter_index_get_type (void); -CamelMimeFilterIndex *camel_mime_filter_index_new (void); - -CamelMimeFilterIndex *camel_mime_filter_index_new_ibex (ibex *); - -/* Set the match name for any indexed words */ -void camel_mime_filter_index_set_name (CamelMimeFilterIndex *, char *); -void camel_mime_filter_index_set_ibex (CamelMimeFilterIndex *mf, ibex *index); - -#endif /* ! _CAMEL_MIME_FILTER_INDEX_H */ diff --git a/camel/camel-mime-filter-linewrap.c b/camel/camel-mime-filter-linewrap.c deleted file mode 100644 index dee6c19abb..0000000000 --- a/camel/camel-mime-filter-linewrap.c +++ /dev/null @@ -1,140 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Copyright (C) 2000 Helix Code, Inc. - * - * Authors: Jeffrey Stedfast <fejj@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "camel-mime-filter-linewrap.h" -#include <ctype.h> - -static void filter (CamelMimeFilter *f, char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace); -static void complete (CamelMimeFilter *f, char *in, size_t len, - size_t prespace, char **out, size_t *outlen, - size_t *outprespace); -static void reset (CamelMimeFilter *f); - - -static void -camel_mime_filter_linewrap_class_init (CamelMimeFilterLinewrapClass *klass) -{ - CamelMimeFilterClass *mime_filter_class = - (CamelMimeFilterClass *) klass; - - mime_filter_class->filter = filter; - mime_filter_class->complete = complete; - mime_filter_class->reset = reset; -} - -CamelType -camel_mime_filter_linewrap_get_type (void) -{ - static CamelType type = CAMEL_INVALID_TYPE; - - if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register (camel_mime_filter_get_type(), "CamelMimeFilterLinewrap", - sizeof (CamelMimeFilterLinewrap), - sizeof (CamelMimeFilterLinewrapClass), - (CamelObjectClassInitFunc) camel_mime_filter_linewrap_class_init, - NULL, - NULL, - NULL); - } - - return type; -} - -static void -filter (CamelMimeFilter *f, char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace) -{ - CamelMimeFilterLinewrap *linewrap = (CamelMimeFilterLinewrap *)f; - char *inend, *last, *p, *q; - int nchars = linewrap->nchars; - - /* we'll be adding chars here so we need a bigger buffer */ - camel_mime_filter_set_size (f, 3 * len, FALSE); - - p = in; - q = f->outbuf; - inend = in + len; - - while (p < inend) { - if (*p == '\n') { - last = q; - *q++ = *p++; - nchars = 0; - } else if (isspace (*p)) { - last = q; - - if (nchars >= linewrap->wrap_len) { - *q++ = '\n'; - p++; - nchars = 0; - } else { - *q++ = *p++; - } - } else { - *q++ = *p++; - nchars++; - } - - /* line is getting way too long, we must force a wrap here */ - if (nchars >= (linewrap->max_len - 1) && *p != '\n') { - *q++ = '\n'; - *q++ = linewrap->indent; - nchars = 0; - } - } - - linewrap->nchars = nchars; - - *out = f->outbuf; - *outlen = q - f->outbuf; - *outprespace = f->outpre; -} - -static void -complete (CamelMimeFilter *f, char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace) -{ - if (len) - filter (f, in, len, prespace, out, outlen, outprespace); -} - -static void -reset (CamelMimeFilter *f) -{ - CamelMimeFilterLinewrap *linewrap = (CamelMimeFilterLinewrap *)f; - - linewrap->nchars = 0; -} - -CamelMimeFilter * -camel_mime_filter_linewrap_new (guint preferred_len, guint max_len, char indent_char) -{ - CamelMimeFilterLinewrap *linewrap = - CAMEL_MIME_FILTER_LINEWRAP (camel_object_new (CAMEL_MIME_FILTER_LINEWRAP_TYPE)); - - linewrap->indent = indent_char; - linewrap->wrap_len = preferred_len; - linewrap->max_len = max_len; - linewrap->nchars = 0; - - return (CamelMimeFilter *) linewrap; -} diff --git a/camel/camel-mime-filter-linewrap.h b/camel/camel-mime-filter-linewrap.h deleted file mode 100644 index 189b80d014..0000000000 --- a/camel/camel-mime-filter-linewrap.h +++ /dev/null @@ -1,51 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Jeffrey Stedfast <fejj@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef _CAMEL_MIME_FILTER_LINEWRAP_H -#define _CAMEL_MIME_FILTER_LINEWRAP_H - -#include <camel/camel-mime-filter.h> - -#define CAMEL_MIME_FILTER_LINEWRAP_TYPE (camel_mime_filter_linewrap_get_type ()) -#define CAMEL_MIME_FILTER_LINEWRAP(obj) CAMEL_CHECK_CAST (obj, CAMEL_MIME_FILTER_LINEWRAP_TYPE, CamelMimeFilterLinewrap) -#define CAMEL_MIME_FILTER_LINEWRAP_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, CAMEL_MIME_FILTER_LINEWRAP_TYPE, CamelMimeFilterLinewrapClass) -#define CAMEL_IS_MIME_FILTER_LINEWRAP(obj) CAMEL_CHECK_TYPE (obj, CAMEL_MIME_FILTER_LINEWRAP_TYPE) - -typedef struct _CamelMimeFilterLinewrapClass CamelMimeFilterLinewrapClass; - -struct _CamelMimeFilterLinewrap { - CamelMimeFilter parent; - - guint wrap_len; - guint max_len; - char indent; - int nchars; -}; - -struct _CamelMimeFilterLinewrapClass { - CamelMimeFilterClass parent_class; -}; - -CamelType camel_mime_filter_linewrap_get_type (void); - -CamelMimeFilter *camel_mime_filter_linewrap_new (guint preferred_len, guint max_len, char indent_char); - -#endif /* ! _CAMEL_MIME_FILTER_LINEWRAP_H */ diff --git a/camel/camel-mime-filter-save.c b/camel/camel-mime-filter-save.c deleted file mode 100644 index e1761994ed..0000000000 --- a/camel/camel-mime-filter-save.c +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include <sys/types.h> -#include <unistd.h> -#include <sys/stat.h> -#include <fcntl.h> - -#include <string.h> -#include <errno.h> - -#include "camel-mime-filter-save.h" - -static void camel_mime_filter_save_class_init (CamelMimeFilterSaveClass *klass); -static void camel_mime_filter_save_init (CamelMimeFilterSave *obj); -static void camel_mime_filter_save_finalize (CamelObject *o); - -static CamelMimeFilterClass *camel_mime_filter_save_parent; - -CamelType -camel_mime_filter_save_get_type (void) -{ - static CamelType type = CAMEL_INVALID_TYPE; - - if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register (camel_mime_filter_get_type (), "CamelMimeFilterSave", - sizeof (CamelMimeFilterSave), - sizeof (CamelMimeFilterSaveClass), - (CamelObjectClassInitFunc) camel_mime_filter_save_class_init, - NULL, - (CamelObjectInitFunc) camel_mime_filter_save_init, - (CamelObjectFinalizeFunc) camel_mime_filter_save_finalize); - } - - return type; -} - -static void -camel_mime_filter_save_finalize(CamelObject *o) -{ - CamelMimeFilterSave *f = (CamelMimeFilterSave *)o; - - g_free(f->filename); - if (f->fd != -1) { - /* FIXME: what do we do with failed writes???? */ - close(f->fd); - } -} - -static void -reset(CamelMimeFilter *mf) -{ - CamelMimeFilterSave *f = (CamelMimeFilterSave *)mf; - - /* i dunno, how do you 'reset' a file? reopen it? do i care? */ - if (f->fd != -1){ - lseek(f->fd, 0, SEEK_SET); - } -} - -/* all this code just to support this little trivial filter! */ -static void -filter(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlen, size_t *outprespace) -{ - CamelMimeFilterSave *f = (CamelMimeFilterSave *)mf; - - if (f->fd != -1) { - /* FIXME: check return */ - int outlen = write(f->fd, in, len); - if (outlen != len) { - g_warning("could not write to '%s': %s", f->filename?f->filename:"<descriptor>", strerror(errno)); - } - } - *out = in; - *outlen = len; - *outprespace = prespace; -} - -static void -camel_mime_filter_save_class_init (CamelMimeFilterSaveClass *klass) -{ - CamelMimeFilterClass *filter_class = (CamelMimeFilterClass *) klass; - - camel_mime_filter_save_parent = CAMEL_MIME_FILTER_CLASS (camel_type_get_global_classfuncs (camel_mime_filter_get_type ())); - - filter_class->reset = reset; - filter_class->filter = filter; -} - -static void -camel_mime_filter_save_init (CamelMimeFilterSave *f) -{ - f->fd = -1; -} - -/** - * camel_mime_filter_save_new: - * - * Create a new CamelMimeFilterSave object. - * - * Return value: A new CamelMimeFilterSave widget. - **/ -CamelMimeFilterSave * -camel_mime_filter_save_new (void) -{ - CamelMimeFilterSave *new = CAMEL_MIME_FILTER_SAVE ( camel_object_new (camel_mime_filter_save_get_type ())); - return new; -} - -CamelMimeFilterSave * -camel_mime_filter_save_new_name (const char *name, int flags, int mode) -{ - CamelMimeFilterSave *new = NULL; - - new = camel_mime_filter_save_new(); - if (new) { - new->fd = open(name, flags, mode); - if (new->fd != -1) { - new->filename = g_strdup(name); - } else { - camel_object_unref((CamelObject *)new); - new = NULL; - } - } - return new; -} - diff --git a/camel/camel-mime-filter-save.h b/camel/camel-mime-filter-save.h deleted file mode 100644 index abc1bf1186..0000000000 --- a/camel/camel-mime-filter-save.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef _CAMEL_MIME_FILTER_SAVE_H -#define _CAMEL_MIME_FILTER_SAVE_H - -#include <camel/camel-mime-filter.h> - -#define CAMEL_MIME_FILTER_SAVE(obj) CAMEL_CHECK_CAST (obj, camel_mime_filter_save_get_type (), CamelMimeFilterSave) -#define CAMEL_MIME_FILTER_SAVE_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_mime_filter_save_get_type (), CamelMimeFilterSaveClass) -#define IS_CAMEL_MIME_FILTER_SAVE(obj) CAMEL_CHECK_TYPE (obj, camel_mime_filter_save_get_type ()) - -typedef struct _CamelMimeFilterSaveClass CamelMimeFilterSaveClass; - -struct _CamelMimeFilterSave { - CamelMimeFilter parent; - - struct _CamelMimeFilterSavePrivate *priv; - - char *filename; - int fd; -}; - -struct _CamelMimeFilterSaveClass { - CamelMimeFilterClass parent_class; -}; - -guint camel_mime_filter_save_get_type (void); -CamelMimeFilterSave *camel_mime_filter_save_new (void); - -CamelMimeFilterSave *camel_mime_filter_save_new_name (const char *name, int flags, int mode); - -#endif /* ! _CAMEL_MIME_FILTER_SAVE_H */ diff --git a/camel/camel-mime-filter.c b/camel/camel-mime-filter.c deleted file mode 100644 index 9a81dfb452..0000000000 --- a/camel/camel-mime-filter.c +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "camel-mime-filter.h" - -/*#define MALLOC_CHECK */ /* for some malloc checking, requires mcheck enabled */ - -/* only suitable for glibc */ -#ifdef MALLOC_CHECK -#include <mcheck.h> -#endif - -struct _CamelMimeFilterPrivate { - char *inbuf; - size_t inlen; -}; - -#define PRE_HEAD (64) -#define BACK_HEAD (64) -#define _PRIVATE(o) (((CamelMimeFilter *)(o))->priv) -#define FCLASS(o) ((CamelMimeFilterClass *)(CAMEL_OBJECT_GET_CLASS(o))) - -static CamelObjectClass *camel_mime_filter_parent; - -static void complete (CamelMimeFilter *mf, char *in, size_t len, - size_t prespace, char **out, size_t *outlen, - size_t *outprespace); - -static void -camel_mime_filter_class_init (CamelMimeFilterClass *klass) -{ - camel_mime_filter_parent = camel_type_get_global_classfuncs (camel_object_get_type ()); - - klass->complete = complete; -} - -static void -camel_mime_filter_init (CamelMimeFilter *obj) -{ - obj->outreal = NULL; - obj->outbuf = NULL; - obj->outsize = 0; - - obj->backbuf = NULL; - obj->backsize = 0; - obj->backlen = 0; - - _PRIVATE(obj) = g_malloc0(sizeof(*obj->priv)); -} - -static void -camel_mime_filter_finalize(CamelObject *o) -{ - CamelMimeFilter *f = (CamelMimeFilter *)o; - struct _CamelMimeFilterPrivate *p = _PRIVATE(f); - - g_free(f->outreal); - g_free(f->backbuf); - g_free(p->inbuf); - g_free(p); -} - -CamelType -camel_mime_filter_get_type (void) -{ - static CamelType camel_mime_filter_type = CAMEL_INVALID_TYPE; - - if (camel_mime_filter_type == CAMEL_INVALID_TYPE) { - camel_mime_filter_type = camel_type_register (CAMEL_OBJECT_TYPE, "CamelMimeFilter", - sizeof (CamelMimeFilter), - sizeof (CamelMimeFilterClass), - (CamelObjectClassInitFunc) camel_mime_filter_class_init, - NULL, - (CamelObjectInitFunc) camel_mime_filter_init, - (CamelObjectFinalizeFunc) camel_mime_filter_finalize); - } - - return camel_mime_filter_type; -} - -static void -complete(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlen, size_t *outprespace) -{ - /* default - do nothing */ -} - -/** - * camel_mime_filter_new: - * - * Create a new CamelMimeFilter object. - * - * Return value: A new CamelMimeFilter widget. - **/ -CamelMimeFilter * -camel_mime_filter_new (void) -{ - CamelMimeFilter *new = CAMEL_MIME_FILTER ( camel_object_new (camel_mime_filter_get_type ())); - return new; -} - -#ifdef MALLOC_CHECK -static void -checkmem(void *p) -{ - if (p) { - int status = mprobe(p); - - switch (status) { - case MCHECK_HEAD: - printf("Memory underrun at %p\n", p); - abort(); - case MCHECK_TAIL: - printf("Memory overrun at %p\n", p); - abort(); - case MCHECK_FREE: - printf("Double free %p\n", p); - abort(); - } - } -} -#endif - -static void filter_run(CamelMimeFilter *f, - char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace, - void (*filterfunc)(CamelMimeFilter *f, - char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace)) -{ - struct _CamelMimeFilterPrivate *p; - -#ifdef MALLOC_CHECK - checkmem(f->outreal); - checkmem(f->backbuf); -#endif - /* - here we take a performance hit, if the input buffer doesn't - have the pre-space required. We make a buffer that does ... - */ - if (prespace < f->backlen) { - int newlen = len+prespace+f->backlen; - p = _PRIVATE(f); - if (p->inlen < newlen) { - /* NOTE: g_realloc copies data, we dont need that (slower) */ - g_free(p->inbuf); - p->inbuf = g_malloc(newlen+PRE_HEAD); - p->inlen = newlen+PRE_HEAD; - } - /* copy to end of structure */ - memcpy(p->inbuf+p->inlen - len, in, len); - in = p->inbuf+p->inlen - len; - prespace = p->inlen - len; - } - -#ifdef MALLOC_CHECK - checkmem(f->outreal); - checkmem(f->backbuf); -#endif - - /* preload any backed up data */ - if (f->backlen > 0) { - memcpy(in-f->backlen, f->backbuf, f->backlen); - in -= f->backlen; - len += f->backlen; - prespace -= f->backlen; - f->backlen = 0; - } - - filterfunc(f, in, len, prespace, out, outlen, outprespace); - -#ifdef MALLOC_CHECK - checkmem(f->outreal); - checkmem(f->backbuf); -#endif - -} - -void camel_mime_filter_filter(CamelMimeFilter *f, - char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace) -{ - if (FCLASS(f)->filter) - filter_run(f, in, len, prespace, out, outlen, outprespace, FCLASS(f)->filter); - else - g_error("Filter function unplmenented in class"); -} - -void camel_mime_filter_complete(CamelMimeFilter *f, - char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace) -{ - if (FCLASS(f)->complete) - filter_run(f, in, len, prespace, out, outlen, outprespace, FCLASS(f)->complete); -} - -void camel_mime_filter_reset(CamelMimeFilter *f) -{ - if (FCLASS(f)->reset) { - FCLASS(f)->reset(f); - } - - /* could free some buffers, if they are really big? */ - f->backlen = 0; -} - -/* sets number of bytes backed up on the input, new calls replace previous ones */ -void camel_mime_filter_backup(CamelMimeFilter *f, const char *data, size_t length) -{ - if (f->backsize < length) { - /* g_realloc copies data, unnecessary overhead */ - g_free(f->backbuf); - f->backbuf = g_malloc(length+BACK_HEAD); - f->backsize = length+BACK_HEAD; - } - f->backlen = length; - memcpy(f->backbuf, data, length); -} - -/* ensure this much size available for filter output (if required) */ -void camel_mime_filter_set_size(CamelMimeFilter *f, size_t size, int keep) -{ - if (f->outsize < size) { - int offset = f->outptr - f->outreal; - if (keep) { - f->outreal = g_realloc(f->outreal, size + PRE_HEAD*4); - } else { - g_free(f->outreal); - f->outreal = g_malloc(size + PRE_HEAD*4); - } - f->outptr = f->outreal + offset; - f->outbuf = f->outreal + PRE_HEAD*4; - f->outsize = size; - /* this could be offset from the end of the structure, but - this should be good enough */ - f->outpre = PRE_HEAD*4; - } -} - diff --git a/camel/camel-mime-filter.h b/camel/camel-mime-filter.h deleted file mode 100644 index 65d8590fa5..0000000000 --- a/camel/camel-mime-filter.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -/* Abstract class for non-copying filters */ - -#ifndef _CAMEL_MIME_FILTER_H -#define _CAMEL_MIME_FILTER_H - -#include <camel/camel-object.h> -#include <sys/types.h> - -#define CAMEL_MIME_FILTER_TYPE (camel_mime_filter_get_type ()) -#define CAMEL_MIME_FILTER(obj) CAMEL_CHECK_CAST (obj, camel_mime_filter_get_type (), CamelMimeFilter) -#define CAMEL_MIME_FILTER_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_mime_filter_get_type (), CamelMimeFilterClass) -#define IS_CAMEL_MIME_FILTER(obj) CAMEL_CHECK_TYPE (obj, camel_mime_filter_get_type ()) - -typedef struct _CamelMimeFilterClass CamelMimeFilterClass; - -struct _CamelMimeFilter { - CamelObject parent; - - struct _CamelMimeFilterPrivate *priv; - - char *outreal; /* real malloc'd buffer */ - char *outbuf; /* first 'writable' position allowed (outreal + outpre) */ - char *outptr; - int outsize; - int outpre; /* prespace of this buffer */ - - char *backbuf; - int backsize; - int backlen; /* significant data there */ -}; - -struct _CamelMimeFilterClass { - CamelObjectClass parent_class; - - /* virtual functions */ - void (*filter)(CamelMimeFilter *f, - char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace); - void (*complete)(CamelMimeFilter *f, - char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace); - void (*reset)(CamelMimeFilter *f); -}; - -CamelType camel_mime_filter_get_type (void); -CamelMimeFilter *camel_mime_filter_new (void); - -void camel_mime_filter_filter(CamelMimeFilter *f, - char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace); - -void camel_mime_filter_complete(CamelMimeFilter *f, - char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace); - -void camel_mime_filter_reset(CamelMimeFilter *f); - -/* sets/returns number of bytes backed up on the input */ -void camel_mime_filter_backup(CamelMimeFilter *f, const char *data, size_t length); - -/* ensure this much size available for filter output */ -void camel_mime_filter_set_size(CamelMimeFilter *f, size_t size, int keep); - -#endif /* ! _CAMEL_MIME_FILTER_H */ diff --git a/camel/camel-mime-message.c b/camel/camel-mime-message.c deleted file mode 100644 index fd199f600d..0000000000 --- a/camel/camel-mime-message.c +++ /dev/null @@ -1,738 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */ -/* camel-mime-message.c : class for a mime_message */ - -/* - * Authors: Bertrand Guiheneuf <bertrand@helixcode.com> - * Michael Zucchi <notzed@helixcode.com> - * Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> - -#include "camel-mime-message.h" -#include "camel-multipart.h" -#include "gmime-content-field.h" -#include "camel-stream-mem.h" -#include "string-utils.h" -#include "hash-table-utils.h" -#include <stdio.h> - -#define d(x) - -/* these 2 below should be kept in sync */ -typedef enum { - HEADER_UNKNOWN, - HEADER_FROM, - HEADER_REPLY_TO, - HEADER_SUBJECT, - HEADER_TO, - HEADER_CC, - HEADER_BCC, - HEADER_DATE -} CamelHeaderType; - -static char *header_names[] = { - /* dont include HEADER_UNKNOWN string */ - "From", "Reply-To", "Subject", "To", "Cc", "Bcc", "Date", NULL -}; - -static GHashTable *header_name_table; - -static CamelMimePartClass *parent_class=NULL; - -static char *recipient_names[] = { - "To", "Cc", "Bcc", NULL -}; - -static int write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream); -static void add_header (CamelMedium *medium, const char *header_name, const void *header_value); -static void set_header (CamelMedium *medium, const char *header_name, const void *header_value); -static void remove_header (CamelMedium *medium, const char *header_name); -static int construct_from_parser (CamelMimePart *, CamelMimeParser *); -static void unref_recipient (gpointer key, gpointer value, gpointer user_data); - -/* Returns the class for a CamelMimeMessage */ -#define CMM_CLASS(so) CAMEL_MIME_MESSAGE_CLASS (CAMEL_OBJECT_GET_CLASS(so)) -#define CDW_CLASS(so) CAMEL_DATA_WRAPPER_CLASS (CAMEL_OBJECT_GET_CLASS(so)) -#define CMD_CLASS(so) CAMEL_MEDIUM_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - -static void -camel_mime_message_class_init (CamelMimeMessageClass *camel_mime_message_class) -{ - CamelDataWrapperClass *camel_data_wrapper_class = CAMEL_DATA_WRAPPER_CLASS (camel_mime_message_class); - CamelMimePartClass *camel_mime_part_class = CAMEL_MIME_PART_CLASS (camel_mime_message_class); - CamelMediumClass *camel_medium_class = CAMEL_MEDIUM_CLASS (camel_mime_message_class); - int i; - - parent_class = CAMEL_MIME_PART_CLASS(camel_type_get_global_classfuncs (camel_mime_part_get_type ())); - - header_name_table = g_hash_table_new (g_strcase_hash, g_strcase_equal); - for (i=0;header_names[i];i++) - g_hash_table_insert (header_name_table, header_names[i], (gpointer)i+1); - - /* virtual method overload */ - camel_data_wrapper_class->write_to_stream = write_to_stream; - - camel_medium_class->add_header = add_header; - camel_medium_class->set_header = set_header; - camel_medium_class->remove_header = remove_header; - - camel_mime_part_class->construct_from_parser = construct_from_parser; -} - - -static void -camel_mime_message_init (gpointer object, gpointer klass) -{ - CamelMimeMessage *mime_message = (CamelMimeMessage *)object; - int i; - - camel_data_wrapper_set_mime_type (CAMEL_DATA_WRAPPER (object), "message/rfc822"); - - mime_message->recipients = g_hash_table_new(g_strcase_hash, g_strcase_equal); - for (i=0;recipient_names[i];i++) { - g_hash_table_insert(mime_message->recipients, recipient_names[i], camel_internet_address_new()); - } - - mime_message->subject = NULL; - mime_message->reply_to = NULL; - mime_message->from = NULL; - mime_message->date = CAMEL_MESSAGE_DATE_CURRENT; - mime_message->date_offset = 0; - mime_message->date_str = NULL; -} - -static void -camel_mime_message_finalize (CamelObject *object) -{ - CamelMimeMessage *message = CAMEL_MIME_MESSAGE (object); - - g_free (message->date_str); - g_free (message->subject); - g_free (message->reply_to); - g_free (message->from); - - g_hash_table_foreach (message->recipients, unref_recipient, NULL); - g_hash_table_destroy (message->recipients); -} - - -CamelType -camel_mime_message_get_type (void) -{ - static CamelType camel_mime_message_type = CAMEL_INVALID_TYPE; - - if (camel_mime_message_type == CAMEL_INVALID_TYPE) { - camel_mime_message_type = camel_type_register (camel_mime_part_get_type(), "CamelMimeMessage", - sizeof (CamelMimeMessage), - sizeof (CamelMimeMessageClass), - (CamelObjectClassInitFunc) camel_mime_message_class_init, - NULL, - (CamelObjectInitFunc) camel_mime_message_init, - (CamelObjectFinalizeFunc) camel_mime_message_finalize); - } - - return camel_mime_message_type; -} - -static void unref_recipient (gpointer key, gpointer value, gpointer user_data) -{ - camel_object_unref (CAMEL_OBJECT (value)); -} - - - -CamelMimeMessage * -camel_mime_message_new (void) -{ - CamelMimeMessage *mime_message; - mime_message = CAMEL_MIME_MESSAGE(camel_object_new (CAMEL_MIME_MESSAGE_TYPE)); - - return mime_message; -} - - -/* **** Date: */ - -void -camel_mime_message_set_date(CamelMimeMessage *message, time_t date, int offset) -{ - g_assert(message); - if (date == CAMEL_MESSAGE_DATE_CURRENT) { - struct tm *local; - int tz; - - date = time(0); - local = localtime(&date); - offset = 0; -#if defined(HAVE_TIMEZONE) - tz = timezone; -#elif defined(HAVE_TM_GMTOFF) - tz = local->tm_gmtoff; -#endif - offset = ((tz/60/60) * 100) + (tz/60 % 60); - } - message->date = date; - message->date_offset = offset; - g_free(message->date_str); - message->date_str = header_format_date(date, offset); - - CAMEL_MEDIUM_CLASS(parent_class)->set_header((CamelMedium *)message, "Date", message->date_str); -} - -void -camel_mime_message_get_date(CamelMimeMessage *message, time_t *date, int *offset) -{ - if (message->date == CAMEL_MESSAGE_DATE_CURRENT) - camel_mime_message_set_date(message, CAMEL_MESSAGE_DATE_CURRENT, 0); - if (date) - *date = message->date; - if (offset) - *offset = message->date_offset; -} - -char * -camel_mime_message_get_date_string (CamelMimeMessage *message) -{ - if (message->date == CAMEL_MESSAGE_DATE_CURRENT) - camel_mime_message_set_date (message, CAMEL_MESSAGE_DATE_CURRENT, 0); - return message->date_str; -} - -const gchar * -camel_mime_message_get_received_date (CamelMimeMessage *message) -{ - /* FIXME: is this the received date? and if so then get_sent_date must be wrong */ - if (message->date == CAMEL_MESSAGE_DATE_CURRENT) - camel_mime_message_set_date (message, CAMEL_MESSAGE_DATE_CURRENT, 0); - return message->date_str; -} - -const gchar * -camel_mime_message_get_sent_date (CamelMimeMessage *message) -{ - /* FIXME: is this the sent date? and if so then get_received_date must be wrong */ - if (message->date == CAMEL_MESSAGE_DATE_CURRENT) - camel_mime_message_set_date (message, CAMEL_MESSAGE_DATE_CURRENT, 0); - return message->date_str; -} - -/* **** Reply-To: */ - -void -camel_mime_message_set_reply_to (CamelMimeMessage *mime_message, const gchar *reply_to) -{ - CamelInternetAddress *cia; - char *addr; - - g_assert (mime_message); - - /* FIXME: check format of string, handle it nicer ... */ - - g_free (mime_message->reply_to); - mime_message->reply_to = g_strstrip (g_strdup (reply_to)); - - cia = camel_internet_address_new (); - camel_address_decode (CAMEL_ADDRESS (cia), mime_message->reply_to); - addr = camel_address_encode (CAMEL_ADDRESS (cia)); - - CAMEL_MEDIUM_CLASS (parent_class)->set_header (CAMEL_MEDIUM (mime_message), "Reply-To", addr); - camel_object_unref (CAMEL_OBJECT (cia)); - g_free (addr); -} - -const gchar * -camel_mime_message_get_reply_to (CamelMimeMessage *mime_message) -{ - g_assert (mime_message); - - return mime_message->reply_to; -} - -void -camel_mime_message_set_subject (CamelMimeMessage *mime_message, - const gchar *subject) -{ - char *text; - - g_assert (mime_message); - - g_free (mime_message->subject); - mime_message->subject = g_strstrip (g_strdup (subject)); - text = header_encode_string ((unsigned char *) mime_message->subject); - CAMEL_MEDIUM_CLASS (parent_class)->set_header (CAMEL_MEDIUM (mime_message), "Subject", text); - g_free (text); -} - -const gchar * -camel_mime_message_get_subject (CamelMimeMessage *mime_message) -{ - g_assert (mime_message); - - return mime_message->subject; -} - -/* *** From: */ -void -camel_mime_message_set_from (CamelMimeMessage *mime_message, const gchar *from) -{ - CamelInternetAddress *cia; - char *addr; - - g_assert (mime_message); - - /* FIXME: check format of string, handle it nicer ... */ - - g_free (mime_message->from); - mime_message->from = g_strstrip (g_strdup (from)); - - cia = camel_internet_address_new (); - camel_address_decode (CAMEL_ADDRESS (cia), mime_message->from); - - addr = camel_address_encode (CAMEL_ADDRESS (cia)); - CAMEL_MEDIUM_CLASS (parent_class)->set_header (CAMEL_MEDIUM (mime_message), "From", addr); - camel_object_unref (CAMEL_OBJECT (cia)); - g_free (addr); -} - -const gchar * -camel_mime_message_get_from (CamelMimeMessage *mime_message) -{ - g_assert (mime_message); - - return mime_message->from; -} - -/* **** */ - -void -camel_mime_message_add_recipient (CamelMimeMessage *mime_message, - const gchar *type, - const gchar *name, const char *address) -{ - CamelInternetAddress *addr; - char *text; - - g_assert (mime_message); - - addr = g_hash_table_lookup (mime_message->recipients, type); - if (addr == NULL) { - g_warning ("trying to add a non-valid receipient type: %s = %s %s", type, name, address); - return; - } - - camel_internet_address_add (addr, name, address); - - /* FIXME: maybe this should be delayed till we're ready to write out? */ - text = camel_address_encode (CAMEL_ADDRESS (addr)); - CAMEL_MEDIUM_CLASS (parent_class)->set_header (CAMEL_MEDIUM (mime_message), type, text); - g_free (text); -} - -void -camel_mime_message_remove_recipient_address (CamelMimeMessage *mime_message, - const gchar *type, - const gchar *address) -{ - CamelInternetAddress *addr; - int index; - char *text; - - g_assert (mime_message); - - addr = g_hash_table_lookup(mime_message->recipients, type); - if (addr == NULL) { - g_warning("trying to remove a non-valid receipient type: %s = %s", type, address); - return; - } - - index = camel_internet_address_find_address(addr, address, NULL); - if (index == -1) { - g_warning("trying to remove address for nonexistand address: %s", address); - return; - } - - camel_address_remove (CAMEL_ADDRESS (addr), index); - - /* FIXME: maybe this should be delayed till we're ready to write out? */ - text = camel_address_encode (CAMEL_ADDRESS (addr)); - CAMEL_MEDIUM_CLASS (parent_class)->set_header (CAMEL_MEDIUM (mime_message), type, text); - g_free (text); -} - -void -camel_mime_message_remove_recipient_name (CamelMimeMessage *mime_message, - const gchar *type, - const gchar *name) -{ - CamelInternetAddress *addr; - int index; - char *text; - - g_assert (mime_message); - - addr = g_hash_table_lookup(mime_message->recipients, type); - if (addr == NULL) { - g_warning("trying to remove a non-valid receipient type: %s = %s", type, name); - return; - } - index = camel_internet_address_find_name(addr, name, NULL); - if (index == -1) { - g_warning("trying to remove address for nonexistand name: %s", name); - return; - } - - camel_address_remove (CAMEL_ADDRESS (addr), index); - - /* FIXME: maybe this should be delayed till we're ready to write out? */ - text = camel_address_encode (CAMEL_ADDRESS (addr)); - CAMEL_MEDIUM_CLASS (parent_class)->set_header (CAMEL_MEDIUM (mime_message), type, text); - g_free (text); -} - -const CamelInternetAddress * -camel_mime_message_get_recipients (CamelMimeMessage *mime_message, - const gchar *type) -{ - g_assert (mime_message); - - return g_hash_table_lookup(mime_message->recipients, type); -} - - - -/* mime_message */ -static int -construct_from_parser(CamelMimePart *dw, CamelMimeParser *mp) -{ - char *buf; - int len; - int state; - int ret; - - d(printf("constructing mime-message\n")); - - d(printf("mime_message::construct_from_parser()\n")); - - /* let the mime-part construct the guts ... */ - ret = ((CamelMimePartClass *)parent_class)->construct_from_parser(dw, mp); - - if (ret == -1) - return -1; - - /* ... then clean up the follow-on state */ - state = camel_mime_parser_step(mp, &buf, &len); - switch (state) { - case HSCAN_EOF: case HSCAN_FROM_END: /* these doesn't belong to us */ - camel_mime_parser_unstep(mp); - case HSCAN_MESSAGE_END: - break; - default: - g_error("Bad parser state: Expecing MESSAGE_END or EOF or EOM, got: %d", camel_mime_parser_state(mp)); - camel_mime_parser_unstep(mp); - return -1; - } - - d(printf("mime_message::construct_from_parser() leaving\n")); -#ifndef NO_WARNINGS -#warning "return a real error code" -#endif - return 0; -} - -static int -write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream) -{ - CamelMimeMessage *mm = CAMEL_MIME_MESSAGE (data_wrapper); - - /* force mandatory headers ... */ - if (mm->from == NULL) { - g_warning("No from set for message"); - camel_mime_message_set_from(mm, ""); - } - if (mm->date_str == NULL) { - g_warning("Application did not set date, using 'now'"); - camel_mime_message_set_date(mm, CAMEL_MESSAGE_DATE_CURRENT, 0); - } - if (mm->subject == NULL) { - g_warning("Application did not set subject, creating one"); - camel_mime_message_set_subject(mm, "No Subject"); - } - - /* FIXME: "To" header needs to be set explicitly as well ... */ - - if (!camel_medium_get_header ((CamelMedium *)mm, "Mime-Version")) - camel_medium_set_header((CamelMedium *)mm, "Mime-Version", "1.0"); - - return CAMEL_DATA_WRAPPER_CLASS (parent_class)->write_to_stream (data_wrapper, stream); -} - -static char * -format_address(const char *text) -{ - struct _header_address *addr; - char *ret; - - addr = header_address_decode (text); - if (addr) { - ret = header_address_list_format (addr); - header_address_list_clear (&addr); - } else { - ret = g_strdup (text); - } - - return ret; -} - -/* FIXME: check format of fields. */ -static gboolean -process_header (CamelMedium *medium, const char *header_name, const char *header_value) -{ - CamelHeaderType header_type; - CamelMimeMessage *message = CAMEL_MIME_MESSAGE (medium); - CamelInternetAddress *addr; - - header_type = (CamelHeaderType) g_hash_table_lookup (header_name_table, header_name); - switch (header_type) { - case HEADER_FROM: - g_free (message->from); - message->from = format_address (header_value); - break; - case HEADER_REPLY_TO: - g_free (message->reply_to); - message->reply_to = format_address (header_value); - break; - case HEADER_SUBJECT: - g_free (message->subject); - message->subject = g_strstrip (header_decode_string (header_value)); - break; - case HEADER_TO: - case HEADER_CC: - case HEADER_BCC: - addr = g_hash_table_lookup (message->recipients, header_name); - if (header_value) - camel_address_decode (CAMEL_ADDRESS (addr), header_value); - else - camel_address_remove (CAMEL_ADDRESS (addr), -1); - break; - case HEADER_DATE: - g_free (message->date_str); - message->date_str = g_strdup (header_value); - if (header_value) { - message->date = header_decode_date (header_value, &message->date_offset); - } else { - message->date = CAMEL_MESSAGE_DATE_CURRENT; - } - break; - default: - return FALSE; - } - return TRUE; -} - -static void -set_header(CamelMedium *medium, const char *header_name, const void *header_value) -{ - process_header(medium, header_name, header_value); - parent_class->parent_class.set_header (medium, header_name, header_value); -} - -static void -add_header(CamelMedium *medium, const char *header_name, const void *header_value) -{ - /* if we process it, then it must be forced unique as well ... */ - if (process_header(medium, header_name, header_value)) - parent_class->parent_class.set_header (medium, header_name, header_value); - else - parent_class->parent_class.add_header (medium, header_name, header_value); -} - -static void -remove_header(CamelMedium *medium, const char *header_name) -{ - process_header(medium, header_name, NULL); - parent_class->parent_class.remove_header (medium, header_name); -} - -static gboolean -multipart_has_8bit_parts (CamelMultipart *multipart) -{ - gboolean has_8bit = FALSE; - int i, nparts; - - nparts = camel_multipart_get_number (multipart); - - for (i = 0; i < nparts && !has_8bit; i++) { - GMimeContentField *content; - CamelMimePart *mime_part; - - mime_part = camel_multipart_get_part (multipart, i); - content = camel_mime_part_get_content_type (mime_part); - - if (gmime_content_field_is_type (content, "multipart", "*")) { - CamelDataWrapper *wrapper; - CamelMultipart *mpart; - - wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (mime_part)); - mpart = CAMEL_MULTIPART (wrapper); - - has_8bit = multipart_has_8bit_parts (mpart); - } else { - /* see if this part is 8bit */ - has_8bit = camel_mime_part_get_encoding (mime_part) == CAMEL_MIME_PART_ENCODING_8BIT; - } - } - - return has_8bit; -} - -gboolean -camel_mime_message_has_8bit_parts (CamelMimeMessage *mime_message) -{ - GMimeContentField *content; - gboolean has_8bit = FALSE; - - content = camel_mime_part_get_content_type (CAMEL_MIME_PART (mime_message)); - - if (gmime_content_field_is_type (content, "multipart", "*")) { - CamelDataWrapper *wrapper; - CamelMultipart *multipart; - - wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (CAMEL_MIME_PART (mime_message))); - multipart = CAMEL_MULTIPART (wrapper); - - has_8bit = multipart_has_8bit_parts (multipart); - } else { - /* single-part message so just check this part */ - has_8bit = camel_mime_part_get_encoding (CAMEL_MIME_PART (mime_message)) == CAMEL_MIME_PART_ENCODING_8BIT; - } - - return has_8bit; -} - -static int -best_encoding (const guchar *text) -{ - guchar *ch; - int count = 0; - int total; - - for (ch = (guchar *) text; *ch; ch++) - if (*ch > (guchar) 127) - count++; - - total = (int) (ch - text); - - if ((float) count <= total * 0.17) - return CAMEL_MIME_PART_ENCODING_QUOTEDPRINTABLE; - else - return CAMEL_MIME_PART_ENCODING_BASE64; -} - -static void -multipart_encode_8bit_parts (CamelMultipart *multipart) -{ - int i, nparts; - - nparts = camel_multipart_get_number (multipart); - - for (i = 0; i < nparts; i++) { - GMimeContentField *content; - CamelMimePart *mime_part; - - mime_part = camel_multipart_get_part (multipart, i); - content = camel_mime_part_get_content_type (mime_part); - - if (gmime_content_field_is_type (content, "multipart", "*")) { - /* ...and the search for Spock continues */ - CamelDataWrapper *wrapper; - CamelMultipart *mpart; - - wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (mime_part)); - mpart = CAMEL_MULTIPART (wrapper); - - multipart_encode_8bit_parts (mpart); - } else { - /* re-encode this if necessary */ - gboolean is_8bit; - - is_8bit = camel_mime_part_get_encoding (mime_part) == CAMEL_MIME_PART_ENCODING_8BIT; - if (is_8bit) { - CamelStream *stream; - GByteArray *array; - guchar *content; - - array = g_byte_array_new (); - stream = camel_stream_mem_new_with_byte_array (array); - camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (mime_part), stream); - g_byte_array_append (array, "", 1); - - content = array->data; - g_byte_array_free (array, FALSE); - - camel_mime_part_set_encoding (mime_part, best_encoding (content)); - g_free (content); - camel_object_unref (CAMEL_OBJECT (stream)); - } - } - } -} - -void -camel_mime_message_encode_8bit_parts (CamelMimeMessage *mime_message) -{ - GMimeContentField *content; - - content = camel_mime_part_get_content_type (CAMEL_MIME_PART (mime_message)); - - if (gmime_content_field_is_type (content, "multipart", "*")) { - /* search for Spock */ - CamelDataWrapper *wrapper; - CamelMultipart *multipart; - - wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (CAMEL_MIME_PART (mime_message))); - multipart = CAMEL_MULTIPART (wrapper); - - multipart_encode_8bit_parts (multipart); - } else { - /* re-encode if we need to */ - gboolean is_8bit; - - is_8bit = camel_mime_part_get_encoding (CAMEL_MIME_PART (mime_message)) == CAMEL_MIME_PART_ENCODING_8BIT; - if (is_8bit) { - /* FIXME: is there a better way of doing this? */ - CamelStream *stream; - GByteArray *array; - guchar *content; - - array = g_byte_array_new (); - stream = camel_stream_mem_new_with_byte_array (array); - camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (CAMEL_MIME_PART (mime_message)), stream); - g_byte_array_append (array, "", 1); - - content = array->data; - g_byte_array_free (array, FALSE); - - camel_mime_part_set_encoding (CAMEL_MIME_PART (mime_message), best_encoding (content)); - g_free (content); - camel_object_unref (CAMEL_OBJECT (stream)); - } - } -} diff --git a/camel/camel-mime-message.h b/camel/camel-mime-message.h deleted file mode 100644 index 33436c6dad..0000000000 --- a/camel/camel-mime-message.h +++ /dev/null @@ -1,123 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */ -/* camelMimeMessage.h : class for a mime message - * - * Authors: Bertrand Guiheneuf <bertrand@helixcode.com> - * Michael Zucchi <notzed@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_MIME_MESSAGE_H -#define CAMEL_MIME_MESSAGE_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-mime-part.h> -#include <camel/camel-mime-utils.h> -#include <camel/camel-internet-address.h> - -#define CAMEL_RECIPIENT_TYPE_TO "To" -#define CAMEL_RECIPIENT_TYPE_CC "Cc" -#define CAMEL_RECIPIENT_TYPE_BCC "Bcc" - - -#define CAMEL_MIME_MESSAGE_TYPE (camel_mime_message_get_type ()) -#define CAMEL_MIME_MESSAGE(obj) (CAMEL_CHECK_CAST((obj), CAMEL_MIME_MESSAGE_TYPE, CamelMimeMessage)) -#define CAMEL_MIME_MESSAGE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_MIME_MESSAGE_TYPE, CamelMimeMessageClass)) -#define CAMEL_IS_MIME_MESSAGE(o) (CAMEL_CHECK_TYPE((o), CAMEL_MIME_MESSAGE_TYPE)) - - -/* specify local time */ -#define CAMEL_MESSAGE_DATE_CURRENT (~0) - -struct _CamelMimeMessage -{ - CamelMimePart parent_object; - - /* header fields */ - time_t date; - int date_offset; /* GMT offset */ - char *date_str; /* cached copy of date string */ - - gchar *subject; - gchar *reply_to; - - gchar *from; - - GHashTable *recipients; /* hash table of CamelInternetAddress's */ -}; - -typedef struct { - CamelMimePartClass parent_class; - - /* Virtual methods */ - -} CamelMimeMessageClass; - - - -/* Standard Camel function */ -CamelType camel_mime_message_get_type (void); - - -/* public methods */ -CamelMimeMessage * camel_mime_message_new (void); - - -void camel_mime_message_set_date (CamelMimeMessage *mime_message, time_t date, int offset); -void camel_mime_message_get_date (CamelMimeMessage *mime_message, time_t *date, int *offset); -char *camel_mime_message_get_date_string (CamelMimeMessage *mime_message); - -const gchar * camel_mime_message_get_received_date (CamelMimeMessage *mime_message); -const gchar * camel_mime_message_get_sent_date (CamelMimeMessage *mime_message); -void camel_mime_message_set_reply_to (CamelMimeMessage *mime_message, - const gchar *reply_to); -const gchar * camel_mime_message_get_reply_to (CamelMimeMessage *mime_message); -void camel_mime_message_set_subject (CamelMimeMessage *mime_message, - const gchar *subject); -const gchar * camel_mime_message_get_subject (CamelMimeMessage *mime_message); -void camel_mime_message_set_from (CamelMimeMessage *mime_message, - const gchar *from); -const gchar * camel_mime_message_get_from (CamelMimeMessage *mime_message); - - -void camel_mime_message_add_recipient (CamelMimeMessage *mime_message, - const char *type, const char *name, const char *address); -void camel_mime_message_remove_recipient_address (CamelMimeMessage *mime_message, - const char *type, const char *address); -void camel_mime_message_remove_recipient_name (CamelMimeMessage *mime_message, - const char *type, const char *name); - -const CamelInternetAddress *camel_mime_message_get_recipients (CamelMimeMessage *mime_message, - const char *type); - - -/* utility functions */ -gboolean camel_mime_message_has_8bit_parts (CamelMimeMessage *mime_message); -void camel_mime_message_encode_8bit_parts (CamelMimeMessage *mime_message); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MIME_MESSAGE_H */ diff --git a/camel/camel-mime-parser.c b/camel/camel-mime-parser.c deleted file mode 100644 index efa808170e..0000000000 --- a/camel/camel-mime-parser.c +++ /dev/null @@ -1,1902 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -/* What should hopefully be a fast mail parser */ - -/* Do not change this code without asking me (Michael Zucchi) first - - There is almost always a reason something was done a certain way. - */ - -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <unistd.h> - -#include <string.h> - -#include <stdio.h> -#include <errno.h> - -#include <unicode.h> - -#include <regex.h> -#include <ctype.h> - -#include <glib.h> -#include "camel-mime-parser.h" -#include "camel-mime-utils.h" -#include "camel-mime-filter.h" -#include "camel-stream.h" -#include "camel-seekable-stream.h" - -#define r(x) -#define h(x) -#define c(x) -#define d(x) - -/*#define PURIFY*/ - -#define MEMPOOL - -#define STRUCT_ALIGN 4 - -#ifdef PURIFY -int inend_id = -1, - inbuffer_id = -1; -#endif - -#if 0 -extern int strdup_count; -extern int malloc_count; -extern int free_count; - -#define g_strdup(x) (strdup_count++, g_strdup(x)) -#define g_malloc(x) (malloc_count++, g_malloc(x)) -#define g_free(x) (free_count++, g_free(x)) -#endif - -#ifdef MEMPOOL -typedef struct _MemPoolNode { - struct _MemPoolNode *next; - - int free; - char data[1]; -} MemPoolNode; - -typedef struct _MemPoolThresholdNode { - struct _MemPoolThresholdNode *next; - char data[1]; -} MemPoolThresholdNode; - -typedef struct _MemPool { - int blocksize; - int threshold; - struct _MemPoolNode *blocks; - struct _MemPoolThresholdNode *threshold_blocks; -} MemPool; - -MemPool *mempool_new(int blocksize, int threshold); -void *mempool_alloc(MemPool *pool, int size); -void mempool_flush(MemPool *pool, int freeall); -void mempool_free(MemPool *pool); - -MemPool *mempool_new(int blocksize, int threshold) -{ - MemPool *pool; - - pool = g_malloc(sizeof(*pool)); - if (threshold >= blocksize) - threshold = blocksize * 2 / 3; - pool->blocksize = blocksize; - pool->threshold = threshold; - pool->blocks = NULL; - pool->threshold_blocks = NULL; - return pool; -} - -void *mempool_alloc(MemPool *pool, int size) -{ - size = (size + STRUCT_ALIGN) & (~(STRUCT_ALIGN-1)); - if (size>=pool->threshold) { - MemPoolThresholdNode *n; - - n = g_malloc(sizeof(*n) - sizeof(char) + size); - n->next = pool->threshold_blocks; - pool->threshold_blocks = n; - return &n->data[0]; - } else { - MemPoolNode *n; - - n = pool->blocks; - while (n) { - if (n->free >= size) { - n->free -= size; - return &n->data[n->free]; - } - n = n->next; - } - - n = g_malloc(sizeof(*n) - sizeof(char) + pool->blocksize); - n->next = pool->blocks; - pool->blocks = n; - n->free = pool->blocksize - size; - return &n->data[n->free]; - } -} - -void mempool_flush(MemPool *pool, int freeall) -{ - MemPoolThresholdNode *tn, *tw; - MemPoolNode *pw, *pn; - - tw = pool->threshold_blocks; - while (tw) { - tn = tw->next; - g_free(tw); - tw = tn; - } - pool->threshold_blocks = NULL; - - if (freeall) { - pw = pool->blocks; - while (pw) { - pn = pw->next; - g_free(pw); - pw = pn; - } - pool->blocks = NULL; - } else { - pw = pool->blocks; - while (pw) { - pw->free = pool->blocksize; - pw = pw->next; - } - } -} - -void mempool_free(MemPool *pool) -{ - if (pool) { - mempool_flush(pool, 1); - g_free(pool); - } -} - -#endif - - - - - - - - - - - - -#define SCAN_BUF 4096 /* size of read buffer */ -#define SCAN_HEAD 128 /* headroom guaranteed to be before each read buffer */ - -/* a little hacky, but i couldn't be bothered renaming everything */ -#define _header_scan_state _CamelMimeParserPrivate -#define _PRIVATE(o) (((CamelMimeParser *)(o))->priv) - -struct _header_scan_state { - - /* global state */ - - enum _header_state state; - - /* for building headers during scanning */ - char *outbuf; - char *outptr; - char *outend; - - int fd; /* input for a fd input */ - CamelStream *stream; /* or for a stream */ - - /* for scanning input buffers */ - char *realbuf; /* the real buffer, SCAN_HEAD*2 + SCAN_BUF bytes */ - char *inbuf; /* points to a subset of the allocated memory, the underflow */ - char *inptr; /* (upto SCAN_HEAD) is for use by filters so they dont copy all data */ - char *inend; - - int atleast; - - int seek; /* current offset to start of buffer */ - int unstep; /* how many states to 'unstep' (repeat the current state) */ - - int midline; /* are we mid-line interrupted? */ - int scan_from; /* do we care about From lines? */ - - int start_of_from; /* where from started */ - int start_of_headers; /* where headers started from the last scan */ - - int header_start; /* start of last header, or -1 */ - - /* filters to apply to all content before output */ - int filterid; /* id of next filter */ - struct _header_scan_filter *filters; - - /* per message/part info */ - struct _header_scan_stack *parts; - -}; - -struct _header_scan_stack { - struct _header_scan_stack *parent; - - enum _header_state savestate; /* state at invocation of this part */ - -#ifdef MEMPOOL - MemPool *pool; /* memory pool to keep track of headers/etc at this level */ -#endif - struct _header_raw *headers; /* headers for this part */ - - struct _header_content_type *content_type; - - /* I dont use GString's casue you can't efficiently append a buffer to them */ - GByteArray *pretext; /* for multipart types, save the pre-boundary data here */ - GByteArray *posttext; /* for multipart types, save the post-boundary data here */ - int prestage; /* used to determine if it is a pre-boundary or post-boundary data segment */ - - char *boundary; /* for multipart/ * boundaries, including leading -- and trailing -- for the final part */ - int boundarylen; /* length of boundary, including leading -- */ -}; - -struct _header_scan_filter { - struct _header_scan_filter *next; - int id; - CamelMimeFilter *filter; -}; - -static void folder_scan_step(struct _header_scan_state *s, char **databuffer, int *datalength); -static void folder_scan_drop_step(struct _header_scan_state *s); -static int folder_scan_init_with_fd(struct _header_scan_state *s, int fd); -static int folder_scan_init_with_stream(struct _header_scan_state *s, CamelStream *stream); -static struct _header_scan_state *folder_scan_init(void); -static void folder_scan_close(struct _header_scan_state *s); -static struct _header_scan_stack *folder_scan_content(struct _header_scan_state *s, int *lastone, char **data, int *length); -static struct _header_scan_stack *folder_scan_header(struct _header_scan_state *s, int *lastone); -static int folder_scan_skip_line(struct _header_scan_state *s); -static off_t folder_seek(struct _header_scan_state *s, off_t offset, int whence); -static off_t folder_tell(struct _header_scan_state *s); -#ifdef MEMPOOL -static void header_append_mempool(struct _header_scan_state *s, struct _header_scan_stack *h, char *header, int offset); -#endif - -static void camel_mime_parser_class_init (CamelMimeParserClass *klass); -static void camel_mime_parser_init (CamelMimeParser *obj); - -static char *states[] = { - "HSCAN_INITIAL", - "HSCAN_FROM", /* got 'From' line */ - "HSCAN_HEADER", /* toplevel header */ - "HSCAN_BODY", /* scanning body of message */ - "HSCAN_MULTIPART", /* got multipart header */ - "HSCAN_MESSAGE", /* rfc822/news message */ - - "HSCAN_PART", /* part of a multipart */ - "<invalid>", - - "HSCAN_EOF", /* end of file */ - "HSCAN_FROM_END", - "HSCAN_HEAER_END", - "HSCAN_BODY_END", - "HSCAN_MULTIPART_END", - "HSCAN_MESSAGE_END", -}; - -static CamelObjectClass *camel_mime_parser_parent; - -static void -camel_mime_parser_class_init (CamelMimeParserClass *klass) -{ - camel_mime_parser_parent = camel_type_get_global_classfuncs (camel_object_get_type ()); -} - -static void -camel_mime_parser_init (CamelMimeParser *obj) -{ - struct _header_scan_state *s; - - s = folder_scan_init(); - _PRIVATE(obj) = s; -} - -static void -camel_mime_parser_finalise(CamelObject *o) -{ - struct _header_scan_state *s = _PRIVATE(o); -#ifdef PURIFY - purify_watch_remove_all(); -#endif - folder_scan_close(s); -} - -CamelType -camel_mime_parser_get_type (void) -{ - static CamelType type = CAMEL_INVALID_TYPE; - - if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register (camel_object_get_type (), "CamelMimeParser", - sizeof (CamelMimeParser), - sizeof (CamelMimeParserClass), - (CamelObjectClassInitFunc) camel_mime_parser_class_init, - NULL, - (CamelObjectInitFunc) camel_mime_parser_init, - (CamelObjectFinalizeFunc) camel_mime_parser_finalise); - } - - return type; -} - -/** - * camel_mime_parser_new: - * - * Create a new CamelMimeParser object. - * - * Return value: A new CamelMimeParser widget. - **/ -CamelMimeParser * -camel_mime_parser_new (void) -{ - CamelMimeParser *new = CAMEL_MIME_PARSER ( camel_object_new (camel_mime_parser_get_type ())); - return new; -} - - -/** - * camel_mime_parser_filter_add: - * @m: - * @mf: - * - * Add a filter that will be applied to any body content before it is passed - * to the caller. Filters may be pipelined to perform multi-pass operations - * on the content, and are applied in the order they were added. - * - * Note that filters are only applied to the body content of messages, and once - * a filter has been set, all content returned by a filter_step() with a state - * of HSCAN_BODY will have passed through the filter. - * - * Return value: An id that may be passed to filter_remove() to remove - * the filter, or -1 if the operation failed. - **/ -int -camel_mime_parser_filter_add(CamelMimeParser *m, CamelMimeFilter *mf) -{ - struct _header_scan_state *s = _PRIVATE(m); - struct _header_scan_filter *f, *new; - - new = g_malloc(sizeof(*new)); - new->filter = mf; - new->id = s->filterid++; - if (s->filterid == -1) - s->filterid++; - new->next = 0; - camel_object_ref((CamelObject *)mf); - - /* yes, this is correct, since 'next' is the first element of the struct */ - f = (struct _header_scan_filter *)&s->filters; - while (f->next) - f = f->next; - f->next = new; - return new->id; -} - -/** - * camel_mime_parser_filter_remove: - * @m: - * @id: - * - * Remove a processing filter from the pipeline. There is no - * restriction on the order the filters can be removed. - **/ -void -camel_mime_parser_filter_remove(CamelMimeParser *m, int id) -{ - struct _header_scan_state *s = _PRIVATE(m); - struct _header_scan_filter *f, *old; - - f = (struct _header_scan_filter *)&s->filters; - while (f && f->next) { - old = f->next; - if (old->id == id) { - camel_object_unref((CamelObject *)old->filter); - f->next = old->next; - g_free(old); - /* there should only be a single matching id, but - scan the whole lot anyway */ - } - f = f->next; - } -} - -/** - * camel_mime_parser_header: - * @m: - * @name: Name of header. - * @offset: Pointer that can receive the offset of the header in - * the stream from the start of parsing. - * - * Lookup a header by name. - * - * Return value: The header value, or NULL if the header is not - * defined. - **/ -const char * -camel_mime_parser_header(CamelMimeParser *m, const char *name, int *offset) -{ - struct _header_scan_state *s = _PRIVATE(m); - - if (s->parts && - s->parts->headers) { - return header_raw_find(&s->parts->headers, name, offset); - } - return NULL; -} - -/** - * camel_mime_parser_headers_raw: - * @m: - * - * Get the list of the raw headers which are defined for the - * current state of the parser. These headers are valid - * until the next call to parser_step(), or parser_drop_step(). - * - * Return value: The raw headers, or NULL if there are no headers - * defined for the current part or state. These are READ ONLY. - **/ -struct _header_raw * -camel_mime_parser_headers_raw(CamelMimeParser *m) -{ - struct _header_scan_state *s = _PRIVATE(m); - - if (s->parts) - return s->parts->headers; - return NULL; -} - -static const char * -byte_array_to_string(GByteArray *array) -{ - if (array == NULL) - return NULL; - - if (array->len == 0 || array->data[array->len-1] != '\0') - g_byte_array_append(array, "", 1); - - return array->data; -} - -/** - * camel_mime_parser_preface: - * @m: - * - * Retrieve the preface text for the current multipart. - * Can only be used when the state is HSCAN_MULTIPART_END. - * - * Return value: The preface text, or NULL if there wasn't any. - **/ -const char * -camel_mime_parser_preface(CamelMimeParser *m) -{ - struct _header_scan_state *s = _PRIVATE(m); - - if (s->parts) - return byte_array_to_string(s->parts->pretext); - - return NULL; -} - -/** - * camel_mime_parser_postface: - * @m: - * - * Retrieve the postface text for the current multipart. - * Only returns valid data when the current state if - * HSCAN_MULTIPART_END. - * - * Return value: The postface text, or NULL if there wasn't any. - **/ -const char * -camel_mime_parser_postface(CamelMimeParser *m) -{ - struct _header_scan_state *s = _PRIVATE(m); - - if (s->parts) - return byte_array_to_string(s->parts->posttext); - - return NULL; -} - - -/** - * camel_mime_parser_init_with_fd: - * @m: - * @fd: A valid file descriptor. - * - * Initialise the scanner with an fd. The scanner's offsets - * will be relative to the current file position of the file - * descriptor. As a result, seekable descritors should - * be seeked using the parser seek functions. - * - * An initial buffer will be read from the file descriptor - * immediately, although no parsing will occur. - * - * Return value: Returns -1 on error. - **/ -int -camel_mime_parser_init_with_fd(CamelMimeParser *m, int fd) -{ - struct _header_scan_state *s = _PRIVATE(m); - - return folder_scan_init_with_fd(s, fd); -} - -/** - * camel_mime_parser_init_with_stream: - * @m: - * @stream: - * - * Initialise the scanner with a source stream. The scanner's - * offsets will be relative to the current file position of - * the stream. As a result, seekable streams should only - * be seeked using the parser seek function. - * - * An initial buffer will be read from the stream - * immediately, although no parsing will occur. - * - * Return value: -1 on error. - **/ -int -camel_mime_parser_init_with_stream(CamelMimeParser *m, CamelStream *stream) -{ - struct _header_scan_state *s = _PRIVATE(m); - - return folder_scan_init_with_stream(s, stream); -} - -/** - * camel_mime_parser_scan_from: - * @m: - * @scan_from: #TRUE if the scanner should scan From lines. - * - * Tell the scanner if it should scan "^From " lines or not. - * - * If the scanner is scanning from lines, two additional - * states HSCAN_FROM and HSCAN_FROM_END will be returned - * to the caller during parsing. - **/ -void -camel_mime_parser_scan_from(CamelMimeParser *m, int scan_from) -{ - struct _header_scan_state *s = _PRIVATE(m); - s->scan_from = scan_from; -} - -/** - * camel_mime_parser_content_type: - * @m: - * - * Get the content type defined in the current part. - * - * Return value: A content_type structure, or NULL if there - * is no content-type defined for this part of state of the - * parser. - **/ -struct _header_content_type * -camel_mime_parser_content_type(CamelMimeParser *m) -{ - struct _header_scan_state *s = _PRIVATE(m); - - /* FIXME: should this search up until it's found the 'right' - content-type? can it? */ - if (s->parts) - return s->parts->content_type; - return NULL; -} - -/** - * camel_mime_parser_unstep: - * @m: - * - * Cause the last step operation to repeat itself. If this is - * called repeated times, then the same step will be repeated - * that many times. - * - * Note that it is not possible to scan back using this function, - * only to have a way of peeking the next state. - **/ -void camel_mime_parser_unstep(CamelMimeParser *m) -{ - struct _header_scan_state *s = _PRIVATE(m); - - s->unstep++; -} - -/** - * camel_mime_parser_drop_step: - * @m: - * - * Drop the last step call. This should only be used - * in conjunction with seeking of the stream as the - * stream may be in an undefined state relative to the - * state of the parser. - * - * Use this call with care. - **/ -void camel_mime_parser_drop_step(CamelMimeParser *m) -{ - struct _header_scan_state *s = _PRIVATE(m); - - s->unstep = 0; - folder_scan_drop_step(s); -} - -/** - * camel_mime_parser_step: - * @m: - * @databuffer: Pointer to accept a pointer to the data - * associated with this step (if any). May be #NULL, - * in which case datalength is also ingored. - * @datalength: Pointer to accept a pointer to the data - * length associated with this step (if any). - * - * Parse the next part of the MIME message. If _unstep() - * has been called, then continue to return the same state - * for that many calls. - * - * If the step is HSCAN_BODY then the databuffer and datalength - * pointers will be setup to point to the internal data buffer - * of the scanner and may be processed as required. Any - * filters will have already been applied to this data. - * - * Refer to the state diagram elsewhere for a full listing of - * the states an application is gauranteed to get from the - * scanner. - * - * Return value: The current new state of the parser - * is returned. - **/ -enum _header_state -camel_mime_parser_step(CamelMimeParser *m, char **databuffer, int *datalength) -{ - struct _header_scan_state *s = _PRIVATE(m); - - d(printf("OLD STATE: '%s' :\n", states[s->state])); - - if (s->unstep <= 0) { - char *dummy; - int dummylength; - - if (databuffer == NULL) { - databuffer = &dummy; - datalength = &dummylength; - } - - folder_scan_step(s, databuffer, datalength); - } else - s->unstep--; - - d(printf("NEW STATE: '%s' :\n", states[s->state])); - - return s->state; -} - -/** - * camel_mime_parser_tell: - * @m: - * - * Return the current scanning offset. The meaning of this - * value will depend on the current state of the parser. - * - * An incomplete listing of the states: - * - * HSCAN_INITIAL, The start of the current message. - * HSCAN_HEADER, HSCAN_MESSAGE, HSCAN_MULTIPART, the character - * position immediately after the end of the header. - * HSCAN_BODY, Position within the message of the start - * of the current data block. - * HSCAN_*_END, The position of the character starting - * the next section of the scan (the last position + 1 of - * the respective current state). - * - * Return value: See above. - **/ -off_t camel_mime_parser_tell(CamelMimeParser *m) -{ - struct _header_scan_state *s = _PRIVATE(m); - - return folder_tell(s); -} - -/** - * camel_mime_parser_tell_start_headers: - * @m: - * - * Find out the position within the file of where the - * headers started, this is cached by the parser - * at the time. - * - * Return value: The header start position, or -1 if - * no headers were scanned in the current state. - **/ -off_t camel_mime_parser_tell_start_headers(CamelMimeParser *m) -{ - struct _header_scan_state *s = _PRIVATE(m); - - return s->start_of_headers; -} - -/** - * camel_mime_parser_tell_start_from: - * @m: - * - * If the parser is scanning From lines, then this returns - * the position of the start of the From line. - * - * Return value: The start of the from line, or -1 if there - * was no From line, or From lines are not being scanned. - **/ -off_t camel_mime_parser_tell_start_from(CamelMimeParser *m) -{ - struct _header_scan_state *s = _PRIVATE(m); - - return s->start_of_from; -} - -/** - * camel_mime_parser_seek: - * @m: - * @off: Number of bytes to offset the seek by. - * @whence: SEEK_SET, SEEK_CUR, SEEK_END - * - * Reset the source position to a known value. - * - * Note that if the source stream/descriptor was not - * positioned at 0 to begin with, and an absolute seek - * is specified (whence != SEEK_CUR), then the seek - * position may not match the desired seek position. - * - * Return value: The new seek offset, or -1 on - * an error (for example, trying to seek on a non-seekable - * stream or file descriptor). - **/ -off_t camel_mime_parser_seek(CamelMimeParser *m, off_t off, int whence) -{ - struct _header_scan_state *s = _PRIVATE(m); - return folder_seek(s, off, whence); -} - -/** - * camel_mime_parser_state: - * @m: - * - * Get the current parser state. - * - * Return value: The current parser state. - **/ -enum _header_state camel_mime_parser_state(CamelMimeParser *m) -{ - struct _header_scan_state *s = _PRIVATE(m); - return s->state; -} - -/** - * camel_mime_parser_stream: - * @m: - * - * Get the stream, if any, the parser has been initialised - * with. May be used to setup sub-streams, but should not - * be read from directly (without saving and restoring - * the seek position in between). - * - * Return value: The stream from _init_with_stream(), or NULL - * if the parser is reading from a file descriptor or is - * uninitialised. - **/ -CamelStream *camel_mime_parser_stream(CamelMimeParser *m) -{ - struct _header_scan_state *s = _PRIVATE(m); - return s->stream; -} - -/** - * camel_mime_parser_fd: - * @m: - * - * Return the file descriptor, if any, the parser has been - * initialised with. - * - * Should not be read from unless the parser it to terminate, - * or the seek offset can be reset before the next parse - * step. - * - * Return value: The file descriptor or -1 if the parser - * is reading from a stream or has not been initialised. - **/ -int camel_mime_parser_fd(CamelMimeParser *m) -{ - struct _header_scan_state *s = _PRIVATE(m); - return s->fd; -} - -/* ********************************************************************** */ -/* Implementation */ -/* ********************************************************************** */ - -/* read the next bit of data, ensure there is enough room 'atleast' bytes */ -static int -folder_read(struct _header_scan_state *s) -{ - int len; - int inoffset; - - if (s->inptr<s->inend-s->atleast) - return s->inend-s->inptr; -#ifdef PURIFY - purify_watch_remove(inend_id); - purify_watch_remove(inbuffer_id); -#endif - /* check for any remaning bytes (under the atleast limit( */ - inoffset = s->inend - s->inptr; - if (inoffset>0) { - memcpy(s->inbuf, s->inptr, inoffset); - } - if (s->stream) { - len = camel_stream_read(s->stream, s->inbuf+inoffset, SCAN_BUF-inoffset); - } else { - len = read(s->fd, s->inbuf+inoffset, SCAN_BUF-inoffset); - } - r(printf("read %d bytes, offset = %d\n", len, inoffset)); - if (len>=0) { - /* add on the last read block */ - s->seek += s->inptr - s->inbuf; - s->inptr = s->inbuf; - s->inend = s->inbuf+len+inoffset; - r(printf("content = %d '%.*s'\n",s->inend - s->inptr, s->inend - s->inptr, s->inptr)); - } - - g_assert(s->inptr<=s->inend); -#ifdef PURIFY - inend_id = purify_watch(&s->inend); - inbuffer_id = purify_watch_n(s->inend+1, SCAN_HEAD-1, "rw"); -#endif - r(printf("content = %d '%.*s'\n", s->inend - s->inptr, s->inend - s->inptr, s->inptr)); - /* set a sentinal, for the inner loops to check against */ - s->inend[0] = '\n'; - return s->inend-s->inptr; -} - -/* return the current absolute position of the data pointer */ -static off_t -folder_tell(struct _header_scan_state *s) -{ - return s->seek + (s->inptr - s->inbuf); -} - -/* - need some way to prime the parser state, so this actually works for - other than top-level messages -*/ -static off_t -folder_seek(struct _header_scan_state *s, off_t offset, int whence) -{ - off_t newoffset; - int len; - - if (s->stream) { - if (CAMEL_IS_SEEKABLE_STREAM(s->stream)) { - /* NOTE: assumes whence seekable stream == whence libc, which is probably - the case (or bloody well should've been) */ - newoffset = camel_seekable_stream_seek((CamelSeekableStream *)s->stream, offset, whence); - } else { - newoffset = -1; - errno = EINVAL; - } - } else { - newoffset = lseek(s->fd, offset, whence); - } -#ifdef PURIFY - purify_watch_remove(inend_id); - purify_watch_remove(inbuffer_id); -#endif - if (newoffset != -1) { - s->seek = newoffset; - s->inptr = s->inbuf; - s->inend = s->inbuf; - if (s->stream) - len = camel_stream_read(s->stream, s->inbuf, SCAN_BUF); - else - len = read(s->fd, s->inbuf, SCAN_BUF); - if (len>=0) { - s->inend = s->inbuf+len; - s->inend[0] = '\n'; - } else - newoffset = -1; - } -#ifdef PURIFY - inend_id = purify_watch(&s->inend); - inbuffer_id = purify_watch_n(s->inend+1, SCAN_HEAD-1, "rw"); -#endif - return newoffset; -} - -static void -folder_push_part(struct _header_scan_state *s, struct _header_scan_stack *h) -{ - h->parent = s->parts; - s->parts = h; -} - -static void -folder_pull_part(struct _header_scan_state *s) -{ - struct _header_scan_stack *h; - - h = s->parts; - if (h) { - s->parts = h->parent; - g_free(h->boundary); -#ifdef MEMPOOL - mempool_free(h->pool); -#else - header_raw_clear(&h->headers); -#endif - header_content_type_unref(h->content_type); - if (h->pretext) - g_byte_array_free(h->pretext, TRUE); - if (h->posttext) - g_byte_array_free(h->posttext, TRUE); - g_free(h); - } else { - g_warning("Header stack underflow!\n"); - } -} - -static int -folder_scan_skip_line(struct _header_scan_state *s) -{ - int atleast = s->atleast; - register char *inptr, *inend, c; - int len; - - s->atleast = 1; - - while ( (len = folder_read(s)) > 0 && len > s->atleast) { /* ensure we have at least enough room here */ - inptr = s->inptr; - inend = s->inend-1; - - c = -1; - while (inptr<inend - && (c = *inptr++)!='\n') - ; - - s->inptr = inptr; - - if (c=='\n') { - s->atleast = atleast; - return 0; - } - } - - s->atleast = atleast; - - return -1; /* not found */ -} - -/* TODO: Is there any way to make this run faster? It gets called a lot ... */ -static struct _header_scan_stack * -folder_boundary_check(struct _header_scan_state *s, const char *boundary, int *lastone) -{ - struct _header_scan_stack *part; - int len = s->atleast-2; /* make sure we dont access past the buffer */ - - h(printf("checking boundary marker upto %d bytes\n", len)); - part = s->parts; - while (part) { - h(printf(" boundary: %s\n", part->boundary)); - h(printf(" against: '%.*s'\n", len, boundary)); - if (part->boundary - && part->boundarylen <= len - && memcmp(boundary, part->boundary, part->boundarylen)==0) { - h(printf("matched boundary: %s\n", part->boundary)); - /* again, make sure we're in range */ - if (part->boundarylen <= len+2) { - h(printf("checking lastone\n")); - *lastone = (boundary[part->boundarylen]=='-' - && boundary[part->boundarylen+1]=='-'); - } else { - h(printf("not enough room to check last one?\n")); - *lastone = FALSE; - } - /*printf("ok, we found it! : %s \n", (*lastone)?"Last one":"More to come?");*/ - return part; - } - part = part->parent; - } - return NULL; -} - -#ifdef MEMPOOL -static void -header_append_mempool(struct _header_scan_state *s, struct _header_scan_stack *h, char *header, int offset) -{ - struct _header_raw *l, *n; - char *content; - - content = strchr(header, ':'); - if (content) { - register int len; - n = mempool_alloc(h->pool, sizeof(*n)); - n->next = NULL; - - len = content-header; - n->name = mempool_alloc(h->pool, len+1); - memcpy(n->name, header, len); - n->name[len] = 0; - - content++; - - len = s->outptr - content; - n->value = mempool_alloc(h->pool, len+1); - memcpy(n->value, content, len); - n->value[len] = 0; - - n->offset = offset; - - l = (struct _header_raw *)&h->headers; - while (l->next) { - l = l->next; - } - l->next = n; - } - -} - -#define header_raw_append_parse(a, b, c) (header_append_mempool(s, h, b, c)) - -#endif - -/* Copy the string start->inptr into the header buffer (s->outbuf), - grow if necessary - and track the start offset of the header */ -/* Basically an optimised version of g_byte_array_append() */ -#define header_append(s, start, inptr) \ -{ \ - register int headerlen = inptr-start; \ - \ - if (headerlen >= (s->outend - s->outptr)) { \ - register char *outnew; \ - register int len = ((s->outend - s->outbuf)+headerlen)*2+1; \ - outnew = g_realloc(s->outbuf, len); \ - s->outptr = s->outptr - s->outbuf + outnew; \ - s->outbuf = outnew; \ - s->outend = outnew + len; \ - } \ - memcpy(s->outptr, start, headerlen); \ - s->outptr += headerlen; \ - if (s->header_start == -1) \ - s->header_start = (start-s->inbuf) + s->seek; \ -} - -static struct _header_scan_stack * -folder_scan_header(struct _header_scan_state *s, int *lastone) -{ - int atleast = s->atleast; - char *start; - int len; - struct _header_scan_stack *part, *overpart = s->parts; - struct _header_scan_stack *h; - char *inend; - register char *inptr; - - h(printf("scanning first bit\n")); - - h = g_malloc0(sizeof(*h)); -#ifdef MEMPOOL - h->pool = mempool_new(8192, 4096); -#endif - - /* FIXME: this info should be cached ? */ - part = s->parts; - s->atleast = 5; - while (part) { - if (part->boundary) - s->atleast = MAX(s->atleast, part->boundarylen+2); - part = part->parent; - } -#if 0 - s->atleast = MAX(s->atleast, 5); - if (s->parts) - s->atleast = MAX(s->atleast, s->parts->boundarylen+2); -#endif - - *lastone = FALSE; -retry: - - while ((len = folder_read(s))>0 && len >= s->atleast) { /* ensure we have at least enough room here */ - inptr = s->inptr; - inend = s->inend-s->atleast; - - while (inptr<=inend) { - /*printf(" '%.20s'\n", inptr);*/ - - start = inptr; - - if (!s->midline) { - if ((part = folder_boundary_check(s, inptr, lastone))) { - if ((s->outptr>s->outbuf) || (inptr-start)) - goto header_truncated; /* may not actually be truncated */ - - goto normal_exit; - } - - /* Replace any number of spaces and tabs at the start of the line with - * a single space. - */ - if (*start == ' ' || *start == '\t') { - do - start++; - while (*start == ' ' || *start == '\t'); - start--; - *start = ' '; - } - } - - /* goto next line */ - while ((*inptr++)!='\n') - ; - - g_assert(inptr<=s->inend+1); - - header_append(s, start, inptr-1); - - /* check against the real buffer end, not our 'atleast limited' end */ - /* also make sure we have at least 1 char lookahead, so even if we found a \n at - the end, well, make out we didn't, and re-scan it next pass */ - if (inptr>=s->inend) { - inptr--; - s->midline = TRUE; - } else { - s->midline = FALSE; - } - - h(printf("midline = %s\n", s->midline?"TRUE":"FALSE")); - h(printf("outbuf[0] = %02x '%c' oubuf[1] = %02x '%c'\n", - s->outbuf[0], isprint(s->outbuf[0])?s->outbuf[0]:'.', - s->outbuf[1], isprint(s->outbuf[1])?s->outbuf[1]:'.')); - h(printf("inptr[0] = %02x '%c' inptr[1] = %02x '%c'\n", - inptr[0], isprint(inptr[0])?inptr[0]:'.', - inptr[1], isprint(inptr[1])?inptr[1]:'.')); - - if (!s->midline - && !(inptr[0] == ' ' || inptr[0] == '\t')) { - h(printf("ok, checking\n")); - if (s->outbuf == s->outptr - || s->outbuf[0] == '\n' - || (s->outbuf[0] == '\r' && s->outbuf[1]=='\n')) { - h(printf("header done?\n")); - goto header_done; - } - - /* we always have at least _1_ char here ... */ - if (s->outptr > s->outbuf && s->outptr[-1] == '\n') - s->outptr--; - s->outptr[0] = 0; - - d(printf("header '%.10s' at %d\n", s->outbuf, s->header_start)); - - header_raw_append_parse(&h->headers, s->outbuf, s->header_start); - - if (inptr[0]=='\n' - || (inptr[0] == '\r' && inptr[1]=='\n')) { - inptr++; - goto header_done; - } - s->outptr = s->outbuf; - s->header_start = -1; - } - } - s->inptr = inptr; - } - - /* ok, we're at the end of the data, just make sure we're not missing out some small - truncated header markers */ - if (overpart) { - overpart = overpart->parent; - while (overpart) { - if (overpart->boundary && (overpart->boundarylen+2) < s->atleast) { - s->atleast = overpart->boundarylen+2; - h(printf("Retrying next smaller part ...\n")); - goto retry; - } - overpart = overpart->parent; - } - } - - if ((s->outptr > s->outbuf) || s->inend > s->inptr) { - start = s->inptr; - inptr = s->inend; - goto header_truncated; - } - - s->atleast = atleast; - - return h; - -header_truncated: - - header_append(s, start, inptr); - - if (s->outptr>s->outbuf && s->outptr[-1] == '\n') - s->outptr--; - s->outptr[0] = 0; - - if (s->outbuf[0] == '\n' - || (s->outbuf[0] == '\r' && s->outbuf[1]=='\n')) { - goto header_done; - } - - header_raw_append_parse(&h->headers, s->outbuf, s->header_start); - -header_done: - part = s->parts; - - s->outptr = s->outbuf; -normal_exit: - s->inptr = inptr; - s->atleast = atleast; - s->header_start = -1; - return h; -} - -static struct _header_scan_stack * -folder_scan_content(struct _header_scan_state *s, int *lastone, char **data, int *length) -{ - int atleast = s->atleast; - register char *inptr; - char *inend; - char *start; - int len; - struct _header_scan_stack *part, *overpart = s->parts; - int already_packed = FALSE; - int onboundary = FALSE; - - c(printf("scanning content\n")); - - /* FIXME: this info should be cached ? */ - part = s->parts; - s->atleast = 5; - while (part) { - if (part->boundary) { - c(printf("boundary: %s\n", part->boundary)); - s->atleast = MAX(s->atleast, part->boundarylen+2); - } - part = part->parent; - } -/* s->atleast = MAX(s->atleast, 5);*/ -#if 0 - if (s->parts) - s->atleast = MAX(s->atleast, s->parts->boundarylen+2); -#endif - *lastone = FALSE; - -retry: - c(printf("atleast = %d\n", s->atleast)); - - while ((len = folder_read(s))>0 && len >= s->atleast) { /* ensure we have at least enough room here */ - inptr = s->inptr; - inend = s->inend-s->atleast; - start = inptr; - - c(printf("inptr = %p, inend = %p\n", inptr, inend)); - - while (inptr<=inend) { - if (!s->midline - && (part = folder_boundary_check(s, inptr, lastone))) { - if ( (inptr-start) ) { - onboundary = TRUE; - goto content; - } - - goto normal_exit; - } - - /* goto the next line */ - while ((*inptr++)!='\n') - ; - - /* check against the real buffer end, not our 'atleast limited' end */ - if (inptr> s->inend) { - inptr--; - s->midline = TRUE; - } else { - s->midline = FALSE; - } - - g_assert(inptr<=s->inend); - } - - /* *sigh* so much for the beautiful simplicity of the code so far - here we - have the snot to deal with the nasty end-cases that come from the read-ahead - buffers we use */ - /* what this does, is if we are somewhere near the end of the buffer, - force it to the front, and re-read, ensuring we bunch as much together - as possible, for the final read, without copying too much of the time */ - /* make sure we dont loop forever, but also make sure we try smaller - boundaries, if there are any, so we dont miss any. */ - /* this is not needed for the header scanner, since it copies its own - data */ - c(printf("start offset = %d atleast = %d\n", start-s->inbuf, s->atleast)); - if (start > (s->inbuf + s->atleast)) { - /* force a re-scan of this data */ - s->inptr = start; - if (already_packed) - goto smaller_boundary; - c(printf("near the end, try and bunch things up a bit first\n")); - already_packed = TRUE; - } else { - c(printf("dumping what i've got ...\n")); - /* what would be nice here, is if that we're at eof, we bunch the last - little bit in the same content, but i dont think this is easy */ - goto content_mid; - } - } - - c(printf("length read = %d\n", len)); -smaller_boundary: - - /* ok, we're at the end of the data, just make sure we're not missing out some small - truncated header markers */ - if (overpart) { - overpart = overpart->parent; - while (overpart) { - if (overpart->boundary && (overpart->boundarylen+2) < s->atleast) { - s->atleast = overpart->boundarylen+2; - c(printf("Retrying next smaller part ...\n")); - goto retry; - } - overpart = overpart->parent; - } - } - - if (s->inend > s->inptr) { - start = s->inptr; - inptr = s->inend; - goto content; - } - - *length = 0; - s->atleast = atleast; - return NULL; - -content_mid: - s->midline = TRUE; -content: - part = s->parts; -normal_exit: - s->atleast = atleast; - s->inptr = inptr; - - *data = start; - /* if we hit a boundary, we should not include the closing \n */ - if (onboundary) - *length = inptr-start-1; - else - *length = inptr-start; - -/* printf("got %scontent: %.*s", s->midline?"partial ":"", inptr-start, start);*/ - - return part; -} - - -static void -folder_scan_close(struct _header_scan_state *s) -{ - g_free(s->realbuf); - g_free(s->outbuf); - while (s->parts) - folder_pull_part(s); - if (s->fd != -1) - close(s->fd); - if (s->stream) { - camel_object_unref((CamelObject *)s->stream); - } - g_free(s); -} - - -static struct _header_scan_state * -folder_scan_init(void) -{ - struct _header_scan_state *s; - - s = g_malloc(sizeof(*s)); - - s->fd = -1; - s->stream = NULL; - - s->outbuf = g_malloc(1024); - s->outptr = s->outbuf; - s->outend = s->outbuf+1024; - - s->realbuf = g_malloc(SCAN_BUF + SCAN_HEAD*2); - s->inbuf = s->realbuf + SCAN_HEAD; - s->inptr = s->inbuf; - s->inend = s->inbuf; - s->atleast = 0; - - s->seek = 0; /* current character position in file of the last read block */ - s->unstep = 0; - - s->header_start = -1; - - s->start_of_from = -1; - s->start_of_headers = -1; - - s->midline = FALSE; - s->scan_from = FALSE; - - s->filters = NULL; - s->filterid = 1; - - s->parts = NULL; - - s->state = HSCAN_INITIAL; - return s; -} - -static int -folder_scan_init_with_fd(struct _header_scan_state *s, int fd) -{ - int len; - - len = read(fd, s->inbuf, SCAN_BUF); - if (len>=0) { - s->inend = s->inbuf+len; - s->inptr = s->inbuf; - s->inend[0] = '\n'; - if (s->fd != -1) - close(s->fd); - s->fd = fd; - if (s->stream) { - camel_object_unref((CamelObject *)s->stream); - s->stream = NULL; - } - return 0; - } else { - return -1; - } -} - -static int -folder_scan_init_with_stream(struct _header_scan_state *s, CamelStream *stream) -{ - int len; - - len = camel_stream_read(stream, s->inbuf, SCAN_BUF); - if (len >= 0) { - s->inend = s->inbuf+len; - s->inptr = s->inbuf; - s->inend[0] = '\n'; - if (s->stream) - camel_object_unref((CamelObject *)s->stream); - s->stream = stream; - camel_object_ref((CamelObject *)stream); - if (s->fd != -1) { - close(s->fd); - s->fd = -1; - } - return 0; - } else { - return -1; - } -} - -#define USE_FROM - -static void -folder_scan_step(struct _header_scan_state *s, char **databuffer, int *datalength) -{ - struct _header_scan_stack *h, *hb; - const char *content; - const char *bound; - int type; - int state; - struct _header_content_type *ct = NULL; - struct _header_scan_filter *f; - size_t presize; - -/* printf("\nSCAN PASS: state = %d '%s'\n", s->state, states[s->state]);*/ - -tail_recurse: - d({ - printf("\nSCAN STACK:\n"); - printf(" '%s' :\n", states[s->state]); - hb = s->parts; - while (hb) { - printf(" '%s' : %s ", states[hb->savestate], hb->boundary); - if (hb->content_type) { - printf("(%s/%s)", hb->content_type->type, hb->content_type->subtype); - } else { - printf("(default)"); - } - printf("\n"); - hb = hb->parent; - } - printf("\n"); - }); - - switch (s->state) { - - case HSCAN_INITIAL: -#ifdef USE_FROM - if (s->scan_from) { - /* FIXME: it would be nice not to have to allocate this every pass */ - h = g_malloc0(sizeof(*h)); - h->boundary = g_strdup("From "); - h->boundarylen = strlen(h->boundary); - folder_push_part(s, h); - - h = s->parts; - do { - hb = folder_scan_content(s, &state, databuffer, datalength); - } while (hb==h && *datalength>0); - - if (*datalength==0 && hb==h) { - d(printf("found 'From '\n")); - s->start_of_from = folder_tell(s); - folder_scan_skip_line(s); - h->savestate = HSCAN_INITIAL; - s->state = HSCAN_FROM; - } else { - folder_pull_part(s); - s->state = HSCAN_EOF; - } - return; - } else { - s->start_of_from = -1; - } - -#endif - case HSCAN_FROM: - s->start_of_headers = folder_tell(s); - h = folder_scan_header(s, &state); -#ifdef USE_FROM - if (s->scan_from) - h->savestate = HSCAN_FROM_END; - else -#endif - h->savestate = HSCAN_EOF; - - /* FIXME: should this check for MIME-Version: 1.0 as well? */ - - type = HSCAN_HEADER; - if ( (content = header_raw_find(&h->headers, "Content-Type", NULL)) - && (ct = header_content_type_decode(content))) { - if (!strcasecmp(ct->type, "multipart")) { - bound = header_content_type_param(ct, "boundary"); - if (bound) { - d(printf("multipart, boundary = %s\n", bound)); - h->boundarylen = strlen(bound)+2; - h->boundary = g_malloc(h->boundarylen+3); - sprintf(h->boundary, "--%s--", bound); - type = HSCAN_MULTIPART; - } else { - header_content_type_unref(ct); - ct = header_content_type_decode("text/plain"); -/* We can't quite do this, as it will mess up all the offsets ... */ -/* header_raw_replace(&h->headers, "Content-Type", "text/plain", offset);*/ - g_warning("Multipart with no boundary, treating as text/plain"); - } - } else if (!strcasecmp(ct->type, "message")) { - if (!strcasecmp(ct->subtype, "rfc822") - || !strcasecmp(ct->subtype, "news") - /*|| !strcasecmp(ct->subtype, "partial")*/) { - type = HSCAN_MESSAGE; - } - } - } else { - /* make the default type for multipart/digest be message/rfc822 */ - if ((s->parts - && header_content_type_is(s->parts->content_type, "multipart", "digest"))) { - ct = header_content_type_decode("message/rfc822"); - type = HSCAN_MESSAGE; - d(printf("parent was multipart/digest, autoupgrading to message/rfc822?\n")); - /* maybe we should do this too? - header_raw_append_parse(&h->headers, "Content-Type: message/rfc822", -1);*/ - } - } - h->content_type = ct; - folder_push_part(s, h); - s->state = type; - return; - - case HSCAN_HEADER: - s->state = HSCAN_BODY; - - case HSCAN_BODY: - h = s->parts; - *datalength = 0; - presize = SCAN_HEAD; - f = s->filters; - - do { - hb = folder_scan_content (s, &state, databuffer, datalength); - - d(printf ("\n\nOriginal content: '")); - d(fwrite(*databuffer, sizeof(char), *datalength, stdout)); - d(printf("'\n")); - - if (*datalength > 0) { - while (f) { - camel_mime_filter_filter(f->filter, *databuffer, *datalength, presize, - databuffer, datalength, &presize); - d(printf ("Filtered content (%s): '", - camel_type_to_name(((CamelObject *)f->filter)->s.type))); - d(fwrite(*databuffer, sizeof(char), *datalength, stdout)); - d(printf("'\n")); - f = f->next; - } - return; - } - } while (hb == h && *datalength > 0); - - /* check for any filter completion data */ - if (*datalength > 0) { - while (f) { - camel_mime_filter_filter(f->filter, *databuffer, *datalength, presize, - databuffer, datalength, &presize); - f = f->next; - } - } - if (*datalength > 0) - return; - - s->state = HSCAN_BODY_END; - break; - - case HSCAN_MULTIPART: - h = s->parts; - do { - do { - hb = folder_scan_content(s, &state, databuffer, datalength); - if (*datalength>0) { - /* instead of a new state, we'll just store it locally and provide - an accessor function */ - d(printf("Multipart %s Content %p: '%.*s'\n", - h->prestage>0?"post":"pre", h, *datalength, *databuffer)); - if (h->prestage > 0) { - if (h->posttext == NULL) - h->posttext = g_byte_array_new(); - g_byte_array_append(h->posttext, *databuffer, *datalength); - } else { - if (h->pretext == NULL) - h->pretext = g_byte_array_new(); - g_byte_array_append(h->pretext, *databuffer, *datalength); - } - } - } while (hb==h && *datalength>0); - h->prestage++; - if (*datalength==0 && hb==h) { - d(printf("got boundary: %s\n", hb->boundary)); - folder_scan_skip_line(s); - if (!state) { - s->state = HSCAN_FROM; - folder_scan_step(s, databuffer, datalength); - s->parts->savestate = HSCAN_MULTIPART; /* set return state for the new head part */ - return; - } - } else { - break; - } - } while (1); - - s->state = HSCAN_MULTIPART_END; - break; - - case HSCAN_MESSAGE: - s->state = HSCAN_FROM; - folder_scan_step(s, databuffer, datalength); - s->parts->savestate = HSCAN_MESSAGE_END; - break; - - case HSCAN_FROM_END: - case HSCAN_BODY_END: - case HSCAN_MULTIPART_END: - case HSCAN_MESSAGE_END: - s->state = s->parts->savestate; - folder_pull_part(s); - if (s->state & HSCAN_END) - return; - goto tail_recurse; - - case HSCAN_EOF: - return; - - default: - g_warning("Invalid state in camel-mime-parser: %d", s->state); - break; - } - - return; -} - -/* drops the current state back one */ -static void -folder_scan_drop_step(struct _header_scan_state *s) -{ - switch (s->state) { - case HSCAN_INITIAL: - case HSCAN_EOF: - return; - - case HSCAN_FROM: - s->state = HSCAN_INITIAL; - folder_pull_part(s); - return; - - case HSCAN_MESSAGE: - case HSCAN_HEADER: - case HSCAN_MULTIPART: - - case HSCAN_FROM_END: - case HSCAN_BODY_END: - case HSCAN_MULTIPART_END: - case HSCAN_MESSAGE_END: - - s->state = s->parts->savestate; - folder_pull_part(s); - if (s->state & HSCAN_END) { - s->state &= ~HSCAN_END; - } - return; - default: - /* FIXME: not sure if this is entirely right */ - } -} - -#ifdef STANDALONE -int main(int argc, char **argv) -{ - int fd; - struct _header_scan_state *s; - char *data; - int len; - int state; - char *name = "/tmp/evmail/Inbox"; - struct _header_scan_stack *h; - int i; - int attach = 0; - - if (argc==2) - name = argv[1]; - - printf("opening: %s", name); - - for (i=1;i<argc;i++) { - const char *encoding = NULL, *charset = NULL; - char *attachname; - - name = argv[i]; - printf("opening: %s", name); - - fd = open(name, O_RDONLY); - if (fd==-1) { - perror("Cannot open mailbox"); - exit(1); - } - s = folder_scan_init(); - folder_scan_init_with_fd(s, fd); - s->scan_from = FALSE; -#if 0 - h = g_malloc0(sizeof(*h)); - h->savestate = HSCAN_EOF; - folder_push_part(s, h); -#endif - while (s->state != HSCAN_EOF) { - folder_scan_step(s, &data, &len); - printf("\n -- PARSER STEP RETURN -- %d '%s'\n\n", s->state, states[s->state]); - switch (s->state) { - case HSCAN_HEADER: - if (s->parts->content_type - && (charset = header_content_type_param(s->parts->content_type, "charset"))) { - if (strcasecmp(charset, "us-ascii")) { -#if 0 - folder_push_filter_charset(s, "UTF-8", charset); -#endif - } else { - charset = NULL; - } - } else { - charset = NULL; - } - - encoding = header_raw_find(&s->parts->headers, "Content-transfer-encoding", 0); - printf("encoding = '%s'\n", encoding); - if (encoding && !strncasecmp(encoding, " base64", 7)) { - printf("adding base64 filter\n"); - attachname = g_strdup_printf("attach.%d.%d", i, attach++); -#if 0 - folder_push_filter_save(s, attachname); -#endif - g_free(attachname); -#if 0 - folder_push_filter_mime(s, 0); -#endif - } - if (encoding && !strncasecmp(encoding, " quoted-printable", 17)) { - printf("adding quoted-printable filter\n"); - attachname = g_strdup_printf("attach.%d.%d", i, attach++); -#if 0 - folder_push_filter_save(s, attachname); -#endif - g_free(attachname); -#if 0 - folder_push_filter_mime(s, 1); -#endif - } - - break; - case HSCAN_BODY: - printf("got body %d '%.*s'\n", len, len, data); - break; - case HSCAN_BODY_END: - printf("end body %d '%.*s'\n", len, len, data); - if (encoding && !strncasecmp(encoding, " base64", 7)) { - printf("removing filters\n"); -#if 0 - folder_filter_pull(s); - folder_filter_pull(s); -#endif - } - if (encoding && !strncasecmp(encoding, " quoted-printable", 17)) { - printf("removing filters\n"); -#if 0 - folder_filter_pull(s); - folder_filter_pull(s); -#endif - } - if (charset) { -#if 0 - folder_filter_pull(s); -#endif - charset = NULL; - } - encoding = NULL; - break; - default: - break; - } - } - folder_scan_close(s); - close(fd); - } - return 0; -} - -#endif /* STANDALONE */ - diff --git a/camel/camel-mime-parser.h b/camel/camel-mime-parser.h deleted file mode 100644 index d9a6e8bbb3..0000000000 --- a/camel/camel-mime-parser.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef _CAMEL_MIME_PARSER_H -#define _CAMEL_MIME_PARSER_H - -#include <camel/camel-object.h> - -#include <camel/camel-mime-utils.h> -#include <camel/camel-mime-filter.h> -#include <camel/camel-stream.h> - -#define CAMEL_MIME_PARSER(obj) CAMEL_CHECK_CAST (obj, camel_mime_parser_get_type (), CamelMimeParser) -#define CAMEL_MIME_PARSER_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_mime_parser_get_type (), CamelMimeParserClass) -#define IS_CAMEL_MIME_PARSER(obj) CAMEL_CHECK_TYPE (obj, camel_mime_parser_get_type ()) - -typedef struct _CamelMimeParserClass CamelMimeParserClass; - -/* NOTE: if you add more states, you may need to bump the - start of the END tags to 16 or 32, etc - so they are - the same as the matching start tag, with a bit difference */ -enum _header_state { - HSCAN_INITIAL, - HSCAN_FROM, /* got 'From' line */ - HSCAN_HEADER, /* toplevel header */ - HSCAN_BODY, /* scanning body of message */ - HSCAN_MULTIPART, /* got multipart header */ - HSCAN_MESSAGE, /* rfc822 message */ - - HSCAN_PART, /* part of a multipart */ - - HSCAN_END = 8, /* bit mask for 'end' flags */ - - HSCAN_EOF = 8, /* end of file */ - HSCAN_FROM_END, /* end of whole from bracket */ - HSCAN_HEADER_END, /* dummy value */ - HSCAN_BODY_END, /* end of message */ - HSCAN_MULTIPART_END, /* end of multipart */ - HSCAN_MESSAGE_END, /* end of message */ - -}; - -struct _CamelMimeParser { - CamelObject parent; - - struct _CamelMimeParserPrivate *priv; -}; - -struct _CamelMimeParserClass { - CamelObjectClass parent_class; - - void (*message)(CamelMimeParser *, void *headers); - void (*part)(CamelMimeParser *); - void (*content)(CamelMimeParser *); -}; - -guint camel_mime_parser_get_type (void); -CamelMimeParser *camel_mime_parser_new (void); - -/* using an fd will be a little faster, but not much (over a simple stream) */ -int camel_mime_parser_init_with_fd(CamelMimeParser *, int fd); -int camel_mime_parser_init_with_stream(CamelMimeParser *m, CamelStream *stream); - -/* get the stream or fd back of the parser */ -CamelStream *camel_mime_parser_stream(CamelMimeParser *m); -int camel_mime_parser_fd(CamelMimeParser *m); - -/* scan 'From' separators? */ -void camel_mime_parser_scan_from(CamelMimeParser *, int); - -/* what headers to save, MUST include ^Content-Type: */ -int camel_mime_parser_set_header_regex(CamelMimeParser *m, char *matchstr); - -/* normal interface */ -enum _header_state camel_mime_parser_step(CamelMimeParser *, char **, int *); -void camel_mime_parser_unstep(CamelMimeParser *); -void camel_mime_parser_drop_step(CamelMimeParser *m); -enum _header_state camel_mime_parser_state(CamelMimeParser *); - -/* get content type for the current part/header */ -struct _header_content_type *camel_mime_parser_content_type(CamelMimeParser *); - -/* get/change raw header by name */ -const char *camel_mime_parser_header(CamelMimeParser *, const char *, int *offset); - -/* get all raw headers. READ ONLY! */ -struct _header_raw *camel_mime_parser_headers_raw(CamelMimeParser *); - -/* get multipart pre/postface */ -const char *camel_mime_parser_preface(CamelMimeParser *m); -const char *camel_mime_parser_postface(CamelMimeParser *m); - -/* add a processing filter for body contents */ -int camel_mime_parser_filter_add(CamelMimeParser *, CamelMimeFilter *); -void camel_mime_parser_filter_remove(CamelMimeParser *, int); - -/* these should be used with caution, because the state will not - track the seeked position */ -/* FIXME: something to bootstrap the state? */ -off_t camel_mime_parser_tell(CamelMimeParser *); -off_t camel_mime_parser_seek(CamelMimeParser *, off_t, int); - -off_t camel_mime_parser_tell_start_headers(CamelMimeParser *); -off_t camel_mime_parser_tell_start_from(CamelMimeParser *); - -#endif /* ! _CAMEL_MIME_PARSER_H */ diff --git a/camel/camel-mime-part-utils.c b/camel/camel-mime-part-utils.c deleted file mode 100644 index 2809346a00..0000000000 --- a/camel/camel-mime-part-utils.c +++ /dev/null @@ -1,241 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */ -/* camel-mime-part-utils : Utility for mime parsing and so on - * - * Authors: Bertrand Guiheneuf <bertrand@helixcode.com> - * Michael Zucchi <notzed@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ -#include <config.h> -#include <string.h> -#include "gmime-content-field.h" -#include "string-utils.h" -#include "camel-mime-part-utils.h" -#include "camel-mime-message.h" -#include "camel-multipart.h" -#include "camel-seekable-substream.h" -#include "camel-stream-filter.h" -#include "camel-stream-mem.h" -#include "camel-mime-filter-basic.h" -#include "camel-mime-filter-charset.h" -#include "camel-mime-filter-crlf.h" - -#define d(x) - -/* simple data wrapper */ -static void -simple_data_wrapper_construct_from_parser(CamelDataWrapper *dw, CamelMimeParser *mp) -{ - GByteArray *buffer; - char *buf; - int len; - off_t start = 0, end; - CamelMimeFilter *fdec = NULL, *fcrlf = NULL, *fch = NULL; - struct _header_content_type *ct; - int decid=-1, crlfid=-1, chrid=-1; - CamelStream *source; - CamelSeekableStream *seekable_source = NULL; - char *encoding; - - d(printf("constructing data-wrapper\n")); - - /* Ok, try and be smart. If we're storing a small message (typical) convert it, - and store it in memory as we parse it ... if not, throw away the conversion - and scan till the end ... */ - - /* if we can't seek, dont have a stream/etc, then we must cache it */ - source = camel_mime_parser_stream(mp); - if (source) { - camel_object_ref((CamelObject *)source); - if (CAMEL_IS_SEEKABLE_STREAM (source)) { - seekable_source = CAMEL_SEEKABLE_STREAM (source); - } - } - - /* first, work out conversion, if any, required, we dont care about what we dont know about */ - encoding = header_content_encoding_decode(camel_mime_parser_header(mp, "content-transfer-encoding", NULL)); - if (encoding) { - if (!strcasecmp(encoding, "base64")) { - d(printf("Adding base64 decoder ...\n")); - fdec = (CamelMimeFilter *)camel_mime_filter_basic_new_type(CAMEL_MIME_FILTER_BASIC_BASE64_DEC); - decid = camel_mime_parser_filter_add(mp, fdec); - } else if (!strcasecmp(encoding, "quoted-printable")) { - d(printf("Adding quoted-printable decoder ...\n")); - fdec = (CamelMimeFilter *)camel_mime_filter_basic_new_type(CAMEL_MIME_FILTER_BASIC_QP_DEC); - decid = camel_mime_parser_filter_add(mp, fdec); - } - g_free(encoding); - } - - /* If we're doing text, we also need to do CRLF->LF and may have to convert it to UTF8 as well. */ - ct = camel_mime_parser_content_type(mp); - if (header_content_type_is(ct, "text", "*")) { - const char *charset = header_content_type_param(ct, "charset"); - - if (fdec) { - d(printf("Adding CRLF conversion filter\n")); - fcrlf = (CamelMimeFilter *)camel_mime_filter_crlf_new(CAMEL_MIME_FILTER_CRLF_DECODE, - CAMEL_MIME_FILTER_CRLF_MODE_CRLF_ONLY); - crlfid = camel_mime_parser_filter_add(mp, fcrlf); - } - - if (charset!=NULL - && !(strcasecmp(charset, "us-ascii")==0 - || strcasecmp(charset, "utf-8")==0)) { - d(printf("Adding conversion filter from %s to UTF-8\n", charset)); - fch = (CamelMimeFilter *)camel_mime_filter_charset_new_convert(charset, "UTF-8"); - if (fch) { - chrid = camel_mime_parser_filter_add(mp, (CamelMimeFilter *)fch); - } else { - g_warning("Cannot convert '%s' to 'UTF-8', message display may be corrupt", charset); - } - } - - } - - buffer = g_byte_array_new(); - - if (seekable_source /* !cache */) { - start = camel_mime_parser_tell(mp) + seekable_source->bound_start; - } - while ( camel_mime_parser_step(mp, &buf, &len) != HSCAN_BODY_END ) { - if (buffer) { - if (buffer->len > 20480 && seekable_source) { - /* is this a 'big' message? Yes? We dont want to convert it all then.*/ - camel_mime_parser_filter_remove(mp, decid); - camel_mime_parser_filter_remove(mp, chrid); - decid = -1; - chrid = -1; - g_byte_array_free(buffer, TRUE); - buffer = NULL; - } else { - g_byte_array_append(buffer, buf, len); - } - } - } - - if (buffer) { - CamelStream *mem; - d(printf("Small message part, kept in memory!\n")); - mem = camel_stream_mem_new_with_byte_array(buffer); - camel_data_wrapper_construct_from_stream (dw, mem); - camel_object_unref ((CamelObject *)mem); - } else { - CamelStream *sub; - CamelStreamFilter *filter; - - d(printf("Big message part, left on disk ...\n")); - - end = camel_mime_parser_tell(mp) + seekable_source->bound_start; - sub = camel_seekable_substream_new_with_seekable_stream_and_bounds (seekable_source, start, end); - if (fdec || fch) { - filter = camel_stream_filter_new_with_stream(sub); - if (fdec) { - camel_mime_filter_reset(fdec); - camel_stream_filter_add(filter, fdec); - } - if (fcrlf) { - camel_mime_filter_reset(fcrlf); - camel_stream_filter_add(filter, fcrlf); - } - if (fch) { - camel_mime_filter_reset(fch); - camel_stream_filter_add(filter, fch); - } - camel_data_wrapper_construct_from_stream (dw, (CamelStream *)filter); - camel_object_unref ((CamelObject *)filter); - } else { - camel_data_wrapper_construct_from_stream (dw, sub); - } - camel_object_unref ((CamelObject *)sub); - } - - camel_mime_parser_filter_remove(mp, decid); - camel_mime_parser_filter_remove(mp, crlfid); - camel_mime_parser_filter_remove(mp, chrid); - - if (fdec) - camel_object_unref((CamelObject *)fdec); - if (fcrlf) - camel_object_unref((CamelObject *)fcrlf); - if (fch) - camel_object_unref((CamelObject *)fch); - if (source) - camel_object_unref((CamelObject *)source); - -} - -/* This replaces the data wrapper repository ... and/or could be replaced by it? */ -void -camel_mime_part_construct_content_from_parser(CamelMimePart *dw, CamelMimeParser *mp) -{ - CamelDataWrapper *content = NULL; - char *buf; - int len; - - switch (camel_mime_parser_state(mp)) { - case HSCAN_HEADER: - d(printf("Creating body part\n")); - content = camel_data_wrapper_new(); - simple_data_wrapper_construct_from_parser(content, mp); - break; - case HSCAN_MESSAGE: - d(printf("Creating message part\n")); - content = (CamelDataWrapper *)camel_mime_message_new(); - camel_mime_part_construct_from_parser((CamelMimePart *)content, mp); - break; - case HSCAN_MULTIPART: { - CamelDataWrapper *bodypart; - -#ifndef NO_WARNINGS -#warning This should use a camel-mime-multipart -#endif - d(printf("Creating multi-part\n")); - content = (CamelDataWrapper *)camel_multipart_new(); - - /* FIXME: use the real boundary? */ - camel_multipart_set_boundary((CamelMultipart *)content, NULL); - while (camel_mime_parser_step(mp, &buf, &len) != HSCAN_MULTIPART_END) { - camel_mime_parser_unstep(mp); - bodypart = (CamelDataWrapper *)camel_mime_part_new(); - camel_mime_part_construct_from_parser((CamelMimePart *)bodypart, mp); - camel_multipart_add_part((CamelMultipart *)content, (CamelMimePart *)bodypart); - camel_object_unref ((CamelObject *)bodypart); - } - - /* these are only return valid data in the MULTIPART_END state */ - camel_multipart_set_preface((CamelMultipart *)content, camel_mime_parser_preface(mp)); - camel_multipart_set_postface((CamelMultipart *)content, camel_mime_parser_postface(mp)); - - d(printf("Created multi-part\n")); - break; } - default: - g_warning("Invalid state encountered???: %d", camel_mime_parser_state(mp)); - } - if (content) { -#ifndef NO_WARNINGS -#warning there just has got to be a better way ... to transfer the mime-type to the datawrapper -#endif - /* would you believe you have to set this BEFORE you set the content object??? oh my god !!!! */ - camel_data_wrapper_set_mime_type_field (content, - camel_mime_part_get_content_type ((CamelMimePart *)dw)); - camel_medium_set_content_object((CamelMedium *)dw, content); - camel_object_unref ((CamelObject *)content); - } -} - diff --git a/camel/camel-mime-part-utils.h b/camel/camel-mime-part-utils.h deleted file mode 100644 index 1e1c3655aa..0000000000 --- a/camel/camel-mime-part-utils.h +++ /dev/null @@ -1,45 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mime-part-utils : Utility for mime parsing and so on */ - - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef CAMEL_MIME_PART_UTILS_H -#define CAMEL_MIME_PART_UTILS_H 1 - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-mime-part.h> - -void camel_mime_part_construct_content_from_parser(CamelMimePart *, CamelMimeParser *mp); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MIME_PART_UTILS_H */ - diff --git a/camel/camel-mime-part.c b/camel/camel-mime-part.c deleted file mode 100644 index e661e0caf5..0000000000 --- a/camel/camel-mime-part.c +++ /dev/null @@ -1,747 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */ -/* camelMimePart.c : Abstract class for a mime_part */ - -/* - * Authors: Bertrand Guiheneuf <bertrand@helixcode.com> - * Michael Zucchi <notzed@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> -#include <string.h> -#include "camel-mime-part.h" -#include <stdio.h> -#include "gmime-content-field.h" -#include "string-utils.h" -#include "hash-table-utils.h" -#include "camel-mime-part-utils.h" -#include <ctype.h> -#include "camel-mime-parser.h" -#include "camel-stream-mem.h" -#include "camel-stream-filter.h" -#include "camel-mime-filter-basic.h" -#include "camel-mime-filter-crlf.h" -#include "camel-mime-filter-charset.h" -#include "camel-exception.h" - -#define d(x) - -typedef enum { - HEADER_UNKNOWN, - HEADER_DESCRIPTION, - HEADER_DISPOSITION, - HEADER_CONTENT_ID, - HEADER_ENCODING, - HEADER_CONTENT_MD5, - HEADER_CONTENT_LANGUAGES, - HEADER_CONTENT_TYPE -} CamelHeaderType; - - -static GHashTable *header_name_table; - - -static CamelMediumClass *parent_class=NULL; - -/* Returns the class for a CamelMimePart */ -#define CMP_CLASS(so) CAMEL_MIME_PART_CLASS (CAMEL_OBJECT_GET_CLASS(so)) -#define CDW_CLASS(so) CAMEL_DATA_WRAPPER_CLASS (CAMEL_OBJECT_GET_CLASS(so)) -#define CMD_CLASS(so) CAMEL_MEDIUM_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - -/* from CamelDataWrapper */ -static int write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream); -static int construct_from_stream (CamelDataWrapper *dw, CamelStream *s); - -/* from CamelMedia */ -static void add_header (CamelMedium *medium, const char *header_name, const void *header_value); -static void set_header (CamelMedium *medium, const char *header_name, const void *header_value); -static void remove_header (CamelMedium *medium, const char *header_name); -static const void *get_header (CamelMedium *medium, const char *header_name); - -static void set_content_object (CamelMedium *medium, CamelDataWrapper *content); - -/* from camel mime parser */ -static int construct_from_parser (CamelMimePart *, CamelMimeParser *); - -/* forward references */ -static void set_disposition (CamelMimePart *mime_part, const gchar *disposition); - - -/* loads in a hash table the set of header names we */ -/* recognize and associate them with a unique enum */ -/* identifier (see CamelHeaderType above) */ -static void -init_header_name_table() -{ - header_name_table = g_hash_table_new (g_strcase_hash, g_strcase_equal); - g_hash_table_insert (header_name_table, "Content-Description", (gpointer)HEADER_DESCRIPTION); - g_hash_table_insert (header_name_table, "Content-Disposition", (gpointer)HEADER_DISPOSITION); - g_hash_table_insert (header_name_table, "Content-id", (gpointer)HEADER_CONTENT_ID); - g_hash_table_insert (header_name_table, "Content-Transfer-Encoding", (gpointer)HEADER_ENCODING); - g_hash_table_insert (header_name_table, "Content-MD5", (gpointer)HEADER_CONTENT_MD5); - g_hash_table_insert (header_name_table, "Content-Type", (gpointer)HEADER_CONTENT_TYPE); - -} - -static void -camel_mime_part_class_init (CamelMimePartClass *camel_mime_part_class) -{ - CamelMediumClass *camel_medium_class = CAMEL_MEDIUM_CLASS (camel_mime_part_class); - CamelDataWrapperClass *camel_data_wrapper_class = CAMEL_DATA_WRAPPER_CLASS (camel_mime_part_class); - - parent_class = CAMEL_MEDIUM_CLASS (camel_type_get_global_classfuncs (camel_medium_get_type ())); - init_header_name_table(); - - camel_mime_part_class->construct_from_parser = construct_from_parser; - - /* virtual method overload */ - camel_medium_class->add_header = add_header; - camel_medium_class->set_header = set_header; - camel_medium_class->get_header = get_header; - camel_medium_class->remove_header = remove_header; - camel_medium_class->set_content_object = set_content_object; - - camel_data_wrapper_class->write_to_stream = write_to_stream; - camel_data_wrapper_class->construct_from_stream= construct_from_stream; -} - -static void -camel_mime_part_init (gpointer object, gpointer klass) -{ - CamelMimePart *camel_mime_part = CAMEL_MIME_PART (object); - - camel_mime_part->content_type = gmime_content_field_new ("text", "plain"); - camel_mime_part->description = NULL; - camel_mime_part->disposition = NULL; - camel_mime_part->content_id = NULL; - camel_mime_part->content_MD5 = NULL; - camel_mime_part->content_languages = NULL; - camel_mime_part->encoding = CAMEL_MIME_PART_ENCODING_DEFAULT; -} - - -static void -camel_mime_part_finalize (CamelObject *object) -{ - CamelMimePart *mime_part = CAMEL_MIME_PART (object); - - g_free (mime_part->description); - g_free (mime_part->content_id); - g_free (mime_part->content_MD5); - string_list_free (mime_part->content_languages); - header_disposition_unref(mime_part->disposition); - - if (mime_part->content_type) - gmime_content_field_unref (mime_part->content_type); - - header_raw_clear(&mime_part->headers); -} - - - -CamelType -camel_mime_part_get_type (void) -{ - static CamelType camel_mime_part_type = CAMEL_INVALID_TYPE; - - if (camel_mime_part_type == CAMEL_INVALID_TYPE) { - camel_mime_part_type = camel_type_register (CAMEL_MEDIUM_TYPE, "CamelMimePart", - sizeof (CamelMimePart), - sizeof (CamelMimePartClass), - (CamelObjectClassInitFunc) camel_mime_part_class_init, - NULL, - (CamelObjectInitFunc) camel_mime_part_init, - (CamelObjectFinalizeFunc) camel_mime_part_finalize); - } - - return camel_mime_part_type; -} - - -/* **** */ - -static gboolean -process_header(CamelMedium *medium, const char *header_name, const char *header_value) -{ - CamelMimePart *mime_part = CAMEL_MIME_PART (medium); - CamelHeaderType header_type; - char *text; - - /* Try to parse the header pair. If it corresponds to something */ - /* known, the job is done in the parsing routine. If not, */ - /* we simply add the header in a raw fashion */ - - header_type = (CamelHeaderType) g_hash_table_lookup (header_name_table, header_name); - switch (header_type) { - case HEADER_DESCRIPTION: /* raw header->utf8 conversion */ - text = header_decode_string(header_value); - g_free(mime_part->description); - mime_part->description = g_strstrip (text); - break; - case HEADER_DISPOSITION: - set_disposition(mime_part, header_value); - break; - case HEADER_CONTENT_ID: - text = header_msgid_decode(header_value); - g_free(mime_part->content_id); - mime_part->content_id = text; - break; - case HEADER_ENCODING: - text = header_token_decode(header_value); - mime_part->encoding = camel_mime_part_encoding_from_string (text); - g_free(text); - break; - case HEADER_CONTENT_MD5: - g_free(mime_part->content_MD5); - mime_part->content_MD5 = g_strdup(header_value); - break; - case HEADER_CONTENT_TYPE: - gmime_content_field_construct_from_string(mime_part->content_type, header_value); - break; - default: - return FALSE; - } - return TRUE; -} - -/* Note: It is my understanding that we need to encode the values here as they are - not being encoded at the header_raw_* level. */ - -/* - NO: This is absolutely wrong. The medium interface is entirely raw. - You cannot just go blingingly encoding headers because it depends entirely - on the header being encoded. process_header decodes and mirrors the - known headers, appropriately, and we just add this raw header to our - list. - - Please read the comments, they explained it already!!!!!!! -*/ - -static void -set_header (CamelMedium *medium, const char *header_name, const void *header_value) -{ - CamelMimePart *part = CAMEL_MIME_PART (medium); - - process_header(medium, header_name, header_value); - header_raw_replace(&part->headers, header_name, header_value, -1); -} - -static void -add_header (CamelMedium *medium, const char *header_name, const void *header_value) -{ - CamelMimePart *part = CAMEL_MIME_PART (medium); - - /* Try to parse the header pair. If it corresponds to something */ - /* known, the job is done in the parsing routine. If not, */ - /* we simply add the header in a raw fashion */ - - /* If it was one of the headers we handled, it must be unique, set it instead of add */ - if (process_header(medium, header_name, header_value)) - header_raw_replace(&part->headers, header_name, header_value, -1); - else - header_raw_append(&part->headers, header_name, header_value, -1); -} - -static void -remove_header (CamelMedium *medium, const char *header_name) -{ - CamelMimePart *part = (CamelMimePart *)medium; - - process_header(medium, header_name, NULL); - header_raw_remove(&part->headers, header_name); -} - -static const void * -get_header (CamelMedium *medium, const char *header_name) -{ - CamelMimePart *part = (CamelMimePart *)medium; - - return header_raw_find(&part->headers, header_name, NULL); -} - - -/* **** Content-Description */ -void -camel_mime_part_set_description (CamelMimePart *mime_part, const gchar *description) -{ - char *text = header_encode_string (description); - - camel_medium_set_header (CAMEL_MEDIUM (mime_part), - "Content-Description", text); - g_free (text); -} - -const gchar * -camel_mime_part_get_description (CamelMimePart *mime_part) -{ - return mime_part->description; -} - -/* **** Content-Disposition */ - -static void -set_disposition (CamelMimePart *mime_part, const gchar *disposition) -{ - header_disposition_unref(mime_part->disposition); - if (disposition) - mime_part->disposition = header_disposition_decode(disposition); - else - mime_part->disposition = NULL; -} - - -void -camel_mime_part_set_disposition (CamelMimePart *mime_part, const gchar *disposition) -{ - char *text; - - /* we poke in a new disposition (so we dont lose 'filename', etc) */ - if (mime_part->disposition == NULL) { - set_disposition(mime_part, disposition); - } - if (mime_part->disposition != NULL) { - g_free(mime_part->disposition->disposition); - mime_part->disposition->disposition = g_strdup(disposition); - } - text = header_disposition_format(mime_part->disposition); - - camel_medium_set_header (CAMEL_MEDIUM (mime_part), - "Content-Disposition", text); - - g_free(text); -} - -const gchar * -camel_mime_part_get_disposition (CamelMimePart *mime_part) -{ - if (mime_part->disposition) - return (mime_part->disposition)->disposition; - else - return NULL; -} - - -/* **** Content-Disposition: filename="xxx" */ - -void -camel_mime_part_set_filename (CamelMimePart *mime_part, const gchar *filename) -{ - char *str; - if (mime_part->disposition == NULL) - mime_part->disposition = header_disposition_decode("attachment"); - - header_set_param(&mime_part->disposition->params, "filename", filename); - str = header_disposition_format(mime_part->disposition); - - camel_medium_set_header (CAMEL_MEDIUM (mime_part), - "Content-Disposition", str); - g_free(str); -} - -const gchar * -camel_mime_part_get_filename (CamelMimePart *mime_part) -{ - if (mime_part->disposition) { - const gchar *name = header_param (mime_part->disposition->params, "filename"); - if (name) - return name; - } - - return gmime_content_field_get_parameter (mime_part->content_type, "name"); -} - - -/* **** Content-ID: */ - -void -camel_mime_part_set_content_id (CamelMimePart *mime_part, const char *contentid) -{ - camel_medium_set_header (CAMEL_MEDIUM (mime_part), "Content-ID", - contentid); -} - -const gchar * -camel_mime_part_get_content_id (CamelMimePart *mime_part) -{ - return mime_part->content_id; -} - -/* **** Content-MD5: */ - -void -camel_mime_part_set_content_MD5 (CamelMimePart *mime_part, const char *md5) -{ - camel_medium_set_header (CAMEL_MEDIUM (mime_part), "Content-MD5", md5); -} - -const gchar * -camel_mime_part_get_content_MD5 (CamelMimePart *mime_part) -{ - return mime_part->content_MD5; -} - -/* **** Content-Transfer-Encoding: */ - -void -camel_mime_part_set_encoding (CamelMimePart *mime_part, - CamelMimePartEncodingType encoding) -{ - const char *text; - - text = camel_mime_part_encoding_to_string (encoding); - camel_medium_set_header (CAMEL_MEDIUM (mime_part), - "Content-Transfer-Encoding", text); -} - -const CamelMimePartEncodingType -camel_mime_part_get_encoding (CamelMimePart *mime_part) -{ - return mime_part->encoding; -} - -/* FIXME: do something with this stuff ... */ - -void -camel_mime_part_set_content_languages (CamelMimePart *mime_part, GList *content_languages) -{ - if (mime_part->content_languages) string_list_free (mime_part->content_languages); - mime_part->content_languages = content_languages; - - /* FIXME: translate to a header and set it */ -} - -const GList * -camel_mime_part_get_content_languages (CamelMimePart *mime_part) -{ - return mime_part->content_languages; -} - - -/* **** */ - -/* **** Content-Type: */ - -void -camel_mime_part_set_content_type (CamelMimePart *mime_part, gchar *content_type) -{ - camel_medium_set_header (CAMEL_MEDIUM (mime_part), - "Content-Type", content_type); -} - -GMimeContentField * -camel_mime_part_get_content_type (CamelMimePart *mime_part) -{ - return mime_part->content_type; -} - -/*********/ - - - -static void -set_content_object (CamelMedium *medium, CamelDataWrapper *content) -{ - CamelMimePart *mime_part = CAMEL_MIME_PART (medium); - GMimeContentField *object_content_field; - - parent_class->set_content_object (medium, content); - - object_content_field = camel_data_wrapper_get_mime_type_field (content); - if (mime_part->content_type && - (mime_part->content_type != object_content_field)) { - char *txt; - - txt = header_content_type_format(object_content_field?object_content_field->content_type:NULL); - camel_medium_set_header (CAMEL_MEDIUM (mime_part), - "Content-Type", txt); - } -} - -/**********************************************************************/ - -static int -write_to_stream(CamelDataWrapper *data_wrapper, CamelStream *stream) -{ - CamelMimePart *mp = CAMEL_MIME_PART(data_wrapper); - CamelMedium *medium = CAMEL_MEDIUM(data_wrapper); - CamelDataWrapper *content; - int total = 0; - int count; - - d(printf("mime_part::write_to_stream\n")); - - /* FIXME: something needs to be done about this ... */ - /* FIXME: need to count these bytes too */ -#ifndef NO_WARNINGS -#warning content-languages should be stored as a header -#endif - - if (mp->headers) { - struct _header_raw *h = mp->headers; - - while (h) { - if (h->value == NULL){ - g_warning("h->value is NULL here for %s", h->name); - count = 0; - } else { - count = camel_stream_printf(stream, "%s%s%s\n", h->name, isspace(h->value[0]) ? ":" : ": ", h->value); - } - if (count == -1) - return -1; - total += count; - h = h->next; - } - } - - count = camel_stream_write(stream, "\n", 1); - if (count == -1) - return -1; - total += count; - - content = camel_medium_get_content_object(medium); - if (content) { - /* I dont really like this here, but i dont know where else it might go ... */ -#define CAN_THIS_GO_ELSEWHERE -#ifdef CAN_THIS_GO_ELSEWHERE - CamelMimeFilter *filter = NULL; - CamelStreamFilter *filter_stream = NULL; - CamelMimeFilter *charenc = NULL; - const char *charset; - - switch(mp->encoding) { - case CAMEL_MIME_PART_ENCODING_BASE64: - filter = (CamelMimeFilter *)camel_mime_filter_basic_new_type(CAMEL_MIME_FILTER_BASIC_BASE64_ENC); - break; - case CAMEL_MIME_PART_ENCODING_QUOTEDPRINTABLE: - filter = (CamelMimeFilter *)camel_mime_filter_basic_new_type(CAMEL_MIME_FILTER_BASIC_QP_ENC); - break; - default: - break; - } - - if (gmime_content_field_is_type(mp->content_type, "text", "*")) { - charset = gmime_content_field_get_parameter(mp->content_type, "charset"); - if (!(charset == NULL || !strcasecmp(charset, "us-ascii") || !strcasecmp(charset, "utf-8"))) { - charenc = (CamelMimeFilter *)camel_mime_filter_charset_new_convert("utf-8", charset); - } - } - - if (filter || charenc) { - filter_stream = camel_stream_filter_new_with_stream(stream); - - /* if we have a character encoder, add that always */ - if (charenc) { - camel_stream_filter_add(filter_stream, charenc); - camel_object_unref((CamelObject *)charenc); - } - - /* we only re-do crlf on encoded blocks */ - if (filter && gmime_content_field_is_type(mp->content_type, "text", "*")) { - CamelMimeFilter *crlf = camel_mime_filter_crlf_new(CAMEL_MIME_FILTER_CRLF_ENCODE, - CAMEL_MIME_FILTER_CRLF_MODE_CRLF_ONLY); - - camel_stream_filter_add(filter_stream, crlf); - camel_object_unref((CamelObject *)crlf); - - } - - if (filter) { - camel_stream_filter_add(filter_stream, filter); - camel_object_unref((CamelObject *)filter); - } - - stream = (CamelStream *)filter_stream; - } - -#endif - count = camel_data_wrapper_write_to_stream(content, stream); - if (filter_stream) { - camel_stream_flush((CamelStream *)filter_stream); - camel_object_unref((CamelObject *)filter_stream); - } - if (count == -1) - return -1; - total += count; - } else { - g_warning("No content for medium, nothing to write"); - } - return total; -} - -/* mime_part */ -static int -construct_from_parser(CamelMimePart *dw, CamelMimeParser *mp) -{ - struct _header_raw *headers; - char *buf; - int len; - - d(printf("mime_part::construct_from_parser()\n")); - - switch (camel_mime_parser_step(mp, &buf, &len)) { - case HSCAN_MESSAGE: - /* set the default type of a message always */ - gmime_content_field_construct_from_string (dw->content_type, "message/rfc822"); - case HSCAN_HEADER: - case HSCAN_MULTIPART: - /* we have the headers, build them into 'us' */ - headers = camel_mime_parser_headers_raw(mp); - while (headers) { - camel_medium_add_header((CamelMedium *)dw, headers->name, headers->value); - headers = headers->next; - } - camel_mime_part_construct_content_from_parser(dw, mp); - break; - default: - g_warning("Invalid state encountered???: %d", camel_mime_parser_state(mp)); - } - - d(printf("mime_part::construct_from_parser() leaving\n")); -#ifndef NO_WARNINGS -#warning "Need to work out how to detect a (fatally) bad parse in the parser" -#endif - return 0; -} - -/** - * camel_mime_part_construct_from_parser: - * @mime_part: - * @mp: - * - * - * - * Return value: - **/ -int -camel_mime_part_construct_from_parser(CamelMimePart *mime_part, CamelMimeParser *mp) -{ - return CMP_CLASS (mime_part)->construct_from_parser (mime_part, mp); -} - -static int -construct_from_stream(CamelDataWrapper *dw, CamelStream *s) -{ - CamelMimeParser *mp; - int ret; - - d(printf("mime_part::construct_from_stream()\n")); - - mp = camel_mime_parser_new(); - if (camel_mime_parser_init_with_stream(mp, s) == -1) { - g_warning("Cannot create parser for stream"); - ret = -1; - } else { - ret = camel_mime_part_construct_from_parser((CamelMimePart *)dw, mp); - } - camel_object_unref((CamelObject *)mp); - return ret; -} - - -const gchar * -camel_mime_part_encoding_to_string (CamelMimePartEncodingType encoding) -{ - switch (encoding) { - case CAMEL_MIME_PART_ENCODING_DEFAULT: - case CAMEL_MIME_PART_ENCODING_7BIT: - return "7bit"; - case CAMEL_MIME_PART_ENCODING_8BIT: - return "8bit"; - case CAMEL_MIME_PART_ENCODING_BASE64: - return "base64"; - case CAMEL_MIME_PART_ENCODING_QUOTEDPRINTABLE: - return "quoted-printable"; - default: - break; - } - return ""; -} - - - -/* FIXME I am not sure this is the correct way to do this. */ -CamelMimePartEncodingType -camel_mime_part_encoding_from_string (const gchar *string) -{ - if (string == NULL) - return CAMEL_MIME_PART_ENCODING_DEFAULT; - else if (strcasecmp (string, "7bit") == 0) - return CAMEL_MIME_PART_ENCODING_7BIT; - else if (strcasecmp (string, "8bit") == 0) - return CAMEL_MIME_PART_ENCODING_8BIT; - else if (strcasecmp (string, "base64") == 0) - return CAMEL_MIME_PART_ENCODING_BASE64; - else if (strcasecmp (string, "quoted-printable") == 0) - return CAMEL_MIME_PART_ENCODING_QUOTEDPRINTABLE; - else - /* FIXME? Spit a warning? */ - return CAMEL_MIME_PART_ENCODING_DEFAULT; -} - - -/******************************/ -/** Misc utility functions **/ - -/** - * camel_mime_part_new: - * - * Return value: a new CamelMimePart - **/ -CamelMimePart * -camel_mime_part_new (void) -{ - return (CamelMimePart *)camel_object_new (CAMEL_MIME_PART_TYPE); -} - -/** - * camel_mime_part_set_content: - * @camel_mime_part: Mime part - * @data: data to put into the part - * @length: length of @data - * @type: Content-Type of the data - * - * Utility function used to set the content of a mime part object to - * be the provided data. If @length is 0, this routine can be used as - * a way to remove old content (in which case @data and @type are - * ignored and may be %NULL). - **/ -void -camel_mime_part_set_content (CamelMimePart *camel_mime_part, - const char *data, int length, - const char *type) /* why on earth is the type last? */ -{ - CamelMedium *medium = CAMEL_MEDIUM (camel_mime_part); - - if (length) { - CamelDataWrapper *dw; - CamelStream *stream; - - dw = camel_data_wrapper_new (); - camel_data_wrapper_set_mime_type (dw, type); - stream = camel_stream_mem_new_with_buffer (data, length); - camel_data_wrapper_construct_from_stream (dw, stream); - camel_object_unref (CAMEL_OBJECT (stream)); - camel_medium_set_content_object (medium, dw); - camel_object_unref (CAMEL_OBJECT (dw)); - } else { - if (medium->content) - camel_object_unref (CAMEL_OBJECT (medium->content)); - medium->content = NULL; - } -} diff --git a/camel/camel-mime-part.h b/camel/camel-mime-part.h deleted file mode 100644 index ed0df94a4b..0000000000 --- a/camel/camel-mime-part.h +++ /dev/null @@ -1,129 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */ -/* camel-mime-part.h : class for a mime part */ - -/* - * - * Authors: Bertrand Guiheneuf <bertrand@helixcode.com> - * Michael Zucchi <notzed@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_MIME_PART_H -#define CAMEL_MIME_PART_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-medium.h> -#include <camel/camel-mime-utils.h> -#include <camel/camel-mime-parser.h> - -#define CAMEL_MIME_PART_TYPE (camel_mime_part_get_type ()) -#define CAMEL_MIME_PART(obj) (CAMEL_CHECK_CAST((obj), CAMEL_MIME_PART_TYPE, CamelMimePart)) -#define CAMEL_MIME_PART_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_MIME_PART_TYPE, CamelMimePartClass)) -#define CAMEL_IS_MIME_PART(o) (CAMEL_CHECK_TYPE((o), CAMEL_MIME_PART_TYPE)) - - -enum _CamelMimePartEncodingType { - CAMEL_MIME_PART_ENCODING_DEFAULT, - CAMEL_MIME_PART_ENCODING_7BIT, - CAMEL_MIME_PART_ENCODING_8BIT, - CAMEL_MIME_PART_ENCODING_BASE64, - CAMEL_MIME_PART_ENCODING_QUOTEDPRINTABLE, - CAMEL_MIME_PART_NUM_ENCODINGS -}; -typedef enum _CamelMimePartEncodingType CamelMimePartEncodingType; - - -/* Do not change these values directly, you would regret it one day */ -struct _CamelMimePart -{ - CamelMedium parent_object; - - /* All fields here are -** PRIVATE **- */ - gchar *description; - CamelMimeDisposition *disposition; - gchar *content_id; - gchar *content_MD5; - GList *content_languages; - CamelMimePartEncodingType encoding; - - GMimeContentField *content_type; - - struct _header_raw *headers; /* mime headers */ -}; - -typedef struct _CamelMimePartClass { - CamelMediumClass parent_class; - - /* Virtual methods */ - int (*construct_from_parser) (CamelMimePart *, CamelMimeParser *); -} CamelMimePartClass; - -/* Standard Camel function */ -CamelType camel_mime_part_get_type (void); - -/* public methods */ -CamelMimePart * camel_mime_part_new (void); - -void camel_mime_part_set_description (CamelMimePart *mime_part, const gchar *description); -const gchar *camel_mime_part_get_description (CamelMimePart *mime_part); - -void camel_mime_part_set_disposition (CamelMimePart *mime_part, const gchar *disposition); -const gchar *camel_mime_part_get_disposition (CamelMimePart *mime_part); - -void camel_mime_part_set_filename (CamelMimePart *mime_part, const gchar *filename); -const gchar *camel_mime_part_get_filename (CamelMimePart *mime_part); - -void camel_mime_part_set_content_id (CamelMimePart *mime_part, const char *contentid); -const gchar *camel_mime_part_get_content_id (CamelMimePart *mime_part); - -void camel_mime_part_set_content_MD5 (CamelMimePart *mime_part, const char *); -const gchar *camel_mime_part_get_content_MD5 (CamelMimePart *mime_part); - -void camel_mime_part_set_encoding (CamelMimePart *mime_part, CamelMimePartEncodingType type); -CamelMimePartEncodingType camel_mime_part_get_encoding (CamelMimePart *mime_part); - -void camel_mime_part_set_content_languages (CamelMimePart *mime_part, GList *content_languages); -const GList *camel_mime_part_get_content_languages (CamelMimePart *mime_part); - -/* FIXME: what about content-type parameters? what about major/minor parts? */ -void camel_mime_part_set_content_type (CamelMimePart *mime_part, gchar *content_type); -GMimeContentField *camel_mime_part_get_content_type (CamelMimePart *mime_part); - -const gchar * camel_mime_part_encoding_to_string (CamelMimePartEncodingType encoding); -CamelMimePartEncodingType camel_mime_part_encoding_from_string (const gchar *string); - -/* construction */ -int camel_mime_part_construct_from_parser (CamelMimePart *, CamelMimeParser *); - -/* utility functions */ -void camel_mime_part_set_content (CamelMimePart *camel_mime_part, - const char *content, int length, const char *type); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MIME_PART_H */ - diff --git a/camel/camel-mime-utils.c b/camel/camel-mime-utils.c deleted file mode 100644 index d2df6cac76..0000000000 --- a/camel/camel-mime-utils.c +++ /dev/null @@ -1,3070 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * Jeffrey Stedfast <fejj@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -/* dont touch this file without my permission - Michael */ - -#include <config.h> - -#include <stdio.h> - -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <unicode.h> - -#include <glib.h> -#include <time.h> - -#include <ctype.h> -#include <errno.h> - -#include "camel-mime-utils.h" -#include "camel-charset-map.h" - -#ifndef CLEAN_DATE -#include "broken-date-parser.h" -#endif - -#if 0 -int strdup_count = 0; -int malloc_count = 0; -int free_count = 0; - -#define g_strdup(x) (strdup_count++, g_strdup(x)) -#define g_malloc(x) (malloc_count++, g_malloc(x)) -#define g_free(x) (free_count++, g_free(x)) -#endif - -/* for all warnings ... */ -#define w(x) x - -#define d(x) -#define d2(x) - -#define CAMEL_UUDECODE_CHAR(c) (((c) - ' ') & 077) - -static char *base64_alphabet = -"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -static unsigned char tohex[16] = { - '0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' -}; - -static unsigned short camel_mime_special_table[256] = { - 5, 5, 5, 5, 5, 5, 5, 5, 5,231, 7, 5, 5, 39, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 242,448, 76,192,192,192,192,192, 76, 76,448,448, 76,448, 72,324, - 448,448,448,448,448,448,448,448,448,448, 76, 76, 76, 4, 76, 68, - 76,448,448,448,448,448,448,448,448,448,448,448,448,448,448,448, - 448,448,448,448,448,448,448,448,448,448,448,108,236,108,192, 64, - 192,448,448,448,448,448,448,448,448,448,448,448,448,448,448,448, - 448,448,448,448,448,448,448,448,448,448,448,192,192,192,192, 5, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static unsigned char camel_mime_base64_rank[256] = { - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255, 62,255,255,255, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,255,255,255, 0,255,255, - 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,255,255,255,255,255, - 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -}; - -/* - if any of these change, then the tables above should be regenerated - by compiling this with -DBUILD_TABLE, and running. - - gcc -DCLEAN_DATE -o buildtable -I.. `glib-config --cflags --libs` -lunicode -DBUILD_TABLE camel-mime-utils.c camel-charset-map.c - ./buildtable - -*/ -enum { - IS_CTRL = 1<<0, - IS_LWSP = 1<<1, - IS_TSPECIAL = 1<<2, - IS_SPECIAL = 1<<3, - IS_SPACE = 1<<4, - IS_DSPECIAL = 1<<5, - IS_QPSAFE = 1<<6, - IS_ESAFE = 1<<7, /* encoded word safe */ - IS_PSAFE = 1<<8, /* encoded word in phrase safe */ -}; - -#define is_ctrl(x) ((camel_mime_special_table[(unsigned char)(x)] & IS_CTRL) != 0) -#define is_lwsp(x) ((camel_mime_special_table[(unsigned char)(x)] & IS_LWSP) != 0) -#define is_tspecial(x) ((camel_mime_special_table[(unsigned char)(x)] & IS_TSPECIAL) != 0) -#define is_type(x, t) ((camel_mime_special_table[(unsigned char)(x)] & (t)) != 0) -#define is_ttoken(x) ((camel_mime_special_table[(unsigned char)(x)] & (IS_TSPECIAL|IS_LWSP|IS_CTRL)) == 0) -#define is_atom(x) ((camel_mime_special_table[(unsigned char)(x)] & (IS_SPECIAL|IS_SPACE|IS_CTRL)) == 0) -#define is_dtext(x) ((camel_mime_special_table[(unsigned char)(x)] & IS_DSPECIAL) == 0) -#define is_fieldname(x) ((camel_mime_special_table[(unsigned char)(x)] & (IS_CTRL|IS_SPACE)) == 0) -#define is_qpsafe(x) ((camel_mime_special_table[(unsigned char)(x)] & IS_QPSAFE) != 0) -#define is_especial(x) ((camel_mime_special_table[(unsigned char)(x)] & IS_ESPECIAL) != 0) -#define is_psafe(x) ((camel_mime_special_table[(unsigned char)(x)] & IS_PSAFE) != 0) - -/* only needs to be run to rebuild the tables above */ -#ifdef BUILD_TABLE - -#define CHARS_LWSP " \t\n\r" -#define CHARS_TSPECIAL "()<>@,;:\\\"/[]?=" -#define CHARS_SPECIAL "()<>@,;:\\\".[]" -#define CHARS_CSPECIAL "()\\\r" /* not in comments */ -#define CHARS_DSPECIAL "[]\\\r \t" /* not in domains */ -#define CHARS_ESPECIAL "()<>@,;:\"/[]?.=_" /* list of characters that must be encoded. - encoded word in text specials: rfc 2047 5(1)*/ -#define CHARS_PSPECIAL "!*+-/" /* list of additional characters that can be left unencoded. - encoded word in phrase specials: rfc 2047 5(3) */ - -static void -header_remove_bits(unsigned short bit, unsigned char *vals) -{ - int i; - - for (i=0;vals[i];i++) - camel_mime_special_table[vals[i]] &= ~ bit; -} - -static void -header_init_bits(unsigned short bit, unsigned short bitcopy, int remove, unsigned char *vals) -{ - int i; - int len = strlen(vals); - - if (!remove) { - for (i=0;i<len;i++) { - camel_mime_special_table[vals[i]] |= bit; - } - if (bitcopy) { - for (i=0;i<256;i++) { - if (camel_mime_special_table[i] & bitcopy) - camel_mime_special_table[i] |= bit; - } - } - } else { - for (i=0;i<256;i++) - camel_mime_special_table[i] |= bit; - for (i=0;i<len;i++) { - camel_mime_special_table[vals[i]] &= ~bit; - } - if (bitcopy) { - for (i=0;i<256;i++) { - if (camel_mime_special_table[i] & bitcopy) - camel_mime_special_table[i] &= ~bit; - } - } - } -} - -static void -header_decode_init(void) -{ - int i; - - for (i=0;i<256;i++) { - camel_mime_special_table[i] = 0; - if (i<32) - camel_mime_special_table[i] |= IS_CTRL; - if ((i>=33 && i<=60) || (i>=62 && i<=126) || i==32 || i==9) - camel_mime_special_table[i] |= (IS_QPSAFE|IS_ESAFE); - if ((i>='0' && i<='9') || (i>='a' && i<='z') || (i>='A' && i<= 'Z')) - camel_mime_special_table[i] |= IS_PSAFE; - } - camel_mime_special_table[127] |= IS_CTRL; - camel_mime_special_table[' '] |= IS_SPACE; - header_init_bits(IS_LWSP, 0, 0, CHARS_LWSP); - header_init_bits(IS_TSPECIAL, IS_CTRL, 0, CHARS_TSPECIAL); - header_init_bits(IS_SPECIAL, 0, 0, CHARS_SPECIAL); - header_init_bits(IS_DSPECIAL, 0, FALSE, CHARS_DSPECIAL); - header_remove_bits(IS_ESAFE, CHARS_ESPECIAL); - header_init_bits(IS_PSAFE, 0, 0, CHARS_PSPECIAL); -} - -void -base64_init(void) -{ - int i; - - memset(camel_mime_base64_rank, 0xff, sizeof(camel_mime_base64_rank)); - for (i=0;i<64;i++) { - camel_mime_base64_rank[(unsigned int)base64_alphabet[i]] = i; - } - camel_mime_base64_rank['='] = 0; -} - -int main(int argc, char **argv) -{ - int i; - void run_test(void); - - header_decode_init(); - base64_init(); - - printf("static unsigned short camel_mime_special_table[256] = {\n\t"); - for (i=0;i<256;i++) { - printf("%3d,", camel_mime_special_table[i]); - if ((i&15) == 15) { - printf("\n"); - if (i!=255) { - printf("\t"); - } - } - } - printf("};\n"); - - printf("static unsigned char camel_mime_base64_rank[256] = {\n\t"); - for (i=0;i<256;i++) { - printf("%3d,", camel_mime_base64_rank[i]); - if ((i&15) == 15) { - printf("\n"); - if (i!=255) { - printf("\t"); - } - } - } - printf("};\n"); - - run_test(); - - return 0; -} - -#endif - - -/* call this when finished encoding everything, to - flush off the last little bit */ -int -base64_encode_close(unsigned char *in, int inlen, gboolean break_lines, unsigned char *out, int *state, int *save) -{ - int c1, c2; - unsigned char *outptr = out; - - if (inlen>0) - outptr += base64_encode_step(in, inlen, break_lines, outptr, state, save); - - c1 = ((unsigned char *)save)[1]; - c2 = ((unsigned char *)save)[2]; - - switch (((char *)save)[0]) { - case 2: - outptr[2] = base64_alphabet[ ( (c2 &0x0f) << 2 ) ]; - g_assert(outptr[2] != 0); - goto skip; - case 1: - outptr[2] = '='; - skip: - outptr[0] = base64_alphabet[ c1 >> 2 ]; - outptr[1] = base64_alphabet[ c2 >> 4 | ( (c1&0x3) << 4 )]; - outptr[3] = '='; - outptr += 4; - break; - } - if (break_lines) - *outptr++ = '\n'; - - *save = 0; - *state = 0; - - return outptr-out; -} - -/* - performs an 'encode step', only encodes blocks of 3 characters to the - output at a time, saves left-over state in state and save (initialise to - 0 on first invocation). -*/ -int -base64_encode_step(unsigned char *in, int len, gboolean break_lines, unsigned char *out, int *state, int *save) -{ - register unsigned char *inptr, *outptr; - - if (len<=0) - return 0; - - inptr = in; - outptr = out; - - d(printf("we have %d chars, and %d saved chars\n", len, ((char *)save)[0])); - - if (len + ((char *)save)[0] > 2) { - unsigned char *inend = in+len-2; - register int c1, c2, c3; - register int already; - - already = *state; - - switch (((char *)save)[0]) { - case 1: c1 = ((unsigned char *)save)[1]; goto skip1; - case 2: c1 = ((unsigned char *)save)[1]; - c2 = ((unsigned char *)save)[2]; goto skip2; - } - - /* yes, we jump into the loop, no i'm not going to change it, it's beautiful! */ - while (inptr < inend) { - c1 = *inptr++; - skip1: - c2 = *inptr++; - skip2: - c3 = *inptr++; - *outptr++ = base64_alphabet[ c1 >> 2 ]; - *outptr++ = base64_alphabet[ c2 >> 4 | ( (c1&0x3) << 4 ) ]; - *outptr++ = base64_alphabet[ ( (c2 &0x0f) << 2 ) | (c3 >> 6) ]; - *outptr++ = base64_alphabet[ c3 & 0x3f ]; - /* this is a bit ugly ... */ - if (break_lines && (++already)>=19) { - *outptr++='\n'; - already = 0; - } - } - - ((char *)save)[0] = 0; - len = 2-(inptr-inend); - *state = already; - } - - d(printf("state = %d, len = %d\n", - (int)((char *)save)[0], - len)); - - if (len>0) { - register char *saveout; - - /* points to the slot for the next char to save */ - saveout = & (((char *)save)[1]) + ((char *)save)[0]; - - /* len can only be 0 1 or 2 */ - switch(len) { - case 2: *saveout++ = *inptr++; - case 1: *saveout++ = *inptr++; - } - ((char *)save)[0]+=len; - } - - d(printf("mode = %d\nc1 = %c\nc2 = %c\n", - (int)((char *)save)[0], - (int)((char *)save)[1], - (int)((char *)save)[2])); - - return outptr-out; -} - - -/** - * base64_decode_step: decode a chunk of base64 encoded data - * @in: input stream - * @len: max length of data to decode - * @out: output stream - * @state: holds the number of bits that are stored in @save - * @save: leftover bits that have not yet been decoded - * - * Decodes a chunk of base64 encoded data - **/ -int -base64_decode_step(unsigned char *in, int len, unsigned char *out, int *state, unsigned int *save) -{ - register unsigned char *inptr, *outptr; - unsigned char *inend, c; - register unsigned int v; - int i; - - inend = in+len; - outptr = out; - - /* convert 4 base64 bytes to 3 normal bytes */ - v=*save; - i=*state; - inptr = in; - while (inptr<inend) { - c = camel_mime_base64_rank[*inptr++]; - if (c != 0xff) { - v = (v<<6) | c; - i++; - if (i==4) { - *outptr++ = v>>16; - *outptr++ = v>>8; - *outptr++ = v; - i=0; - } - } - } - - *save = v; - *state = i; - - /* quick scan back for '=' on the end somewhere */ - /* fortunately we can drop 1 output char for each trailing = (upto 2) */ - i=2; - while (inptr>in && i) { - inptr--; - if (camel_mime_base64_rank[*inptr] != 0xff) { - if (*inptr == '=') - outptr--; - i--; - } - } - - /* if i!= 0 then there is a truncation error! */ - return outptr-out; -} - - -/** - * uudecode_step: uudecode a chunk of data - * @in: input stream - * @len: max length of data to decode ( normally strlen(in) ??) - * @out: output stream - * @state: holds the number of bits that are stored in @save - * @save: leftover bits that have not yet been decoded - * @uulen: holds the value of the length-char which is used to calculate - * how many more chars need to be decoded for that 'line' - * - * uudecodes a chunk of data. Assumes the "begin <mode> <file name>" line - * has been stripped off. - **/ -int -uudecode_step (unsigned char *in, int len, unsigned char *out, int *state, guint32 *save, char *uulen) -{ - register unsigned char *inptr, *outptr; - unsigned char *inend, ch; - register guint32 saved; - gboolean last_was_eoln; - int i; - - if (*uulen <= 0) - last_was_eoln = TRUE; - else - last_was_eoln = FALSE; - - inend = in + len; - outptr = out; - saved = *save; - i = *state; - inptr = in; - while (inptr < inend && *inptr) { - if (*inptr == '\n' || last_was_eoln) { - if (last_was_eoln) { - *uulen = CAMEL_UUDECODE_CHAR (*inptr); - last_was_eoln = FALSE; - } else { - last_was_eoln = TRUE; - } - - inptr++; - continue; - } - - ch = *inptr++; - - if (*uulen > 0) { - /* save the byte */ - saved = (saved << 8) | ch; - i++; - if (i == 4) { - /* convert 4 uuencoded bytes to 3 normal bytes */ - unsigned char b0, b1, b2, b3; - - b0 = saved >> 24; - b1 = saved >> 16 & 0xff; - b2 = saved >> 8 & 0xff; - b3 = saved & 0xff; - - if (*uulen >= 3) { - *outptr++ = CAMEL_UUDECODE_CHAR (b0) << 2 | CAMEL_UUDECODE_CHAR (b1) >> 4; - *outptr++ = CAMEL_UUDECODE_CHAR (b1) << 4 | CAMEL_UUDECODE_CHAR (b2) >> 2; - *outptr++ = CAMEL_UUDECODE_CHAR (b2) << 6 | CAMEL_UUDECODE_CHAR (b3); - } else { - if (*uulen >= 1) { - *outptr++ = CAMEL_UUDECODE_CHAR (b0) << 2 | CAMEL_UUDECODE_CHAR (b1) >> 4; - } - if (*uulen >= 2) { - *outptr++ = CAMEL_UUDECODE_CHAR (b1) << 4 | CAMEL_UUDECODE_CHAR (b2) >> 2; - } - } - - i = 0; - saved = 0; - *uulen -= 3; - } - } else { - break; - } - } - - *save = saved; - *state = i; - - return outptr - out; -} - -/* complete qp encoding */ -int -quoted_encode_close(unsigned char *in, int len, unsigned char *out, int *state, int *save) -{ - register unsigned char *outptr = out; - int last; - - if (len>0) - outptr += quoted_encode_step(in, len, outptr, state, save); - - last = *state; - if (last != -1) { - /* space/tab must be encoded if it's the last character on - the line */ - if (is_qpsafe(last) && last!=' ' && last!=9) { - *outptr++ = last; - } else { - *outptr++ = '='; - *outptr++ = tohex[(last>>4) & 0xf]; - *outptr++ = tohex[last & 0xf]; - } - } - - /* hmm, not sure if this should really be added here, we dont want - to add it to the content, afterall ...? */ - *outptr++ = '\n'; - - *save = 0; - *state = -1; - - return outptr-out; -} - -/* perform qp encoding, initialise state to -1 and save to 0 on first invocation */ -int -quoted_encode_step (unsigned char *in, int len, unsigned char *out, int *statep, int *save) -{ - register guchar *inptr, *outptr, *inend; - guchar c; - register int sofar = *save; /* keeps track of how many chars on a line */ - register int last = *statep; /* keeps track if last char to end was a space cr etc */ - - inptr = in; - inend = in + len; - outptr = out; - while (inptr < inend) { - c = *inptr++; - if (c == '\r') { - if (last != -1) { - *outptr++ = '='; - *outptr++ = tohex[(last >> 4) & 0xf]; - *outptr++ = tohex[last & 0xf]; - sofar += 3; - } - last = c; - } else if (c == '\n') { - if (last != -1 && last != '\r') { - *outptr++ = '='; - *outptr++ = tohex[(last >> 4) & 0xf]; - *outptr++ = tohex[last & 0xf]; - } - *outptr++ = '\n'; - sofar = 0; - last = -1; - } else { - if (last != -1) { - if (is_qpsafe(last)) { - *outptr++ = last; - sofar++; - } else { - *outptr++ = '='; - *outptr++ = tohex[(last >> 4) & 0xf]; - *outptr++ = tohex[last & 0xf]; - sofar += 3; - } - } - - if (is_qpsafe(c)) { - if (sofar > 74) { - *outptr++ = '='; - *outptr++ = '\n'; - sofar = 0; - } - - /* delay output of space char */ - if (c==' ' || c=='\t') { - last = c; - } else { - *outptr++ = c; - sofar++; - last = -1; - } - } else { - if (sofar > 72) { - *outptr++ = '='; - *outptr++ = '\n'; - sofar = 3; - } else - sofar += 3; - - *outptr++ = '='; - *outptr++ = tohex[(c >> 4) & 0xf]; - *outptr++ = tohex[c & 0xf]; - last = -1; - } - } - } - *save = sofar; - *statep = last; - - return (outptr - out); -} - -/* - FIXME: this does not strip trailing spaces from lines (as it should, rfc 2045, section 6.7) - Should it also canonicalise the end of line to CR LF?? - - Note: Trailing rubbish (at the end of input), like = or =x or =\r will be lost. -*/ - -int -quoted_decode_step(unsigned char *in, int len, unsigned char *out, int *savestate, int *saveme) -{ - register unsigned char *inptr, *outptr; - unsigned char *inend, c; - int state, save; - - inend = in+len; - outptr = out; - - d(printf("quoted-printable, decoding text '%.*s'\n", len, in)); - - state = *savestate; - save = *saveme; - inptr = in; - while (inptr<inend) { - switch (state) { - case 0: - while (inptr<inend) { - c = *inptr++; - /* FIXME: use a specials table to avoid 3 comparisons for the common case */ - if (c=='=') { - state = 1; - break; - } -#ifdef CANONICALISE_EOL - /*else if (c=='\r') { - state = 3; - } else if (c=='\n') { - *outptr++ = '\r'; - *outptr++ = c; - } */ -#endif - else { - *outptr++ = c; - } - } - break; - case 1: - c = *inptr++; - if (c=='\n') { - /* soft break ... unix end of line */ - state = 0; - } else { - save = c; - state = 2; - } - break; - case 2: - c = *inptr++; - if (isxdigit(c) && isxdigit(save)) { - c = toupper(c); - save = toupper(save); - *outptr++ = (((save>='A'?save-'A'+10:save-'0')&0x0f) << 4) - | ((c>='A'?c-'A'+10:c-'0')&0x0f); - } else if (c=='\n' && save == '\r') { - /* soft break ... canonical end of line */ - } else { - /* just output the data */ - *outptr++ = '='; - *outptr++ = save; - *outptr++ = c; - } - state = 0; - break; -#ifdef CANONICALISE_EOL - case 3: - /* convert \r -> to \r\n, leaves \r\n alone */ - c = *inptr++; - if (c=='\n') { - *outptr++ = '\r'; - *outptr++ = c; - } else { - *outptr++ = '\r'; - *outptr++ = '\n'; - *outptr++ = c; - } - state = 0; - break; -#endif - } - } - - *savestate = state; - *saveme = save; - - return outptr-out; -} - -/* - this is for the "Q" encoding of international words, - which is slightly different than plain quoted-printable (mainly by allowing 0x20 <> _) -*/ -static int -quoted_decode(const unsigned char *in, int len, unsigned char *out) -{ - register const unsigned char *inptr; - register unsigned char *outptr; - unsigned const char *inend; - unsigned char c, c1; - int ret = 0; - - inend = in+len; - outptr = out; - - d(printf("decoding text '%.*s'\n", len, in)); - - inptr = in; - while (inptr<inend) { - c = *inptr++; - if (c=='=') { - /* silently ignore truncated data? */ - if (inend-in>=2) { - c = toupper(*inptr++); - c1 = toupper(*inptr++); - *outptr++ = (((c>='A'?c-'A'+10:c-'0')&0x0f) << 4) - | ((c1>='A'?c1-'A'+10:c1-'0')&0x0f); - } else { - ret = -1; - break; - } - } else if (c=='_') { - *outptr++ = 0x20; - } else if (c==' ' || c==0x09) { - /* FIXME: this is an error! ignore for now ... */ - ret = -1; - break; - } else { - *outptr++ = c; - } - } - if (ret==0) { - return outptr-out; - } - return -1; -} - -/* rfc2047 version of quoted-printable */ -/* safemask is the mask to apply to the camel_mime_special_table to determine what - characters can safely be included without encoding */ -static int -quoted_encode(const unsigned char *in, int len, unsigned char *out, unsigned short safemask) -{ - register const unsigned char *inptr, *inend; - unsigned char *outptr; - unsigned char c; - - inptr = in; - inend = in + len; - outptr = out; - while (inptr < inend) { - c = *inptr++; - if (camel_mime_special_table[c] & safemask) { - if (c==' ') - c = '_'; - *outptr++ = c; - } else { - *outptr++ = '='; - *outptr++ = tohex[(c >> 4) & 0xf]; - *outptr++ = tohex[c & 0xf]; - } - } - - d(printf("encoding '%.*s' = '%.*s'\n", len, in, outptr-out, out)); - - return (outptr - out); -} - - -static void -header_decode_lwsp(const char **in) -{ - const char *inptr = *in; - char c; - - d2(printf("is ws: '%s'\n", *in)); - - while (is_lwsp(*inptr) || (*inptr =='(' && *inptr != '\0')) { - while (is_lwsp(*inptr) && inptr != '\0') { - d2(printf("(%c)", *inptr)); - inptr++; - } - d2(printf("\n")); - - /* check for comments */ - if (*inptr == '(') { - int depth = 1; - inptr++; - while (depth && (c=*inptr) && *inptr != '\0') { - if (c=='\\' && inptr[1]) { - inptr++; - } else if (c=='(') { - depth++; - } else if (c==')') { - depth--; - } - inptr++; - } - } - } - *in = inptr; -} - -/* decode rfc 2047 encoded string segment */ -static char * -rfc2047_decode_word(const char *in, int len) -{ - const char *inptr = in+2; - const char *inend = in+len-2; - char *encname; - int tmplen; - int ret; - char *decword = NULL; - char *decoded = NULL; - char *outbase = NULL; - char *inbuf, *outbuf; - int inlen, outlen; - unicode_iconv_t ic; - - d(printf("decoding '%.*s'\n", len, in)); - - /* just make sure we're not passed shit */ - if (len<7 - || !(in[0]=='=' && in[1]=='?' && in[len-1]=='=' && in[len-2]=='?')) { - d(printf("invalid\n")); - return NULL; - } - - inptr = memchr(inptr, '?', inend-inptr); - if (inptr!=NULL - && inptr<inend+2 - && inptr[2]=='?') { - d(printf("found ?, encoding is '%c'\n", inptr[0])); - inptr++; - tmplen = inend-inptr-2; - decword = alloca(tmplen); /* this will always be more-than-enough room */ - switch(toupper(inptr[0])) { - case 'Q': - inlen = quoted_decode(inptr+2, tmplen, decword); - break; - case 'B': { - int state=0; - unsigned int save=0; - inlen = base64_decode_step((char *)inptr+2, tmplen, decword, &state, &save); - /* if state != 0 then error? */ - break; - } - } - d(printf("The encoded length = %d\n", inlen)); - if (inlen>0) { - /* yuck, all this snot is to setup iconv! */ - tmplen = inptr-in-3; - encname = alloca(tmplen+1); - encname[tmplen]=0; - memcpy(encname, in+2, tmplen); - - inbuf = decword; - - outlen = inlen*6; - outbase = alloca(outlen); - outbuf = outbase; - - /* TODO: Should this cache iconv converters? */ - ic = unicode_iconv_open("UTF-8", encname); - if (ic != (unicode_iconv_t)-1) { - ret = unicode_iconv(ic, (const char **)&inbuf, &inlen, &outbuf, &outlen); - unicode_iconv_close(ic); - if (ret>=0) { - *outbuf = 0; - decoded = g_strdup(outbase); - } - } else { - w(g_warning("Cannot decode charset, header display may be corrupt: %s: %s", encname, strerror(errno))); - /* TODO: Should this do this, or just leave the encoded strings? */ - decword[inlen] = 0; - decoded = g_strdup(decword); - } - } - } - - d(printf("decoded '%s'\n", decoded)); - - return decoded; -} - -/* grrr, glib should have this ! */ -static GString * -g_string_append_len(GString *st, const char *s, int l) -{ - char *tmp; - - tmp = alloca(l+1); - tmp[l]=0; - memcpy(tmp, s, l); - return g_string_append(st, tmp); -} - -/* ok, a lot of mailers are BROKEN, and send iso-latin1 encoded - headers, when they should just be sticking to US-ASCII - according to the rfc's. Anyway, since the conversion to utf-8 - is trivial, just do it here without iconv */ -static GString * -append_latin1(GString *out, const char *in, int len) -{ - unsigned int c; - - while (len) { - c = (unsigned int)*in++; - len--; - if (c & 0x80) { - out = g_string_append_c(out, 0xc0 | ((c>>6) & 0x3)); /* 110000xx */ - out = g_string_append_c(out, 0x80 | (c&0x3f)); /* 10xxxxxx */ - } else { - out = g_string_append_c(out, c); - } - } - return out; -} - -/* decodes a simple text, rfc822 */ -static char * -header_decode_text (const char *in, int inlen) -{ - GString *out; - char *inptr, *inend, *start; - char *decoded; - - out = g_string_new (""); - start = inptr = (char *) in; - inend = inptr + inlen; - - while (inptr && inptr < inend) { - char c = *inptr++; - - if (isspace (c)) { - char *word, *dword; - guint len; - - len = inptr - start - 1; - word = start; - - dword = rfc2047_decode_word (word, len); - - if (dword) { - g_string_append (out, dword); - g_free (dword); - } else { - out = append_latin1 (out, word, len); - } - - g_string_append_c (out, c); - - start = inptr; - } - } - - if (inptr - start) { - char *word, *dword; - guint len; - - len = inptr - start; - word = start; - - dword = rfc2047_decode_word (word, len); - - if (dword) { - g_string_append (out, dword); - g_free (dword); - } else { - out = g_string_append_len (out, word, len); - } - } - - decoded = out->str; - g_string_free (out, FALSE); - - return decoded; -} - -#if 0 /* This is broken */ - -/* so in what way is it broken? */ - -/* decodes a simple text, rfc822 */ -static char * -header_decode_text(const char *in, int inlen) -{ - GString *out; - const char *inptr = in; - const char *inend = in+inlen; - char *encstart, *encend; - char *decword; - - out = g_string_new(""); - while ( (encstart = strstr(inptr, "=?")) - && (encend = strstr(encstart+2, "?=")) ) { - - decword = rfc2047_decode_word(encstart, encend-encstart+2); - if (decword) { - out = g_string_append_len(out, inptr, encstart-inptr); - out = g_string_append_len(out, decword, strlen(decword)); - g_free (decword); - } else { - out = append_latin1(out, inptr, encend-inptr+2); - } - inptr = encend+2; - } - out = append_latin1(out, inptr, inend-inptr); - - encstart = out->str; - g_string_free(out, FALSE); - - return encstart; -} -#endif - -char * -header_decode_string(const char *in) -{ - if (in == NULL) - return NULL; - return header_decode_text(in, strlen(in)); -} - -static char *encoding_map[] = { - "US-ASCII", - "ISO-8859-1", - "UTF-8" -}; - -/* FIXME: needs a way to cache iconv opens for different charsets? */ -static void -rfc2047_encode_word(GString *outstring, const char *in, int len, const char *type, unsigned short safemask) -{ - unicode_iconv_t ic; - char *buffer, *out, *ascii; - size_t inlen, outlen, enclen; - - d(printf("Converting '%.*s' to %s\n", len, in, type)); - - /* convert utf8->encoding */ - outlen = len*6; - buffer = alloca(outlen); - inlen = len; - out = buffer; - - /* if we can't convert from utf-8, just encode as utf-8 */ - if (!strcasecmp(type, "UTF-8") - || (ic = unicode_iconv_open(type, "UTF-8")) == (unicode_iconv_t)-1) { - memcpy(buffer, in, len); - out = buffer+len; - type = "UTF-8"; - } else { - if (unicode_iconv(ic, &in, &inlen, &out, &outlen) == -1) { - w(g_warning("Conversion problem: conversion truncated: %s", strerror(errno))); - } - unicode_iconv_close(ic); - } - enclen = out-buffer; - - /* now create qp version */ - ascii = alloca(enclen*3 + strlen(type) + 8); - out = ascii; - /* should determine which encoding is smaller, and use that? */ - out += sprintf(out, "=?%s?Q?", type); - out += quoted_encode(buffer, enclen, out, safemask); - sprintf(out, "?="); - - d(printf("converted = %s\n", ascii)); - g_string_append(outstring, ascii); -} - - -/* TODO: Should this worry about quotes?? */ -char * -header_encode_string(const unsigned char *in) -{ - GString *out; - const unsigned char *inptr = in, *start; - int encoding; - char *outstr; - - if (in == NULL) - return NULL; - - /* do a quick us-ascii check (the common case?) */ - while (*inptr) { - if (*inptr > 127) - break; - inptr++; - } - if (*inptr == 0) - return g_strdup(in); - - /* This gets each word out of the input, and checks to see what charset - can be used to encode it. */ - /* TODO: Work out when to merge subsequent words, or across word-parts */ - /* FIXME: Make sure a converted word is less than the encoding size */ - out = g_string_new(""); - inptr = in; - encoding = 0; - start = inptr; - while (inptr && *inptr) { - unicode_char_t c; - const char *newinptr; - newinptr = unicode_get_utf8(inptr, &c); - if (newinptr == NULL) { - w(g_warning("Invalid UTF-8 sequence encountered (pos %d, char '%c'): %s", (inptr-in), inptr[0], in)); - inptr++; - continue; - } - inptr = newinptr; - if (unicode_isspace(c)) { - /* we've reached the end of a 'word' */ - switch (encoding) { - case 0: - out = g_string_append_len(out, start, inptr-start); - break; - case 1: - rfc2047_encode_word(out, start, inptr-start-1, "ISO-8859-1", IS_ESAFE); - out = g_string_append_c (out, c); - break; - case 2: - rfc2047_encode_word(out, start, inptr-start-1, - camel_charset_best(start, inptr-start-1), IS_ESAFE); - out = g_string_append_c(out, c); - break; - } - start = inptr; - encoding = 0; - } else if (c > 127 && c < 256) { - encoding = MAX(encoding, 1); - } else if (c >= 256) { - encoding = MAX(encoding, 2); - } - } - if (inptr-start) { - switch (encoding) { - case 0: - out = g_string_append_len(out, start, inptr-start); - break; - case 1: - rfc2047_encode_word(out, start, inptr-start, "ISO-8859-1", IS_ESAFE); - break; - case 2: - rfc2047_encode_word(out, start, inptr-start, - camel_charset_best(start, inptr-start-1), IS_ESAFE); - break; - } - } - outstr = out->str; - g_string_free(out, FALSE); - return outstr; -} - -/* apply quoted-string rules to a string */ -static void -quote_word(GString *out, gboolean do_quotes, const char *start, int len) -{ - int i, c; - - /* TODO: What about folding on long lines? */ - if (do_quotes) - g_string_append_c(out, '"'); - for (i=0;i<len;i++) { - c = *start++; - if (c == '\"' || c=='\\' || c=='\r') - g_string_append_c(out, '\\'); - g_string_append_c(out, c); - } - if (do_quotes) - g_string_append_c(out, '"'); -} - -/* incrementing possibility for the word type */ -enum _phrase_word_t { - WORD_ATOM, - WORD_QSTRING, - WORD_2047 -}; - -struct _phrase_word { - const unsigned char *start, *end; - enum _phrase_word_t type; - int encoding; -}; - -/* split the input into words - with info about each word - merge common word types - clean up -*/ -/* encodes a phrase sequence (different quoting/encoding rules to strings) */ -char * -header_encode_phrase(const unsigned char *in) -{ - GString *out; - const unsigned char *inptr = in, *start, *last; - int encoding; - char *outstr; - struct _phrase_word *word, *next; - enum _phrase_word_t type; - GList *words = NULL, *wordl, *nextl; - int count; - - if (in == NULL) - return NULL; - - out = g_string_new(""); - - /* break the input into words */ - type = WORD_ATOM; - count = 0; - last = inptr; - start = inptr; - encoding = 0; - while (inptr && *inptr) { - unicode_char_t c; - const char *newinptr; - newinptr = unicode_get_utf8(inptr, &c); - if (newinptr == NULL) { - w(g_warning("Invalid UTF-8 sequence encountered (pos %d, char '%c'): %s", (inptr-in), inptr[0], in)); - inptr++; - continue; - } - inptr = newinptr; - /* save this word out, multiple whitespace is not explicitly counted (?) */ - if (unicode_isspace(c)) { - if (count > 0) { - word = g_malloc0(sizeof(*word)); - word->start = start; - word->end = last; - word->type = type; - word->encoding = encoding; - words = g_list_append(words, word); - count = 0; - } - start = inptr; - type = WORD_ATOM; - encoding = 0; - } else { - count++; - if (c<128) { - if (!is_atom(c)) - type = MAX(type, WORD_QSTRING); - } else if (c>127 && c < 256) { - type = WORD_2047; - encoding = MAX(encoding, 1); - } else if (c >=256) { - type = WORD_2047; - encoding = MAX(encoding, 2); - } - } - last = inptr; - } - if (count > 0) { - word = g_malloc0(sizeof(*word)); - word->start = start; - word->end = last; - word->type = type; - word->encoding = encoding; - words = g_list_append(words, word); - } - - /* now scan the list, checking for words of similar types that can be merged */ - wordl = words; - while (wordl) { - word = wordl->data; - /* leave atoms as atoms (unless they're surrounded by quoted words??) */ - if (word->type != WORD_ATOM) { - nextl = g_list_next(wordl); - while (nextl) { - next = nextl->data; - /* merge nodes of the same (or lower?) type*/ - if (word->type == next->type || (next->type < word->type && word->type < WORD_2047) ) { - word->end = next->end; - words = g_list_remove_link(words, nextl); - g_free(next); - nextl = g_list_next(wordl); - } else { - break; - } - } - } - wordl = g_list_next(wordl); - } - - /* output words now with spaces between them */ - wordl = words; - while (wordl) { - word = wordl->data; - switch (word->type) { - case WORD_ATOM: - out = g_string_append_len(out, word->start, word->end-word->start); - break; - case WORD_QSTRING: - quote_word(out, TRUE, word->start, word->end-word->start); - break; - case WORD_2047: - if (word->encoding == 1) - rfc2047_encode_word(out, word->start, word->end-word->start, "ISO-8859-1", IS_PSAFE); - else - rfc2047_encode_word(out, word->start, word->end-word->start, - camel_charset_best(word->start, word->end-word->start), IS_PSAFE); - break; - } - - /* copy across the right number of spaces between words */ - nextl = g_list_next(wordl); - if (nextl) { - int i; - next = nextl->data; - for (i=next->start-word->end;i>0;i--) - out = g_string_append_c(out, ' '); - } - - g_free(word); - wordl = g_list_next(wordl); - } - /* and we no longer need the list */ - g_list_free(words); - - outstr = out->str; - g_string_free(out, FALSE); - return outstr; -} - - -/* these are all internal parser functions */ - -static char * -decode_token(const char **in) -{ - const char *inptr = *in; - const char *start; - - header_decode_lwsp(&inptr); - start = inptr; - while (is_ttoken(*inptr)) - inptr++; - if (inptr>start) { - *in = inptr; - return g_strndup(start, inptr-start); - } else { - return NULL; - } -} - -char * -header_token_decode(const char *in) -{ - if (in == NULL) - return NULL; - - return decode_token(&in); -} - -/* - <"> * ( <any char except <"> \, cr / \ <any char> ) <"> -*/ -static char * -header_decode_quoted_string(const char **in) -{ - const char *inptr = *in; - char *out = NULL, *outptr; - int outlen; - int c; - - header_decode_lwsp(&inptr); - if (*inptr == '"') { - const char *intmp; - int skip = 0; - - /* first, calc length */ - inptr++; - intmp = inptr; - while ( (c = *intmp++) && c!= '"' && c != '\0') { - if (c=='\\' && *intmp) { - intmp++; - skip++; - } - } - outlen = intmp-inptr-skip; - out = outptr = g_malloc(outlen+1); - while ( (c = *inptr++) && c!= '"' && c != '\0') { - if (c=='\\' && *inptr) { - c = *inptr++; - } - *outptr++ = c; - } - *outptr = 0; - } - *in = inptr; - return out; -} - -static char * -header_decode_atom(const char **in) -{ - const char *inptr = *in, *start; - - header_decode_lwsp(&inptr); - start = inptr; - while (is_atom(*inptr)) - inptr++; - *in = inptr; - if (inptr > start) - return g_strndup(start, inptr-start); - else - return NULL; -} - -static char * -header_decode_word(const char **in) -{ - const char *inptr = *in; - - header_decode_lwsp(&inptr); - if (*inptr == '"') { - *in = inptr; - return header_decode_quoted_string(in); - } else { - *in = inptr; - return header_decode_atom(in); - } -} - -static char * -header_decode_value(const char **in) -{ - const char *inptr = *in; - - header_decode_lwsp(&inptr); - if (*inptr == '"') { - d(printf("decoding quoted string\n")); - return header_decode_quoted_string(in); - } else if (is_ttoken(*inptr)) { - d(printf("decoding token\n")); - /* this may not have the right specials for all params? */ - return decode_token(in); - } - return NULL; -} - -/* shoudl this return -1 for no int? */ -static int -header_decode_int(const char **in) -{ - const char *inptr = *in; - int c, v=0; - - header_decode_lwsp(&inptr); - while ( (c=*inptr++ & 0xff) - && isdigit(c) ) { - v = v*10+(c-'0'); - } - *in = inptr-1; - return v; -} - -static int -header_decode_param(const char **in, char **paramp, char **valuep) -{ - const char *inptr = *in; - char *param, *value=NULL; - - param = decode_token(&inptr); - header_decode_lwsp(&inptr); - if (*inptr == '=') { - inptr++; - value = header_decode_value(&inptr); - } - - if (param && value) { - *paramp = param; - *valuep = value; - *in = inptr; - return 0; - } else { - g_free(param); - g_free(value); - return 1; - } -} - -char * -header_param(struct _header_param *p, const char *name) -{ - while (p && strcasecmp(p->name, name) != 0) - p = p->next; - if (p) - return p->value; - return NULL; -} - -struct _header_param * -header_set_param(struct _header_param **l, const char *name, const char *value) -{ - struct _header_param *p = (struct _header_param *)l, *pn; - - while (p->next) { - pn = p->next; - if (!strcasecmp(pn->name, name)) { - g_free(pn->value); - if (value) { - pn->value = g_strdup(value); - return pn; - } else { - p->next = pn->next; - g_free(pn); - return NULL; - } - } - p = pn; - } - - if (value == NULL) - return NULL; - - pn = g_malloc(sizeof(*pn)); - pn->next = 0; - pn->name = g_strdup(name); - pn->value = g_strdup(value); - p->next = pn; - - return pn; -} - -const char * -header_content_type_param(struct _header_content_type *t, const char *name) -{ - if (t==NULL) - return NULL; - return header_param(t->params, name); -} - -void header_content_type_set_param(struct _header_content_type *t, const char *name, const char *value) -{ - header_set_param(&t->params, name, value); -} - -/** - * header_content_type_is: - * @ct: A content type specifier, or #NULL. - * @type: A type to check against. - * @subtype: A subtype to check against, or "*" to match any subtype. - * - * Returns #TRUE if the content type @ct is of type @type/@subtype. - * The subtype of "*" will match any subtype. If @ct is #NULL, then - * it will match the type "text/plain". - * - * Return value: #TRUE or #FALSE depending on the matching of the type. - **/ -int -header_content_type_is(struct _header_content_type *ct, const char *type, const char *subtype) -{ - /* no type == text/plain or text/"*" */ - if (ct==NULL || (ct->type == NULL && ct->subtype == NULL)) { - return (!strcasecmp(type, "text") - && (!strcasecmp(subtype, "plain") - || !strcasecmp(subtype, "*"))); - } - - return (ct->type != NULL - && (!strcasecmp(ct->type, type) - && ((ct->subtype != NULL - && !strcasecmp(ct->subtype, subtype)) - || !strcasecmp("*", subtype)))); -} - -void -header_param_list_free(struct _header_param *p) -{ - struct _header_param *n; - - while (p) { - n = p->next; - g_free(p->name); - g_free(p->value); - g_free(p); - p = n; - } -} - -struct _header_content_type * -header_content_type_new(const char *type, const char *subtype) -{ - struct _header_content_type *t = g_malloc(sizeof(*t)); - - t->type = g_strdup(type); - t->subtype = g_strdup(subtype); - t->params = NULL; - t->refcount = 1; - return t; -} - -void -header_content_type_ref(struct _header_content_type *ct) -{ - if (ct) - ct->refcount++; -} - - -void -header_content_type_unref(struct _header_content_type *ct) -{ - if (ct) { - if (ct->refcount <= 1) { - header_param_list_free(ct->params); - g_free(ct->type); - g_free(ct->subtype); - g_free(ct); - } else { - ct->refcount--; - } - } -} - -/* for decoding email addresses, canonically */ -static char * -header_decode_domain(const char **in) -{ - const char *inptr = *in, *start; - int go = TRUE; - char *ret; - GString *domain = g_string_new(""); - - /* domain ref | domain literal */ - header_decode_lwsp(&inptr); - while (go) { - if (*inptr == '[') { /* domain literal */ - domain = g_string_append(domain, "[ "); - inptr++; - header_decode_lwsp(&inptr); - start = inptr; - while (is_dtext(*inptr)) { - domain = g_string_append_c(domain, *inptr); - inptr++; - } - if (*inptr == ']') { - domain = g_string_append(domain, " ]"); - inptr++; - } else { - w(g_warning("closing ']' not found in domain: %s", *in)); - } - } else { - char *a = header_decode_atom(&inptr); - if (a) { - domain = g_string_append(domain, a); - g_free(a); - } else { - w(g_warning("missing atom from domain-ref")); - break; - } - } - header_decode_lwsp(&inptr); - if (*inptr == '.') { /* next sub-domain? */ - domain = g_string_append_c(domain, '.'); - inptr++; - header_decode_lwsp(&inptr); - } else - go = FALSE; - } - - *in = inptr; - - ret = domain->str; - g_string_free(domain, FALSE); - return ret; -} - -static char * -header_decode_addrspec(const char **in) -{ - const char *inptr = *in; - char *word; - GString *addr = g_string_new(""); - - header_decode_lwsp(&inptr); - - /* addr-spec */ - word = header_decode_word(&inptr); - if (word) { - addr = g_string_append(addr, word); - header_decode_lwsp(&inptr); - g_free(word); - while (*inptr == '.' && word) { - inptr++; - addr = g_string_append_c(addr, '.'); - word = header_decode_word(&inptr); - if (word) { - addr = g_string_append(addr, word); - header_decode_lwsp(&inptr); - g_free(word); - } else { - w(g_warning("Invalid address spec: %s", *in)); - } - } - if (*inptr == '@') { - inptr++; - addr = g_string_append_c(addr, '@'); - word = header_decode_domain(&inptr); - if (word) { - addr = g_string_append(addr, word); - g_free(word); - } else { - w(g_warning("Invalid address, missing domain: %s", *in)); - } - } else { - w(g_warning("Invalid addr-spec, missing @: %s", *in)); - } - } else { - w(g_warning("invalid addr-spec, no local part")); - } - - /* FIXME: return null on error? */ - - *in = inptr; - word = addr->str; - g_string_free(addr, FALSE); - return word; -} - -/* - address: - word *('.' word) @ domain | - *(word) '<' [ *('@' domain ) ':' ] word *( '.' word) @ domain | - - 1*word ':' [ word ... etc (mailbox, as above) ] ';' - */ - -/* mailbox: - word *( '.' word ) '@' domain - *(word) '<' [ *('@' domain ) ':' ] word *( '.' word) @ domain - */ - -static struct _header_address * -header_decode_mailbox(const char **in) -{ - const char *inptr = *in; - char *pre; - int closeme = FALSE; - GString *addr; - GString *name = NULL; - struct _header_address *address = NULL; - - addr = g_string_new(""); - - /* for each address */ - pre = header_decode_word(&inptr); - header_decode_lwsp(&inptr); - if (!(*inptr == '.' || *inptr == '@' || *inptr==',' || *inptr=='\0')) { - /* ',' and '\0' required incase it is a simple address, no @ domain part (buggy writer) */ - name = g_string_new(""); - while (pre) { - char *text; - - /* perform internationalised decoding, and appent */ - text = header_decode_string(pre); - name = g_string_append(name, text); - g_free(pre); - g_free(text); - - pre = header_decode_word(&inptr); - if (pre) - name = g_string_append_c(name, ' '); - } - header_decode_lwsp(&inptr); - if (*inptr == '<') { - closeme = TRUE; - inptr++; - header_decode_lwsp(&inptr); - if (*inptr == '@') { - while (*inptr == '@') { - inptr++; - header_decode_domain(&inptr); - header_decode_lwsp(&inptr); - if (*inptr == ',') { - inptr++; - header_decode_lwsp(&inptr); - } - } - if (*inptr == ':') { - inptr++; - } else { - w(g_warning("broken route-address, missing ':': %s", *in)); - } - } - pre = header_decode_word(&inptr); - header_decode_lwsp(&inptr); - } else { - w(g_warning("broken address? %s", *in)); - } - } - - if (pre) { - addr = g_string_append(addr, pre); - } else { - w(g_warning("No local-part for email address: %s", *in)); - } - - /* should be at word '.' localpart */ - while (*inptr == '.' && pre) { - inptr++; - g_free(pre); - pre = header_decode_word(&inptr); - if (pre) { - addr = g_string_append_c(addr, '.'); - addr = g_string_append(addr, pre); - } - header_decode_lwsp(&inptr); - } - g_free(pre); - - /* now at '@' domain part */ - if (*inptr == '@') { - char *dom; - - inptr++; - addr = g_string_append_c(addr, '@'); - dom = header_decode_domain(&inptr); - addr = g_string_append(addr, dom); - g_free(dom); - } else { - w(g_warning("invalid address, no '@' domain part at %c: %s", *inptr, *in)); - } - - if (closeme) { - header_decode_lwsp(&inptr); - if (*inptr == '>') { - inptr++; - } else { - w(g_warning("invalid route address, no closing '>': %s", *in)); - } - } else if (name == NULL) { /* check for comment after address */ - char *text, *tmp; - const char *comment = inptr; - - header_decode_lwsp(&inptr); - if (inptr-comment > 3) { /* just guess ... */ - tmp = g_strndup(comment, inptr-comment); - text = header_decode_string(tmp); - name = g_string_new(text); - g_free(tmp); - g_free(text); - } - } - - *in = inptr; - - if (addr->len > 0) { - address = header_address_new_name(name?name->str:"", addr->str); - } - - g_string_free(addr, TRUE); - if (name) - g_string_free(name, TRUE); - - d(printf("got mailbox: %s\n", addr->str)); - return address; -} - -static struct _header_address * -header_decode_address(const char **in) -{ - const char *inptr = *in; - char *pre; - GString *group = g_string_new(""); - struct _header_address *addr = NULL, *member; - - /* pre-scan, trying to work out format, discard results */ - header_decode_lwsp(&inptr); - while ( (pre = header_decode_word(&inptr)) ) { - group = g_string_append(group, pre); - group = g_string_append(group, " "); - g_free(pre); - } - header_decode_lwsp(&inptr); - if (*inptr == ':') { - d(printf("group detected: %s\n", group->str)); - addr = header_address_new_group(group->str); - /* that was a group spec, scan mailbox's */ - inptr++; - /* FIXME: check rfc 2047 encodings of words, here or above in the loop */ - header_decode_lwsp(&inptr); - if (*inptr != ';') { - int go = TRUE; - do { - member = header_decode_mailbox(&inptr); - if (member) - header_address_add_member(addr, member); - header_decode_lwsp(&inptr); - if (*inptr == ',') - inptr++; - else - go = FALSE; - } while (go); - if (*inptr == ';') { - inptr++; - } else { - w(g_warning("Invalid group spec, missing closing ';': %s", *in)); - } - } else { - inptr++; - } - *in = inptr; - } else { - addr = header_decode_mailbox(in); - } - - g_string_free(group, TRUE); - - return addr; -} - -static char * -header_msgid_decode_internal(const char **in) -{ - const char *inptr = *in; - char *msgid = NULL; - - d(printf("decoding Message-ID: '%s'\n", *in)); - - header_decode_lwsp(&inptr); - if (*inptr == '<') { - inptr++; - header_decode_lwsp(&inptr); - msgid = header_decode_addrspec(&inptr); - if (msgid) { - header_decode_lwsp(&inptr); - if (*inptr == '>') { - inptr++; - } else { - w(g_warning("Missing closing '>' on message id: %s", *in)); - } - } else { - w(g_warning("Cannot find message id in: %s", *in)); - } - } else { - w(g_warning("missing opening '<' on message id: %s", *in)); - } - *in = inptr; - - return msgid; -} - -char * -header_msgid_decode(const char *in) -{ - if (in == NULL) - return NULL; - - return header_msgid_decode_internal(&in); -} - -void -header_references_list_append_asis(struct _header_references **list, char *ref) -{ - struct _header_references *w = (struct _header_references *)list, *n; - while (w->next) - w = w->next; - n = g_malloc(sizeof(*n)); - n->id = ref; - n->next = 0; - w->next = n; -} - -int -header_references_list_size(struct _header_references **list) -{ - int count = 0; - struct _header_references *w = *list; - while (w) { - count++; - w = w->next; - } - return count; -} - -void -header_references_list_clear(struct _header_references **list) -{ - struct _header_references *w = *list, *n; - while (w) { - n = w->next; - g_free(w->id); - g_free(w); - w = n; - } - *list = NULL; -} - -/* generate a list of references, from most recent up */ -struct _header_references * -header_references_decode(const char *in) -{ - const char *inptr = in; - struct _header_references *head = NULL, *node; - char *id, *word; - - if (in == NULL || in[0] == '\0') - return NULL; - - while (*inptr) { - header_decode_lwsp(&inptr); - if (*inptr == '<') { - id = header_msgid_decode_internal(&inptr); - if (id) { - node = g_malloc(sizeof(*node)); - node->next = head; - head = node; - node->id = id; - } - } else { - word = header_decode_word(&inptr); - if (word) - g_free (word); - else if (*inptr != '\0') - inptr++; /* Stupid mailer tricks */ - } - } - - return head; -} - -struct _header_references * -header_references_dup(const struct _header_references *list) -{ - struct _header_references *new = NULL, *tmp; - - while (list) { - tmp = g_new(struct _header_references, 1); - tmp->next = new; - tmp->id = g_strdup(list->id); - new = tmp; - list = list->next; - } - return new; -} - -struct _header_address * -header_mailbox_decode(const char *in) -{ - if (in == NULL) - return NULL; - - return header_decode_mailbox(&in); -} - -struct _header_address * -header_address_decode(const char *in) -{ - const char *inptr = in, *last; - struct _header_address *list = NULL, *addr; - - d(printf("decoding To: '%s'\n", in)); - - if (in == NULL) - return NULL; - - do { - last = inptr; - addr = header_decode_address(&inptr); - if (addr) - header_address_list_append(&list, addr); - header_decode_lwsp(&inptr); - if (*inptr == ',') - inptr++; - else - break; - } while (inptr != last); - - if (*inptr) { - w(g_warning("Invalid input detected at %c (%d): %s\n or at: %s", *inptr, inptr-in, in, inptr)); - } - - if (inptr == last) { - w(g_warning("detected invalid input loop at : %s", last)); - } - - return list; -} - -void -header_mime_decode(const char *in, int *maj, int *min) -{ - const char *inptr = in; - int major=-1, minor=-1; - - d(printf("decoding MIME-Version: '%s'\n", in)); - - if (in != NULL) { - header_decode_lwsp(&inptr); - if (isdigit(*inptr)) { - major = header_decode_int(&inptr); - header_decode_lwsp(&inptr); - if (*inptr == '.') { - inptr++; - header_decode_lwsp(&inptr); - if (isdigit(*inptr)) - minor = header_decode_int(&inptr); - } - } - } - - if (maj) - *maj = major; - if (min) - *min = minor; - - d(printf("major = %d, minor = %d\n", major, minor)); -} - -static struct _header_param * -header_param_list_decode(const char **in) -{ - const char *inptr = *in; - struct _header_param *head = NULL, *tail = NULL; - - header_decode_lwsp(&inptr); - while (*inptr == ';') { - char *param, *value; - struct _header_param *p; - - inptr++; - /* invalid format? */ - if (header_decode_param(&inptr, ¶m, &value) != 0) - break; - - p = g_malloc(sizeof(*p)); - p->name = param; - p->value = value; - p->next = NULL; - if (head == NULL) - head = p; - if (tail) - tail->next = p; - tail = p; - header_decode_lwsp(&inptr); - } - *in = inptr; - return head; -} - -static void -header_param_list_format_append(GString *out, struct _header_param *p) -{ - int len = out->len; - char *ch; - - while (p) { - int here = out->len; - if (len+strlen(p->name)+strlen(p->value)>60) { - out = g_string_append(out, "\n\t"); - len = 0; - } - - g_string_sprintfa(out, " ; %s=", p->name); - - for (ch = p->value; *ch; ch++) { - if (is_tspecial(*ch)) - break; - } - if (!*ch) - g_string_append(out, p->value); - else - quote_word(out, TRUE, p->value, strlen(p->value)); - - len += (out->len - here); - p = p->next; - } -} - -struct _header_content_type * -header_content_type_decode(const char *in) -{ - const char *inptr = in; - char *type, *subtype = NULL; - struct _header_content_type *t = NULL; - - if (in==NULL) - return NULL; - - type = decode_token(&inptr); - header_decode_lwsp(&inptr); - if (type) { - if (*inptr == '/') { - inptr++; - subtype = decode_token(&inptr); - } - if (subtype == NULL && (!strcasecmp(type, "text"))) { - w(g_warning("text type with no subtype, resorting to text/plain: %s", in)); - subtype = g_strdup("plain"); - } - if (subtype == NULL) { - w(g_warning("MIME type with no subtype: %s", in)); - } - - t = header_content_type_new(type, subtype); - t->params = header_param_list_decode(&inptr); - g_free(type); - g_free(subtype); - } else { - g_free(type); - d(printf("cannot find MIME type in header (2) '%s'", in)); - } - return t; -} - -void -header_content_type_dump(struct _header_content_type *ct) -{ - struct _header_param *p; - - printf("Content-Type: "); - if (ct==NULL) { - printf("<NULL>\n"); - return; - } - printf("%s / %s", ct->type, ct->subtype); - p = ct->params; - if (p) { - while (p) { - printf(";\n\t%s=\"%s\"", p->name, p->value); - p = p->next; - } - } - printf("\n"); -} - -char * -header_content_type_format(struct _header_content_type *ct) -{ - GString *out; - char *ret; - - if (ct==NULL) - return NULL; - - out = g_string_new(""); - if (ct->type == NULL) { - g_string_sprintfa(out, "text/plain"); - w(g_warning("Content-Type with no main type")); - } else if (ct->subtype == NULL) { - w(g_warning("Content-Type with no sub type: %s", ct->type)); - if (!strcasecmp(ct->type, "multipart")) - g_string_sprintfa(out, "%s/mixed", ct->type); - else - g_string_sprintfa(out, "%s", ct->type); - } else { - g_string_sprintfa(out, "%s/%s", ct->type, ct->subtype); - } - header_param_list_format_append(out, ct->params); - - ret = out->str; - g_string_free(out, FALSE); - return ret; -} - -char * -header_content_encoding_decode(const char *in) -{ - if (in) - return decode_token(&in); - return NULL; -} - -CamelMimeDisposition *header_disposition_decode(const char *in) -{ - CamelMimeDisposition *d = NULL; - const char *inptr = in; - - if (in == NULL) - return NULL; - - d = g_malloc(sizeof(*d)); - d->refcount = 1; - d->disposition = decode_token(&inptr); - if (d->disposition == NULL) - w(g_warning("Empty disposition type")); - d->params = header_param_list_decode(&inptr); - return d; -} - -void header_disposition_ref(CamelMimeDisposition *d) -{ - if (d) - d->refcount++; -} -void header_disposition_unref(CamelMimeDisposition *d) -{ - if (d) { - if (d->refcount<=1) { - header_param_list_free(d->params); - g_free(d->disposition); - g_free(d); - } else { - d->refcount--; - } - } -} - -char *header_disposition_format(CamelMimeDisposition *d) -{ - GString *out; - char *ret; - - if (d==NULL) - return NULL; - - out = g_string_new(""); - if (d->disposition) - out = g_string_append(out, d->disposition); - else - out = g_string_append(out, "attachment"); - header_param_list_format_append(out, d->params); - - ret = out->str; - g_string_free(out, FALSE); - return ret; -} - -/* hrm, is there a library for this shit? */ -static struct { - char *name; - int offset; -} tz_offsets [] = { - { "UT", 0 }, - { "GMT", 0 }, - { "EST", -500 }, /* these are all US timezones. bloody yanks */ - { "EDT", -400 }, - { "CST", -600 }, - { "CDT", -500 }, - { "MST", -700 }, - { "MDT", -600 }, - { "PST", -800 }, - { "PDT", -700 }, - { "Z", 0 }, - { "A", -100 }, - { "M", -1200 }, - { "N", 100 }, - { "Y", 1200 }, -}; - -static char *tz_months [] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" -}; - -char * -header_format_date(time_t time, int offset) -{ - struct tm tm; - - d(printf("offset = %d\n", offset)); - - d(printf("converting date %s", ctime(&time))); - - time += ((offset / 100) * (60*60)) + (offset % 100)*60; - - d(printf("converting date %s", ctime(&time))); - - memcpy(&tm, gmtime(&time), sizeof(tm)); - - return g_strdup_printf("%02d %s %04d %02d:%02d:%02d %+05d", - tm.tm_mday, tz_months[tm.tm_mon], - tm.tm_year + 1900, - tm.tm_hour, tm.tm_min, tm.tm_sec, - offset); -} - -/* convert a date to time_t representation */ -/* this is an awful mess oh well */ -time_t -header_decode_date(const char *in, int *saveoffset) -{ - const char *inptr = in; - char *monthname; - int year, offset = 0; - struct tm tm; - int i; - time_t t; - - if (in == NULL) { - if (saveoffset) - *saveoffset = 0; - return 0; - } - - d(printf ("\ndecoding date '%s'\n", inptr)); - - memset (&tm, 0, sizeof(tm)); - - header_decode_lwsp (&inptr); - if (!isdigit (*inptr)) { - char *day = decode_token (&inptr); - /* we dont really care about the day, it's only for display */ - if (day) { - d(printf ("got day: %s\n", day)); - g_free (day); - header_decode_lwsp (&inptr); - if (*inptr == ',') { - inptr++; - } else { -#ifndef CLEAN_DATE - char *newdate; - - w(g_warning("day not followed by ',' it's probably a broken mail client, so we'll ignore its date entirely")); - printf ("Giving it one last chance...\n"); - newdate = parse_broken_date (in); - if (newdate) { - printf ("Got: %s\n", newdate); - t = header_decode_date (newdate, saveoffset); - g_free (newdate); - return t; - } -#endif - if (saveoffset) - *saveoffset = 0; - return 0; - } - } - } - tm.tm_mday = header_decode_int(&inptr); - monthname = decode_token(&inptr); - if (monthname) { - for (i=0;i<sizeof(tz_months)/sizeof(tz_months[0]);i++) { - if (!strcasecmp(tz_months[i], monthname)) { - tm.tm_mon = i; - break; - } - } - g_free(monthname); - } - year = header_decode_int(&inptr); - if (year<100) { - tm.tm_year = year; - } else { - tm.tm_year = year-1900; - } - /* get the time ... yurck */ - tm.tm_hour = header_decode_int(&inptr); - header_decode_lwsp(&inptr); - if (*inptr == ':') - inptr++; - tm.tm_min = header_decode_int(&inptr); - header_decode_lwsp(&inptr); - if (*inptr == ':') - inptr++; - tm.tm_sec = header_decode_int(&inptr); - header_decode_lwsp(&inptr); - if (*inptr == '+' - || *inptr == '-') { - offset = (*inptr++)=='-'?-1:1; - offset = offset * header_decode_int(&inptr); - d(printf("abs signed offset = %d\n", offset)); - } else if (isdigit(*inptr)) { - offset = header_decode_int(&inptr); - d(printf("abs offset = %d\n", offset)); - } else { - char *tz = decode_token(&inptr); - - if (tz) { - for (i=0;i<sizeof(tz_offsets)/sizeof(tz_offsets[0]);i++) { - if (!strcasecmp(tz_offsets[i].name, tz)) { - offset = tz_offsets[i].offset; - break; - } - } - g_free(tz); - } - /* some broken mailers seem to put in things like GMT+1030 instead of just +1030 */ - header_decode_lwsp(&inptr); - if (*inptr == '+' || *inptr == '-') { - int sign = (*inptr++)=='-'?-1:1; - offset = offset + (header_decode_int(&inptr)*sign); - } - d(printf("named offset = %d\n", offset)); - } - - t = mktime(&tm); -#if defined(HAVE_TIMEZONE) - t -= timezone; -#elif defined(HAVE_TM_GMTOFF) - t += tm.tm_gmtoff; -#else -#error Neither HAVE_TIMEZONE nor HAVE_TM_GMTOFF defined. Rerun autoheader, autoconf, etc. -#endif - - /* t is now GMT of the time we want, but not offset by the timezone ... */ - - d(printf(" gmt normalized? = %s\n", ctime(&t))); - - /* this should convert the time to the GMT equiv time */ - t -= ( (offset/100) * 60*60) + (offset % 100)*60; - - d(printf(" gmt normalized for timezone? = %s\n", ctime(&t))); - - d({ - char *tmp; - tmp = header_format_date(t, offset); - printf(" encoded again: %s\n", tmp); - g_free(tmp); - }); - - if (saveoffset) - *saveoffset = offset; - - return t; -} - -/* extra rfc checks */ -#define CHECKS - -#ifdef CHECKS -static void -check_header(struct _header_raw *h) -{ - unsigned char *p; - - p = h->value; - while (p && *p) { - if (!isascii(*p)) { - w(g_warning("Appending header violates rfc: %s: %s", h->name, h->value)); - return; - } - p++; - } -} -#endif - -void -header_raw_append_parse(struct _header_raw **list, const char *header, int offset) -{ - register const char *in; - int fieldlen; - char *name; - - in = header; - while (is_fieldname(*in) || *in==':') - in++; - fieldlen = in-header-1; - while (is_lwsp(*in)) - in++; - if (fieldlen == 0 || header[fieldlen] != ':') { - printf("Invalid header line: '%s'\n", header); - return; - } - name = alloca(fieldlen+1); - memcpy(name, header, fieldlen); - name[fieldlen] = 0; - - header_raw_append(list, name, in, offset); -} - -void -header_raw_append(struct _header_raw **list, const char *name, const char *value, int offset) -{ - struct _header_raw *l, *n; - - d(printf("Header: %s: %s\n", name, value)); - - n = g_malloc(sizeof(*n)); - n->next = NULL; - n->name = g_strdup(name); - n->value = g_strdup(value); - n->offset = offset; -#ifdef CHECKS - check_header(n); -#endif - l = (struct _header_raw *)list; - while (l->next) { - l = l->next; - } - l->next = n; - - /* debug */ -#if 0 - if (!strcasecmp(name, "To")) { - printf("- Decoding To\n"); - header_to_decode(value); - } else if (!strcasecmp(name, "Content-type")) { - printf("- Decoding content-type\n"); - header_content_type_dump(header_content_type_decode(value)); - } else if (!strcasecmp(name, "MIME-Version")) { - printf("- Decoding mime version\n"); - header_mime_decode(value); - } -#endif -} - -static struct _header_raw * -header_raw_find_node(struct _header_raw **list, const char *name) -{ - struct _header_raw *l; - - l = *list; - while (l) { - if (!strcasecmp(l->name, name)) - break; - l = l->next; - } - return l; -} - -const char * -header_raw_find(struct _header_raw **list, const char *name, int *offset) -{ - struct _header_raw *l; - - l = header_raw_find_node(list, name); - if (l) { - if (offset) - *offset = l->offset; - return l->value; - } else - return NULL; -} - -const char * -header_raw_find_next(struct _header_raw **list, const char *name, int *offset, const char *last) -{ - struct _header_raw *l; - - if (last == NULL || name == NULL) - return NULL; - - l = *list; - while (l && l->value != last) - l = l->next; - return header_raw_find(&l, name, offset); -} - -static void -header_raw_free(struct _header_raw *l) -{ - g_free(l->name); - g_free(l->value); - g_free(l); -} - -void -header_raw_remove(struct _header_raw **list, const char *name) -{ - struct _header_raw *l, *p; - - /* the next pointer is at the head of the structure, so this is safe */ - p = (struct _header_raw *)list; - l = *list; - while (l) { - if (!strcasecmp(l->name, name)) { - p->next = l->next; - header_raw_free(l); - l = p->next; - } else { - p = l; - l = l->next; - } - } -} - -void -header_raw_replace(struct _header_raw **list, const char *name, const char *value, int offset) -{ - header_raw_remove(list, name); - header_raw_append(list, name, value, offset); -} - -void -header_raw_clear(struct _header_raw **list) -{ - struct _header_raw *l, *n; - l = *list; - while (l) { - n = l->next; - header_raw_free(l); - l = n; - } - *list = NULL; -} - - -/* ok, here's the address stuff, what a mess ... */ -struct _header_address *header_address_new(void) -{ - struct _header_address *h; - h = g_malloc0(sizeof(*h)); - h->type = HEADER_ADDRESS_NONE; - h->refcount = 1; - return h; -} - -struct _header_address *header_address_new_name(const char *name, const char *addr) -{ - struct _header_address *h; - - h = header_address_new(); - h->type = HEADER_ADDRESS_NAME; - h->name = g_strdup(name); - h->v.addr = g_strdup(addr); - return h; -} - -struct _header_address *header_address_new_group(const char *name) -{ - struct _header_address *h; - - h = header_address_new(); - h->type = HEADER_ADDRESS_GROUP; - h->name = g_strdup(name); - return h; -} - -void header_address_ref(struct _header_address *h) -{ - if (h) - h->refcount++; -} - -void header_address_unref(struct _header_address *h) -{ - if (h) { - if (h->refcount <= 1) { - if (h->type == HEADER_ADDRESS_GROUP) { - header_address_list_clear(&h->v.members); - } else if (h->type == HEADER_ADDRESS_NAME) { - g_free(h->v.addr); - } - g_free(h->name); - g_free(h); - } else { - h->refcount--; - } - } -} - -void header_address_set_name(struct _header_address *h, const char *name) -{ - if (h) { - g_free(h->name); - h->name = g_strdup(name); - } -} - -void header_address_set_addr(struct _header_address *h, const char *addr) -{ - if (h) { - if (h->type == HEADER_ADDRESS_NAME - || h->type == HEADER_ADDRESS_NONE) { - h->type = HEADER_ADDRESS_NAME; - g_free(h->v.addr); - h->v.addr = g_strdup(addr); - } else { - g_warning("Trying to set the address on a group"); - } - } -} - -void header_address_set_members(struct _header_address *h, struct _header_address *group) -{ - if (h) { - if (h->type == HEADER_ADDRESS_GROUP - || h->type == HEADER_ADDRESS_NONE) { - h->type = HEADER_ADDRESS_GROUP; - header_address_list_clear(&h->v.members); - /* should this ref them? */ - h->v.members = group; - } else { - g_warning("Trying to set the members on a name, not group"); - } - } -} - -void header_address_add_member(struct _header_address *h, struct _header_address *member) -{ - if (h) { - if (h->type == HEADER_ADDRESS_GROUP - || h->type == HEADER_ADDRESS_NONE) { - h->type = HEADER_ADDRESS_GROUP; - header_address_list_append(&h->v.members, member); - } - } -} - -void header_address_list_append_list(struct _header_address **l, struct _header_address **h) -{ - if (l) { - struct _header_address *n = (struct _header_address *)l; - - while (n->next) - n = n->next; - n->next = *h; - } -} - - -void header_address_list_append(struct _header_address **l, struct _header_address *h) -{ - if (h) { - header_address_list_append_list(l, &h); - h->next = NULL; - } -} - -void header_address_list_clear(struct _header_address **l) -{ - struct _header_address *a, *n; - a = *l; - while (a) { - n = a->next; - header_address_unref(a); - a = n; - } - *l = NULL; -} - -static void -header_address_list_format_append(GString *out, struct _header_address *a) -{ - char *text; - - while (a) { - switch (a->type) { - case HEADER_ADDRESS_NAME: - text = header_encode_phrase (a->name); - if (text && *text) - g_string_sprintfa(out, "%s <%s>", text, a->v.addr); - else - g_string_append(out, a->v.addr); - g_free (text); - break; - case HEADER_ADDRESS_GROUP: - text = header_encode_string(a->name); - g_string_sprintfa(out, "%s:\n ", text); - header_address_list_format_append(out, a->v.members); - g_string_sprintfa(out, ";"); - break; - default: - g_warning("Invalid address type"); - break; - } - a = a->next; - if (a) - g_string_append(out, ", "); - } -} - -/* FIXME: need a 'display friendly' version, as well as a 'rfc friendly' version? */ -char * -header_address_list_format(struct _header_address *a) -{ - GString *out; - char *ret; - - if (a == NULL) - return NULL; - - out = g_string_new(""); - - header_address_list_format_append(out, a); - ret = out->str; - g_string_free(out, FALSE); - return ret; -} - -/* simple header folding */ -/* note: assumes the input has not already been folded */ -char * -header_fold(const char *in) -{ - int len, outlen, i; - const char *inptr = in, *space; - GString *out; - char *ret; - - len = strlen(in); - if (len <= CAMEL_FOLD_SIZE) - return g_strdup(in); - - out = g_string_new(""); - outlen = 0; - while (*inptr) { - space = strchr(inptr, ' '); - if (space) { - len = space-inptr+1; - } else { - len = strlen(inptr); - } - if (outlen + len > CAMEL_FOLD_SIZE) { - g_string_append(out, "\n\t"); - outlen = 1; - /* check for very long words, just cut them up */ - while (outlen+len > CAMEL_FOLD_SIZE) { - for (i=0;i<CAMEL_FOLD_SIZE-outlen;i++) - g_string_append_c(out, inptr[i]); - inptr += CAMEL_FOLD_SIZE-outlen; - len -= CAMEL_FOLD_SIZE-outlen; - g_string_append(out, "\n\t"); - outlen = 1; - } - } - outlen += len; - for (i=0;i<len;i++) { - g_string_append_c(out, inptr[i]); - } - inptr += len; - } - ret = out->str; - g_string_free(out, FALSE); - return ret; -} - -#ifdef BUILD_TABLE - -/* for debugging tests */ -/* should also have some regression tests somewhere */ - -void test_phrase(const char *in) -{ - printf("'%s' -> '%s'\n", in, header_encode_phrase(in)); -} - -void test_fold(const char *in) -{ - printf("'%s'\n ->\n '%s'\n", in, header_fold(in)); -} - -void run_test(void) -{ - char *to = "gnome hacker dudes: license-discuss@opensource.org, - \"Richard M. Stallman\" <rms@gnu.org>, - Barry Chester <barry_che@antdiv.gov.au>, - Michael Zucchi <zucchi.michael(this (is a nested) comment)@zedzone.mmc.com.au>, - Miguel de Icaza <miguel@gnome.org>;, - zucchi@zedzone.mmc.com.au, \"Foo bar\" <zed@zedzone>, - <frob@frobzone>"; - -#if 0 - header_to_decode(to); - - header_mime_decode("1.0", 0, 0); - header_mime_decode("1.3 (produced by metasend V1.0)", 0, 0); - header_mime_decode("(produced by metasend V1.0) 5.2", 0, 0); - header_mime_decode("7(produced by metasend 1.0) . (produced by helix/send/1.0) 9 . 5", 0, 0); - header_mime_decode("3.", 0, 0); - header_mime_decode(".", 0, 0); - header_mime_decode(".5", 0, 0); - header_mime_decode("c.d", 0, 0); - header_mime_decode("", 0, 0); - - header_msgid_decode(" <\"L3x2i1.0.Nm5.Xd-Wu\"@lists.redhat.com>"); - header_msgid_decode("<200001180446.PAA02065@beaker.htb.com.au>"); -#endif - - test_fold("Header: This is a long header that should be folded properly at the right place, or so i hope. I should probably set the fold value to something lower for testing"); - test_fold("Header: nowletstryfoldingsomethingthatistoolongtofold,iwonderwhatitshoulddointsteadtofoldit?hmm,iguessicanjusttruncateitatsomepointortrytorefoldthepreviousstuff(yuck)tofit"); - test_phrase("Michael Zucchi (NotZed)"); - test_phrase("Zucchi, ( \\ NotZed \\ ) Michael"); - { - int ic; - char *outbuf, *inbuf, buffer[256]; - int inlen, outlen; - - outlen = 256; - inbuf = "Dra¾en Kaèar"; - inlen = strlen(inbuf); - outbuf = buffer; - ic = unicode_iconv_open("UTF-8", "ISO-8859-1"); - unicode_iconv(ic, &inbuf, &inlen, &outbuf, &outlen); - test_phrase(buffer); - - outlen = 256; - inbuf = "This is an encoded phrase Tomasz K³oczko"; - inlen = strlen(inbuf); - outbuf = buffer; - ic = unicode_iconv_open("UTF-8", "ISO-8859-2"); - unicode_iconv(ic, &inbuf, &inlen, &outbuf, &outlen); - test_phrase(buffer); - - } - - { - char *str = "Blah blah\n\t = ? =? ?= This is a TEST For quoted-printable-encoding-encoding-of - long lines, and lines that end in spaces - and line sthat end in tabs - And lines that just end."; - - char encoded[256]; - int state=-1,save=0; - int len; - - len = quoted_encode_step(str, strlen(str), encoded, &state, &save); - len += quoted_encode_close("", 0, encoded+len, &state, &save); - printf("encoded = '%.*s'\n", len, encoded); - } -} - -#endif /* BUILD_TABLE */ - -char * -header_msgid_generate (void) -{ - gchar host [256], domain [768]; - static gint count = 0; - - gethostname (host, sizeof (host)); - getdomainname (domain, sizeof (domain)); - - return g_strdup_printf ("%d.%d.%d.camel@%s.%s", (gint) time (NULL), getpid (), count++, host, domain); -} diff --git a/camel/camel-mime-utils.h b/camel/camel-mime-utils.h deleted file mode 100644 index a1f8bb549d..0000000000 --- a/camel/camel-mime-utils.h +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * Jeffrey Stedfast <fejj@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef _CAMEL_MIME_UTILS_H -#define _CAMEL_MIME_UTILS_H - -#include <glib.h> -#include <time.h> - -/* maximum size of a line from header_fold() */ -#define CAMEL_FOLD_SIZE (72) - -/* a list of references for this message */ -struct _header_references { - struct _header_references *next; - char *id; -}; - -struct _header_param { - struct _header_param *next; - char *name; - char *value; -}; - -/* describes a content-type */ -struct _header_content_type { - char *type; - char *subtype; - struct _header_param *params; - unsigned int refcount; -}; - -/* a raw rfc822 header */ -/* the value MUST be US-ASCII */ -struct _header_raw { - struct _header_raw *next; - char *name; - char *value; - int offset; /* in file, if known */ -}; - -typedef struct _CamelMimeDisposition { - char *disposition; - struct _header_param *params; - unsigned int refcount; -} CamelMimeDisposition; - -enum _header_address_type { - HEADER_ADDRESS_NONE, /* uninitialised */ - HEADER_ADDRESS_NAME, - HEADER_ADDRESS_GROUP -}; - -struct _header_address { - struct _header_address *next; - enum _header_address_type type; - char *name; - union { - char *addr; - struct _header_address *members; - } v; - unsigned int refcount; -}; - -/* Address lists */ -struct _header_address *header_address_new(void); -struct _header_address *header_address_new_name(const char *name, const char *addr); -struct _header_address *header_address_new_group(const char *name); -void header_address_ref(struct _header_address *); -void header_address_unref(struct _header_address *); -void header_address_set_name(struct _header_address *, const char *name); -void header_address_set_addr(struct _header_address *, const char *addr); -void header_address_set_members(struct _header_address *, struct _header_address *group); -void header_address_add_member(struct _header_address *, struct _header_address *member); -void header_address_list_append_list(struct _header_address **l, struct _header_address **h); -void header_address_list_append(struct _header_address **, struct _header_address *); -void header_address_list_clear(struct _header_address **); - -struct _header_address *header_address_decode(const char *in); -struct _header_address *header_mailbox_decode(const char *in); -char *header_address_list_format(struct _header_address *a); - -/* structured header prameters */ -char *header_param(struct _header_param *p, const char *name); -struct _header_param *header_set_param(struct _header_param **l, const char *name, const char *value); -void header_param_list_free(struct _header_param *p); - -/* Content-Type header */ -struct _header_content_type *header_content_type_new(const char *type, const char *subtype); -struct _header_content_type *header_content_type_decode(const char *in); -void header_content_type_unref(struct _header_content_type *ct); -void header_content_type_ref(struct _header_content_type *ct); -const char *header_content_type_param(struct _header_content_type *t, const char *name); -void header_content_type_set_param(struct _header_content_type *t, const char *name, const char *value); -int header_content_type_is(struct _header_content_type *ct, const char *type, const char *subtype); -char *header_content_type_format(struct _header_content_type *ct); - -/* DEBUGGING function */ -void header_content_type_dump(struct _header_content_type *ct); - -/* Content-Disposition header */ -CamelMimeDisposition *header_disposition_decode(const char *in); -void header_disposition_ref(CamelMimeDisposition *); -void header_disposition_unref(CamelMimeDisposition *); -char *header_disposition_format(CamelMimeDisposition *d); - -/* decode the contents of a content-encoding header */ -char *header_content_encoding_decode(const char *in); - -/* raw headers */ -void header_raw_append(struct _header_raw **list, const char *name, const char *value, int offset); -void header_raw_append_parse(struct _header_raw **list, const char *header, int offset); -const char *header_raw_find(struct _header_raw **list, const char *name, int *ofset); -const char *header_raw_find_next(struct _header_raw **list, const char *name, int *ofset, const char *last); -void header_raw_replace(struct _header_raw **list, const char *name, const char *value, int offset); -void header_raw_remove(struct _header_raw **list, const char *name); -void header_raw_clear(struct _header_raw **list); - -/* fold a header */ -char *header_fold(const char *in); - -/* decode a header which is a simple token */ -char *header_token_decode(const char *in); - -/* decode/encode a string type, like a subject line */ -char *header_decode_string(const char *in); -char *header_encode_string(const unsigned char *in); - -/* encode a phrase, like the real name of an address */ -char *header_encode_phrase(const unsigned char *in); - -/* decode an email date field into a GMT time, + optional offset */ -time_t header_decode_date(const char *in, int *saveoffset); -char *header_format_date(time_t time, int offset); - -/* decode a message id */ -char *header_msgid_decode(const char *in); - -/* generate msg id */ -char *header_msgid_generate (void); - -/* decode a References header */ -struct _header_references *header_references_decode(const char *in); -void header_references_list_clear(struct _header_references **list); -void header_references_list_append_asis(struct _header_references **list, char *ref); -int header_references_list_size(struct _header_references **list); -struct _header_references *header_references_dup(const struct _header_references *list); - -/* decode the mime-type header */ -void header_mime_decode(const char *in, int *maj, int *min); - -/* do incremental base64/quoted-printable (de/en)coding */ -int base64_decode_step(unsigned char *in, int len, unsigned char *out, int *state, unsigned int *save); - -int base64_encode_step(unsigned char *in, int len, gboolean break_lines, unsigned char *out, int *state, int *save); -int base64_encode_close(unsigned char *in, int inlen, gboolean break_lines, unsigned char *out, int *state, int *save); - -int uudecode_step (unsigned char *in, int len, unsigned char *out, int *state, guint32 *save, char *uulen); - -int quoted_decode_step(unsigned char *in, int len, unsigned char *out, int *savestate, int *saveme); - -int quoted_encode_step(unsigned char *in, int len, unsigned char *out, int *state, int *save); -int quoted_encode_close(unsigned char *in, int len, unsigned char *out, int *state, int *save); - -#endif /* ! _CAMEL_MIME_UTILS_H */ diff --git a/camel/camel-movemail.c b/camel/camel-movemail.c deleted file mode 100644 index ea3fdb3da0..0000000000 --- a/camel/camel-movemail.c +++ /dev/null @@ -1,592 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-movemail.c: mbox copying function */ - -/* - * Author: - * Dan Winship <danw@helixcode.com> - * - * Copyright 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> - -#include <sys/stat.h> -#include <sys/uio.h> -#include <errno.h> -#include <fcntl.h> -#include <stdlib.h> -#include <stdio.h> -#include <time.h> -#include <unistd.h> -#include <string.h> -#include <signal.h> - -#include "camel-movemail.h" -#include "camel-exception.h" - -#include "camel-mime-parser.h" -#include "camel-mime-filter.h" -#include "camel-mime-filter-from.h" - -#define d(x) - -#ifdef MOVEMAIL_PATH -#include <sys/wait.h> - -static void movemail_external (const char *source, const char *dest, - CamelException *ex); -#endif - -/* these could probably be exposed as a utility? (but only mbox needs it) */ -#if 0 -static int camel_movemail_copy_filter(int fromfd, int tofd, off_t start, size_t bytes, CamelMimeFilter *filter); -static int camel_movemail_copy(int fromfd, int tofd, off_t start, size_t bytes); -#endif - -/** - * camel_movemail: Copy an mbox file from a shared spool directory to a - * new folder in a Camel store - * @source: source file - * @dest: destination file - * @ex: a CamelException - * - * This copies an mbox file from a shared directory with multiple - * readers and writers into a private (presumably Camel-controlled) - * directory. Dot locking is used on the source file (but not the - * destination). - **/ -void -camel_movemail (const char *source, const char *dest, CamelException *ex) -{ - gboolean locked; - int sfd, dfd, tmpfd; - char *locktmpfile, *lockfile; - struct stat st; - time_t now, timeout; - int nread, nwrote; - char buf[BUFSIZ]; - - camel_exception_clear (ex); - - /* Stat and then open the spool file. If it doesn't exist or - * is empty, the user has no mail. (There's technically a race - * condition here in that an MDA might have just now locked it - * to deliver a message, but we don't care. In that case, - * assuming it's unlocked is equivalent to pretending we were - * called a fraction earlier.) - */ - if (stat (source, &st) == -1) { - if (errno != ENOENT) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not check mail file " - "%s: %s"), source, - g_strerror (errno)); - } - return; - } - if (st.st_size == 0) - return; - - /* Create the unique lock file. */ - locktmpfile = g_strdup_printf ("%s.lock.XXXXXX", source); -#ifdef HAVE_MKSTEMP - tmpfd = mkstemp (locktmpfile); -#else - if (mktemp (locktmpfile)) { - tmpfd = open (locktmpfile, O_RDWR | O_CREAT | O_EXCL, - S_IRUSR | S_IWUSR); - } else - tmpfd = -1; -#endif - if (tmpfd == -1) { - g_free (locktmpfile); -#ifdef MOVEMAIL_PATH - if (errno == EACCES) { - /* movemail_external will fail if the dest file - * already exists, so if it does, return now, - * let the fetch code process the mail that's - * already there, and then the user can try again. - */ - if (stat (dest, &st) == 0) - return; - - movemail_external (source, dest, ex); - return; - } -#endif - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not create lock file " - "for %s: %s"), source, - g_strerror (errno)); - return; - } - close (tmpfd); - - sfd = open (source, O_RDWR); - if (sfd == -1) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not open mail file %s: %s"), - source, g_strerror (errno)); - unlink (locktmpfile); - g_free (locktmpfile); - return; - } - - dfd = open (dest, O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR); - if (dfd == -1) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not open temporary mail " - "file %s: %s"), dest, - g_strerror (errno)); - close (sfd); - unlink (locktmpfile); - g_free (locktmpfile); - return; - } - - lockfile = g_strdup_printf ("%s.lock", source); - locked = FALSE; - time (&timeout); - timeout += 30; - - /* Loop trying to lock the file for 30 seconds. */ - while (time (&now) < timeout) { - /* Try to make the lock. */ - if (symlink (locktmpfile, lockfile) == 0) { - locked = TRUE; - break; - } - - /* If we fail for a reason other than that someone - * else has the lock, then abort. - */ - if (errno != EEXIST) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not create lock " - "file for %s: %s"), source, - g_strerror (errno)); - break; - } - - /* Check the modtime on the lock file. */ - if (stat (lockfile, &st) == -1) { - /* If the lockfile disappeared, try again. */ - if (errno == ENOENT) - continue; - - /* Some other error. Abort. */ - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not test lock " - "file for %s: %s"), source, - g_strerror (errno)); - break; - } - - /* If the lock file is stale, remove it and try again. */ - if (st.st_mtime < now - 60) { - unlink (lockfile); - continue; - } - - /* Otherwise, sleep and try again. */ - sleep (5); - } - - if (!locked) { - /* Something has gone awry. */ - if (now >= timeout) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Timed out trying to get " - "lock file on %s. Try again " - "later."), source); - } - g_free (lockfile); - unlink (locktmpfile); - g_free (locktmpfile); - close (sfd); - close (dfd); - return; - } - - /* OK. We have the file locked now. */ - - /* FIXME: Set a timer to keep the file locked. */ - - while (1) { - int written = 0; - - nread = read (sfd, buf, sizeof (buf)); - if (nread == 0) - break; - else if (nread == -1) { - if (errno == EINTR) - continue; - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Error reading mail file: %s"), - g_strerror (errno)); - break; - } - - while (nread) { - nwrote = write (dfd, buf + written, nread); - if (nwrote == -1) { - if (errno == EINTR) - continue; /* continues inner loop */ - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Error writing " - "mail temp file: %s"), - g_strerror (errno)); - break; - } - written += nwrote; - nread -= nwrote; - } - } - - /* If no errors occurred copying the data, and we successfully - * close the destination file, then truncate the source file. - */ - if (!camel_exception_is_set (ex)) { - if (close (dfd) == 0) - ftruncate (sfd, 0); - else { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Failed to store mail in " - "temp file %s: %s"), dest, - g_strerror (errno)); - } - } else - close (dfd); - close (sfd); - - /* Clean up lock files. */ - unlink (lockfile); - g_free (lockfile); - unlink (locktmpfile); - g_free (locktmpfile); -} - -#ifdef MOVEMAIL_PATH -static void -movemail_external (const char *source, const char *dest, CamelException *ex) -{ - sigset_t mask, omask; - pid_t pid; - int fd[2], len = 0, nread, status; - char buf[BUFSIZ], *output = NULL; - - /* Block SIGCHLD so the app can't mess us up. */ - sigemptyset (&mask); - sigaddset (&mask, SIGCHLD); - sigprocmask (SIG_BLOCK, &mask, &omask); - - if (pipe (fd) == -1) { - sigprocmask (SIG_SETMASK, &omask, NULL); - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not create pipe: %s"), - g_strerror (errno)); - return; - } - - pid = fork (); - switch (pid) { - case -1: - close (fd[0]); - close (fd[1]); - sigprocmask (SIG_SETMASK, &omask, NULL); - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not fork: %s"), - g_strerror (errno)); - return; - - case 0: - /* Child */ - close (fd[0]); - close (STDIN_FILENO); - dup2 (fd[1], STDOUT_FILENO); - dup2 (fd[1], STDERR_FILENO); - - execl (MOVEMAIL_PATH, MOVEMAIL_PATH, source, dest, NULL); - _exit (255); - break; - - default: - break; - } - - /* Parent */ - close (fd[1]); - - /* Read movemail's output. */ - while ((nread = read (fd[0], buf, sizeof (buf))) > 0) { - output = g_realloc (output, len + nread + 1); - memcpy (output + len, buf, nread); - len += nread; - output[len] = '\0'; - } - close (fd[0]); - - /* Now get the exit status. */ - while (waitpid (pid, &status, 0) == -1 && errno == EINTR) - ; - sigprocmask (SIG_SETMASK, &omask, NULL); - - if (!WIFEXITED (status) || WEXITSTATUS (status) != 0) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Movemail program failed: %s"), - output ? output : _("(Unknown error)")); - } - g_free (output); -} -#endif - - -#if 0 -static int -camel_movemail_copy(int fromfd, int tofd, off_t start, size_t bytes) -{ - char buffer[4096]; - int written = 0; - - d(printf("writing %d bytes ... ", bytes)); - - if (lseek(fromfd, start, SEEK_SET) != start) - return -1; - - while (bytes>0) { - int toread, towrite; - - toread = bytes; - if (bytes>4096) - toread = 4096; - else - toread = bytes; - do { - towrite = read(fromfd, buffer, toread); - } while (towrite == -1 && errno == EINTR); - - if (towrite == -1) - return -1; - - /* check for 'end of file' */ - if (towrite == 0) { - d(printf("end of file?\n")); - break; - } - - do { - toread = write(tofd, buffer, towrite); - } while (toread == -1 && errno == EINTR); - - if (toread == -1) - return -1; - - written += toread; - bytes -= toread; - } - - d(printf("written %d bytes\n", written)); - - return written; -} -#endif - -#define PRE_SIZE (32) - -#if 0 -static int -camel_movemail_copy_filter(int fromfd, int tofd, off_t start, size_t bytes, CamelMimeFilter *filter) -{ - char buffer[4096+PRE_SIZE]; - int written = 0; - char *filterbuffer; - int filterlen, filterpre; - - d(printf("writing %d bytes ... ", bytes)); - - camel_mime_filter_reset(filter); - - if (lseek(fromfd, start, SEEK_SET) != start) - return -1; - - while (bytes>0) { - int toread, towrite; - - toread = bytes; - if (bytes>4096) - toread = 4096; - else - toread = bytes; - do { - towrite = read(fromfd, buffer+PRE_SIZE, toread); - } while (towrite == -1 && errno == EINTR); - - if (towrite == -1) - return -1; - - /* check for 'end of file' */ - if (towrite == 0) { - d(printf("end of file?\n")); - camel_mime_filter_complete(filter, buffer+PRE_SIZE, towrite, PRE_SIZE, - &filterbuffer, &filterlen, &filterpre); - towrite = filterlen; - if (towrite == 0) - break; - } else { - camel_mime_filter_filter(filter, buffer+PRE_SIZE, towrite, PRE_SIZE, - &filterbuffer, &filterlen, &filterpre); - towrite = filterlen; - } - - do { - toread = write(tofd, filterbuffer, towrite); - } while (toread == -1 && errno == EINTR); - - if (toread == -1) - return -1; - - written += toread; - bytes -= toread; - } - - d(printf("written %d bytes\n", written)); - - return written; -} - -/* write the headers back out again, but not he Content-Length header, because we dont - want to maintain it! */ -static int -solaris_header_write(int fd, struct _header_raw *header) -{ - struct iovec iv[4]; - int outlen = 0, len; - - iv[1].iov_base = ":"; - iv[1].iov_len = 1; - iv[3].iov_base = "\n"; - iv[3].iov_len = 1; - - while (header) { - if (strcasecmp(header->name, "Content-Length")) { - iv[0].iov_base = header->name; - iv[0].iov_len = strlen(header->name); - iv[2].iov_base = header->value; - iv[2].iov_len = strlen(header->value); - - do { - len = writev(fd, iv, 4); - } while (len == -1 && errno == EINTR); - - if (len == -1) - return -1; - outlen += len; - } - header = header->next; - } - - do { - len = write(fd, "\n", 1); - } while (len == -1 && errno == EINTR); - - if (len == -1) - return -1; - - outlen += 1; - - d(printf("Wrote %d bytes of headers\n", outlen)); - - return outlen; -} - -/* Well, since Solaris is a tad broken wrt its 'mbox' folder format, - we must convert it to a real mbox format. Thankfully this is - mostly pretty easy */ -static int -camel_movemail_solaris (int sfd, int dfd, CamelException *ex) -{ - CamelMimeParser *mp; - char *buffer; - int len; - CamelMimeFilterFrom *ffrom; - int ret = 1; - - mp = camel_mime_parser_new(); - camel_mime_parser_scan_from(mp, TRUE); - camel_mime_parser_init_with_fd(mp, sfd); - - ffrom = camel_mime_filter_from_new(); - - while (camel_mime_parser_step(mp, &buffer, &len) == HSCAN_FROM) { - if (camel_mime_parser_step(mp, &buffer, &len) != HSCAN_FROM_END) { - const char *cl; - int length; - int start, body; - off_t newpos; - - ret = 0; - - start = camel_mime_parser_tell_start_from(mp); - body = camel_mime_parser_tell(mp); - - /* write out headers, but NOT content-length header */ - solaris_header_write(dfd, camel_mime_parser_headers_raw(mp)); - - cl = camel_mime_parser_header(mp, "content-length", NULL); - if (cl == NULL) { - g_warning("Required Content-Length header is missing from solaris mail box @ %d", (int)camel_mime_parser_tell(mp)); - camel_mime_parser_drop_step(mp); - camel_mime_parser_drop_step(mp); - camel_mime_parser_step(mp, &buffer, &len); - camel_mime_parser_unstep(mp); - length = camel_mime_parser_tell_start_from(mp) - body; - newpos = -1; - } else { - length = atoi(cl); - camel_mime_parser_drop_step(mp); - camel_mime_parser_drop_step(mp); - newpos = length+body; - } - /* copy body->length converting From lines */ - if (camel_movemail_copy_filter(sfd, dfd, body, length, (CamelMimeFilter *)ffrom) == -1) - goto fail; - if (newpos != -1) - camel_mime_parser_seek(mp, newpos, SEEK_SET); - } else { - g_error("Inalid parser state: %d", camel_mime_parser_state(mp)); - } - } - - camel_object_unref((CamelObject *)mp); - camel_object_unref((CamelObject *)ffrom); - - return ret; - -fail: - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "Error copying " - "mail temp file: %s", - g_strerror (errno)); - - - camel_object_unref((CamelObject *)mp); - camel_object_unref((CamelObject *)ffrom); - - return -1; -} -#endif diff --git a/camel/camel-movemail.h b/camel/camel-movemail.h deleted file mode 100644 index 8b73435a43..0000000000 --- a/camel/camel-movemail.h +++ /dev/null @@ -1,45 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-movemail.h: mbox copy function */ - -/* - * Author: - * Dan Winship <danw@helixcode.com> - * - * Copyright 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_MOVEMAIL_H -#define CAMEL_MOVEMAIL_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-exception.h> - -void camel_movemail (const char *source, const char *dest, CamelException *ex); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MOVEMAIL_H */ diff --git a/camel/camel-multipart.c b/camel/camel-multipart.c deleted file mode 100644 index c5a5f81b22..0000000000 --- a/camel/camel-multipart.c +++ /dev/null @@ -1,520 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-multipart.c : Abstract class for a multipart */ - -#ifndef NO_WARNINGS -#warning This should be a mostly abstract class, but it is not! -#endif - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> -#include "gmime-content-field.h" -#include "camel-stream-mem.h" -#include "camel-multipart.h" -#include "camel-mime-part.h" -#include "camel-exception.h" -#include "md5-utils.h" - -#include <unistd.h> /* for getpid */ -#include <time.h> /* for time */ - -#define d(x) - -static void add_part (CamelMultipart *multipart, - CamelMimePart *part); -static void add_part_at (CamelMultipart *multipart, - CamelMimePart *part, - guint index); -static void remove_part (CamelMultipart *multipart, - CamelMimePart *part); -static CamelMimePart * remove_part_at (CamelMultipart *multipart, - guint index); -static CamelMimePart * get_part (CamelMultipart *multipart, - guint index); -static guint get_number (CamelMultipart *multipart); -static void set_boundary (CamelMultipart *multipart, - gchar *boundary); -static const gchar * get_boundary (CamelMultipart *multipart); -static int write_to_stream (CamelDataWrapper *data_wrapper, - CamelStream *stream); -static void unref_part (gpointer data, gpointer user_data); - -static CamelDataWrapperClass *parent_class = NULL; - - - -/* Returns the class for a CamelMultipart */ -#define CMP_CLASS(so) CAMEL_MULTIPART_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - -/* Returns the class for a CamelDataWrapper */ -#define CDW_CLASS(so) CAMEL_DATA_WRAPPER_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - - -static void -camel_multipart_class_init (CamelMultipartClass *camel_multipart_class) -{ - CamelDataWrapperClass *camel_data_wrapper_class = - CAMEL_DATA_WRAPPER_CLASS (camel_multipart_class); - - parent_class = CAMEL_DATA_WRAPPER_CLASS (camel_type_get_global_classfuncs (camel_data_wrapper_get_type ())); - - /* virtual method definition */ - camel_multipart_class->add_part = add_part; - camel_multipart_class->add_part_at = add_part_at; - camel_multipart_class->remove_part = remove_part; - camel_multipart_class->remove_part_at = remove_part_at; - camel_multipart_class->get_part = get_part; - camel_multipart_class->get_number = get_number; - camel_multipart_class->set_boundary = set_boundary; - camel_multipart_class->get_boundary = get_boundary; - - /* virtual method overload */ - camel_data_wrapper_class->write_to_stream = write_to_stream; -} - -static void -camel_multipart_init (gpointer object, gpointer klass) -{ - CamelMultipart *multipart = CAMEL_MULTIPART (object); - - camel_data_wrapper_set_mime_type (CAMEL_DATA_WRAPPER (multipart), - "multipart/mixed"); - multipart->preface = NULL; - multipart->postface = NULL; -} - -static void -camel_multipart_finalize (CamelObject *object) -{ - CamelMultipart *multipart = CAMEL_MULTIPART (object); - - g_list_foreach (multipart->parts, unref_part, NULL); - - if (multipart->boundary) - g_free (multipart->boundary); - if (multipart->preface) - g_free (multipart->preface); - if (multipart->postface) - g_free (multipart->postface); -} - - -CamelType -camel_multipart_get_type (void) -{ - static CamelType camel_multipart_type = CAMEL_INVALID_TYPE; - - if (camel_multipart_type == CAMEL_INVALID_TYPE) { - camel_multipart_type = camel_type_register (camel_data_wrapper_get_type (), "CamelMultipart", - sizeof (CamelMultipart), - sizeof (CamelMultipartClass), - (CamelObjectClassInitFunc) camel_multipart_class_init, - NULL, - (CamelObjectInitFunc) camel_multipart_init, - (CamelObjectFinalizeFunc) camel_multipart_finalize); - } - - return camel_multipart_type; -} - -static void -unref_part (gpointer data, gpointer user_data) -{ - CamelObject *part = CAMEL_OBJECT (data); - - camel_object_unref (part); -} - -/** - * camel_multipart_new: - * - * Create a new CamelMultipart object. - * - * Return value: a new CamelMultipart - **/ -CamelMultipart * -camel_multipart_new (void) -{ - CamelMultipart *multipart; - - multipart = (CamelMultipart *)camel_object_new (CAMEL_MULTIPART_TYPE); - multipart->preface = NULL; - multipart->postface = NULL; - - return multipart; -} - - -static void -add_part (CamelMultipart *multipart, CamelMimePart *part) -{ - multipart->parts = g_list_append (multipart->parts, part); - camel_object_ref (CAMEL_OBJECT (part)); -} - -/** - * camel_multipart_add_part: - * @multipart: a CamelMultipart - * @part: the part to add - * - * Appends the part to the multipart object. - **/ -void -camel_multipart_add_part (CamelMultipart *multipart, CamelMimePart *part) -{ - g_return_if_fail (CAMEL_IS_MULTIPART (multipart)); - g_return_if_fail (CAMEL_IS_MIME_PART (part)); - - CMP_CLASS (multipart)->add_part (multipart, part); -} - - -static void -add_part_at (CamelMultipart *multipart, CamelMimePart *part, guint index) -{ - multipart->parts = g_list_insert (multipart->parts, part, index); - camel_object_ref (CAMEL_OBJECT (part)); -} - -/** - * camel_multipart_add_part_at: - * @multipart: a CamelMultipart - * @part: the part to add - * @index: index to add the multipart at - * - * Adds the part to the multipart object after the @index'th - * element. If @index is greater than the number of parts, it is - * equivalent to camel_multipart_add_part(). - **/ -void -camel_multipart_add_part_at (CamelMultipart *multipart, - CamelMimePart *part, guint index) -{ - g_return_if_fail (CAMEL_IS_MULTIPART (multipart)); - g_return_if_fail (CAMEL_IS_MIME_PART (part)); - - CMP_CLASS (multipart)->add_part_at (multipart, part, index); -} - - -static void -remove_part (CamelMultipart *multipart, CamelMimePart *part) -{ - if (!multipart->parts) - return; - multipart->parts = g_list_remove (multipart->parts, part); - camel_object_unref (CAMEL_OBJECT (part)); -} - -/** - * camel_multipart_remove_part: - * @multipart: a CamelMultipart - * @part: the part to remove - * - * Removes @part from @multipart. - **/ -void -camel_multipart_remove_part (CamelMultipart *multipart, - CamelMimePart *part) -{ - g_return_if_fail (CAMEL_IS_MULTIPART (multipart)); - g_return_if_fail (CAMEL_IS_MIME_PART (part)); - - CMP_CLASS (multipart)->remove_part (multipart, part); -} - - -static CamelMimePart * -remove_part_at (CamelMultipart *multipart, guint index) -{ - GList *parts_list; - GList *part_to_remove; - CamelMimePart *removed_part; - - if (!(multipart->parts)) - return NULL; - - parts_list = multipart->parts; - part_to_remove = g_list_nth (parts_list, index); - if (!part_to_remove) { - g_warning ("CamelMultipart::remove_part_at: " - "part to remove is NULL\n"); - return NULL; - } - removed_part = CAMEL_MIME_PART (part_to_remove->data); - - multipart->parts = g_list_remove_link (parts_list, part_to_remove); - if (part_to_remove->data) - camel_object_unref (CAMEL_OBJECT (part_to_remove->data)); - g_list_free_1 (part_to_remove); - - return removed_part; -} - -/** - * camel_multipart_remove_part_at: - * @multipart: a CamelMultipart - * @index: a zero-based index indicating the part to remove - * - * Remove the indicated part from the multipart object. - * - * Return value: the removed part. Note that it is camel_object_unref()ed - * before being returned, which may cause it to be destroyed. - **/ -CamelMimePart * -camel_multipart_remove_part_at (CamelMultipart *multipart, guint index) -{ - g_return_val_if_fail (CAMEL_IS_MULTIPART (multipart), NULL); - - return CMP_CLASS (multipart)->remove_part_at (multipart, index); -} - - -static CamelMimePart * -get_part (CamelMultipart *multipart, guint index) -{ - GList *part; - - if (!(multipart->parts)) - return NULL; - - part = g_list_nth (multipart->parts, index); - if (part) - return CAMEL_MIME_PART (part->data); - else - return NULL; -} - -/** - * camel_multipart_get_part: - * @multipart: a CamelMultipart - * @index: a zero-based index indicating the part to get - * - * Return value: the indicated subpart, or %NULL - **/ -CamelMimePart * -camel_multipart_get_part (CamelMultipart *multipart, guint index) -{ - g_return_val_if_fail (CAMEL_IS_MULTIPART (multipart), NULL); - - return CMP_CLASS (multipart)->get_part (multipart, index); -} - - -static guint -get_number (CamelMultipart *multipart) -{ - return g_list_length (multipart->parts); -} - -/** - * camel_multipart_get_number: - * @multipart: a CamelMultipart - * - * Return value: the number of subparts in @multipart - **/ -guint -camel_multipart_get_number (CamelMultipart *multipart) -{ - g_return_val_if_fail (CAMEL_IS_MULTIPART (multipart), 0); - - return CMP_CLASS (multipart)->get_number (multipart); -} - - -static void -set_boundary (CamelMultipart *multipart, gchar *boundary) -{ - CamelDataWrapper *cdw = CAMEL_DATA_WRAPPER (multipart); - char *bgen, digest[16], bbuf[27], *p; - int state, save; - - g_return_if_fail (cdw->mime_type != NULL); - - if (!boundary) { - /* Generate a fairly random boundary string. */ - bgen = g_strdup_printf ("%p:%lu:%lu", multipart, - (unsigned long) getpid(), - (unsigned long) time(0)); - md5_get_digest (bgen, strlen (bgen), digest); - g_free (bgen); - strcpy (bbuf, "=-"); - p = bbuf + 2; - state = save = 0; - p += base64_encode_step (digest, 16, FALSE, p, &state, &save); - *p = '\0'; - - boundary = bbuf; - } - - gmime_content_field_set_parameter (cdw->mime_type, "boundary", - boundary); -} - -/** - * camel_multipart_set_boundary: - * @multipart: a CamelMultipart - * @boundary: the message boundary, or %NULL - * - * Sets the message boundary for @multipart to @boundary. This should - * be a string which does not occur anywhere in any of @multipart's - * subparts. If @boundary is %NULL, a randomly-generated boundary will - * be used. - **/ -void -camel_multipart_set_boundary (CamelMultipart *multipart, gchar *boundary) -{ - g_return_if_fail (CAMEL_IS_MULTIPART (multipart)); - - CMP_CLASS (multipart)->set_boundary (multipart, boundary); -} - - -static const gchar * -get_boundary (CamelMultipart *multipart) -{ - CamelDataWrapper *cdw = CAMEL_DATA_WRAPPER (multipart); - - g_return_val_if_fail (cdw->mime_type != NULL, NULL); - return gmime_content_field_get_parameter (cdw->mime_type, "boundary"); -} - -/** - * camel_multipart_get_boundary: - * @multipart: a CamelMultipart - * - * Return value: @multipart's message boundary - **/ -const gchar * -camel_multipart_get_boundary (CamelMultipart *multipart) -{ - return CMP_CLASS (multipart)->get_boundary (multipart); -} - -/* this is MIME specific, doesn't belong here really */ -static int -write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream) -{ - CamelMultipart *multipart = CAMEL_MULTIPART (data_wrapper); - const gchar *boundary; - int total = 0; - int count; - GList *node; - - /* get the bundary text */ - boundary = camel_multipart_get_boundary (multipart); - - /* we cannot write a multipart without a boundary string */ - g_return_val_if_fail (boundary && *boundary, -1); - - /* - * write the preface text (usually something like - * "This is a mime message, if you see this, then - * your mail client probably doesn't support ...." - */ - if (multipart->preface) { - count = camel_stream_write_string (stream, multipart->preface); - if (count == -1) - return -1; - total += count; - } - - /* - * Now, write all the parts, separated by the boundary - * delimiter - */ - node = multipart->parts; - while (node) { - count = camel_stream_printf (stream, "\n--%s\n", boundary); - if (count == -1) - return -1; - total += count; - - count = camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (node->data), stream); - if (count == -1) - return -1; - total += count; - node = node->next; - } - - /* write the terminating boudary delimiter */ - count = camel_stream_printf (stream, "\n--%s--\n", boundary); - if (count == -1) - return -1; - total += count; - - /* and finally the postface */ - if (multipart->postface) { - count = camel_stream_write_string (stream, multipart->postface); - if (count == -1) - return -1; - total += count; - } - - return total; -} - -/** - * camel_multipart_set_preface: - * @multipart: - * @preface: - * - * Set the preface text for this multipart. Will be written out infront - * of the multipart. This text should only include US-ASCII strings, and - * be relatively short, and will be ignored by any MIME mail client. - **/ -void -camel_multipart_set_preface(CamelMultipart *multipart, const char *preface) -{ - if (multipart->preface != preface) { - g_free(multipart->preface); - if (preface) - multipart->preface = g_strdup(preface); - else - multipart->preface = NULL; - } -} - -/** - * camel_multipart_set_postface: - * @multipart: - * @postface: - * - * Set the postfix text for this multipart. Will be written out after - * the last boundary of the multipart, and ignored by any MIME mail - * client. - * - * Generally postface texts should not be sent with multipart messages. - **/ -void -camel_multipart_set_postface(CamelMultipart *multipart, const char *postface) -{ - if (multipart->postface != postface) { - g_free(multipart->postface); - if (postface) - multipart->postface = g_strdup(postface); - else - multipart->postface = NULL; - } -} diff --git a/camel/camel-multipart.h b/camel/camel-multipart.h deleted file mode 100644 index 3058b8f2e0..0000000000 --- a/camel/camel-multipart.h +++ /dev/null @@ -1,105 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-multipart.h : class for a multipart */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_MULTIPART_H -#define CAMEL_MULTIPART_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-data-wrapper.h> - -#define CAMEL_MULTIPART_TYPE (camel_multipart_get_type ()) -#define CAMEL_MULTIPART(obj) (CAMEL_CHECK_CAST((obj), CAMEL_MULTIPART_TYPE, CamelMultipart)) -#define CAMEL_MULTIPART_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_MULTIPART_TYPE, CamelMultipartClass)) -#define CAMEL_IS_MULTIPART(o) (CAMEL_CHECK_TYPE((o), CAMEL_MULTIPART_TYPE)) - - -struct _CamelMultipart -{ - CamelDataWrapper parent_object; - - CamelMimePart *parent; - GList *parts; - gchar *boundary; - gchar *preface; - gchar *postface; - -}; - - - -typedef struct { - CamelDataWrapperClass parent_class; - - /* Virtual methods */ - void (*add_part) (CamelMultipart *multipart, CamelMimePart *part); - void (*add_part_at) (CamelMultipart *multipart, CamelMimePart *part, guint index); - void (*remove_part) (CamelMultipart *multipart, CamelMimePart *part); - CamelMimePart * (*remove_part_at) (CamelMultipart *multipart, guint index); - CamelMimePart * (*get_part) (CamelMultipart *multipart, guint index); - guint (*get_number) (CamelMultipart *multipart); - void (*set_boundary) (CamelMultipart *multipart, gchar *boundary); - const gchar * (*get_boundary) (CamelMultipart *multipart); - -} CamelMultipartClass; - - -/* Standard Camel function */ -CamelType camel_multipart_get_type (void); - - -/* public methods */ -CamelMultipart * camel_multipart_new (void); -void camel_multipart_add_part (CamelMultipart *multipart, - CamelMimePart *part); -void camel_multipart_add_part_at (CamelMultipart *multipart, - CamelMimePart *part, - guint index); -void camel_multipart_remove_part (CamelMultipart *multipart, - CamelMimePart *part); -CamelMimePart * camel_multipart_remove_part_at (CamelMultipart *multipart, - guint index); -CamelMimePart * camel_multipart_get_part (CamelMultipart *multipart, - guint index); -guint camel_multipart_get_number (CamelMultipart *multipart); -void camel_multipart_set_boundary (CamelMultipart *multipart, - gchar *boundary); -const gchar * camel_multipart_get_boundary (CamelMultipart *multipart); - -void camel_multipart_set_preface (CamelMultipart *multipart, const char *preface); -void camel_multipart_set_postface (CamelMultipart *multipart, const char *postface); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MULTIPART_H */ - diff --git a/camel/camel-news-address.c b/camel/camel-news-address.c deleted file mode 100644 index ebd35b80c7..0000000000 --- a/camel/camel-news-address.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "camel-news-address.h" - - -static void camel_news_address_class_init (CamelNewsAddressClass *klass); - -static CamelAddressClass *camel_news_address_parent; - -static void -camel_news_address_class_init (CamelNewsAddressClass *klass) -{ - camel_news_address_parent = CAMEL_ADDRESS_CLASS (camel_type_get_global_classfuncs (camel_address_get_type ())); -} - - -CamelType -camel_news_address_get_type (void) -{ - static guint type = CAMEL_INVALID_TYPE; - - if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register (camel_address_get_type (), "CamelNewsAddress", - sizeof (CamelNewsAddress), - sizeof (CamelNewsAddressClass), - (CamelObjectClassInitFunc) camel_news_address_class_init, - NULL, - NULL, - NULL); - } - - return type; -} - -/** - * camel_news_address_new: - * - * Create a new CamelNewsAddress object. - * - * Return value: A new CamelNewsAddress widget. - **/ -CamelNewsAddress * -camel_news_address_new (void) -{ - CamelNewsAddress *new = CAMEL_NEWS_ADDRESS ( camel_object_new (camel_news_address_get_type ())); - return new; -} diff --git a/camel/camel-news-address.h b/camel/camel-news-address.h deleted file mode 100644 index 8d2aa03968..0000000000 --- a/camel/camel-news-address.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef _CAMEL_NEWS_ADDRESS_H -#define _CAMEL_NEWS_ADDRESS_H - -#include <camel/camel-address.h> - -#define CAMEL_NEWS_ADDRESS(obj) CAMEL_CHECK_CAST (obj, camel_news_address_get_type (), CamelNewsAddress) -#define CAMEL_NEWS_ADDRESS_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_news_address_get_type (), CamelNewsAddressClass) -#define IS_CAMEL_NEWS_ADDRESS(obj) CAMEL_CHECK_TYPE (obj, camel_news_address_get_type ()) - -typedef struct _CamelNewsAddressClass CamelNewsAddressClass; - -struct _CamelNewsAddress { - CamelAddress parent; - - struct _CamelNewsAddressPrivate *priv; -}; - -struct _CamelNewsAddressClass { - CamelAddressClass parent_class; -}; - -guint camel_news_address_get_type (void); -CamelNewsAddress *camel_news_address_new (void); - -#endif /* ! _CAMEL_NEWS_ADDRESS_H */ diff --git a/camel/camel-object.c b/camel/camel-object.c deleted file mode 100644 index 75c14b8978..0000000000 --- a/camel/camel-object.c +++ /dev/null @@ -1,973 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-object.c: Base class for Camel */ - -/* - * Author: - * Dan Winship <danw@helixcode.com> - * - * Copyright 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> -#include "camel-object.h" - -/* I just mashed the keyboard for these... */ -#define CAMEL_OBJECT_MAGIC_VALUE 0x77A344EF -#define CAMEL_OBJECT_CLASS_MAGIC_VALUE 0xEE26A990 -#define CAMEL_OBJECT_FINALIZED_VALUE 0x84AC3656 -#define CAMEL_OBJECT_CLASS_FINALIZED_VALUE 0x7621ABCD - -#define DEFAULT_PREALLOCS 8 - -#define BAST_CASTARD 1 /* Define to return NULL when casts fail */ - -#define NULL_PREP_VALUE ((gpointer)make_global_classfuncs) /* See camel_object_class_declare_event */ - -/* ** Quickie type system ************************************************* */ - -typedef struct _CamelTypeInfo -{ - CamelType self; - CamelType parent; - const gchar *name; - - size_t instance_size; - GMemChunk *instance_chunk; - CamelObjectInitFunc instance_init; - CamelObjectFinalizeFunc instance_finalize; - GList *free_instances; - - size_t classfuncs_size; - CamelObjectClassInitFunc class_init; - CamelObjectClassFinalizeFunc class_finalize; - CamelObjectClass *global_classfuncs; -} -CamelTypeInfo; - -typedef struct _CamelHookPair -{ - CamelObjectEventHookFunc func; - gpointer user_data; -} -CamelHookPair; - -/* ************************************************************************ */ - -static void camel_type_lock_up (void); -static void camel_type_lock_down (void); - -static void obj_init (CamelObject * obj); -static void obj_finalize (CamelObject * obj); -static void obj_class_init (CamelObjectClass * class); -static void obj_class_finalize (CamelObjectClass * class); - -static gboolean shared_is_of_type (CamelObjectShared * sh, CamelType ctype, - gboolean is_obj); -static void make_global_classfuncs (CamelTypeInfo * type_info); - -/* ************************************************************************ */ - -G_LOCK_DEFINE_STATIC (type_system); -G_LOCK_DEFINE_STATIC (type_system_level); -static GPrivate *type_system_locklevel = NULL; - -G_LOCK_DEFINE_STATIC (refcount); - -static gboolean type_system_initialized = FALSE; -static GHashTable *ctype_to_typeinfo = NULL; -static const CamelType camel_object_type = 1; -static CamelType cur_max_type = CAMEL_INVALID_TYPE; - -/* ************************************************************************ */ - -#define LOCK_VAL (GPOINTER_TO_INT (g_private_get (type_system_locklevel))) -#define LOCK_SET( val ) g_private_set (type_system_locklevel, GINT_TO_POINTER (val)) - -static void -camel_type_lock_up (void) -{ - G_LOCK (type_system_level); - - if (type_system_locklevel == NULL) - type_system_locklevel = g_private_new (GINT_TO_POINTER (0)); - - if (LOCK_VAL == 0) { - G_UNLOCK (type_system_level); - G_LOCK (type_system); - G_LOCK (type_system_level); - } - - LOCK_SET (LOCK_VAL + 1); - - G_UNLOCK (type_system_level); -} - -static void -camel_type_lock_down (void) -{ - G_LOCK (type_system_level); - - if (type_system_locklevel == NULL) { - g_warning - ("camel_type_lock_down: lock down before a lock up?"); - type_system_locklevel = g_private_new (GINT_TO_POINTER (0)); - G_UNLOCK (type_system_level); - return; - } - - LOCK_SET (LOCK_VAL - 1); - - if (LOCK_VAL == 0) - G_UNLOCK (type_system); - - G_UNLOCK (type_system_level); -} - -void -camel_type_init (void) -{ - CamelTypeInfo *obj_info; - - camel_type_lock_up (); - - if (type_system_initialized) { - g_warning - ("camel_type_init: type system already initialized."); - camel_type_lock_down (); - return; - } - - type_system_initialized = TRUE; - ctype_to_typeinfo = g_hash_table_new (g_direct_hash, g_direct_equal); - - obj_info = g_new (CamelTypeInfo, 1); - obj_info->self = camel_object_type; - obj_info->parent = CAMEL_INVALID_TYPE; - obj_info->name = "CamelObject"; - - obj_info->instance_size = sizeof (CamelObject); - obj_info->instance_chunk = - g_mem_chunk_create (CamelObject, DEFAULT_PREALLOCS, - G_ALLOC_ONLY); - obj_info->instance_init = obj_init; - obj_info->instance_finalize = obj_finalize; - obj_info->free_instances = NULL; - - obj_info->classfuncs_size = sizeof (CamelObjectClass); - obj_info->class_init = obj_class_init; - obj_info->class_finalize = obj_class_finalize; - - g_hash_table_insert (ctype_to_typeinfo, - GINT_TO_POINTER (CAMEL_INVALID_TYPE), NULL); - g_hash_table_insert (ctype_to_typeinfo, - GINT_TO_POINTER (camel_object_type), obj_info); - - /* Sigh. Ugly */ - make_global_classfuncs (obj_info); - - cur_max_type = camel_object_type; - - camel_type_lock_down (); -} - -CamelType -camel_type_register (CamelType parent, const gchar * name, - size_t instance_size, size_t classfuncs_size, - CamelObjectClassInitFunc class_init, - CamelObjectClassFinalizeFunc class_finalize, - CamelObjectInitFunc instance_init, - CamelObjectFinalizeFunc instance_finalize) -{ - CamelTypeInfo *parent_info; - CamelTypeInfo *obj_info; - gchar *chunkname; - - g_return_val_if_fail (parent != CAMEL_INVALID_TYPE, - CAMEL_INVALID_TYPE); - g_return_val_if_fail (name, CAMEL_INVALID_TYPE); - g_return_val_if_fail (instance_size, CAMEL_INVALID_TYPE); - g_return_val_if_fail (classfuncs_size, CAMEL_INVALID_TYPE); - - camel_type_lock_up (); - - if (type_system_initialized == FALSE) { - G_UNLOCK (type_system); - camel_type_init (); - G_LOCK (type_system); - } - - parent_info = - g_hash_table_lookup (ctype_to_typeinfo, - GINT_TO_POINTER (parent)); - - if (parent_info == NULL) { - g_warning - ("camel_type_register: no such parent type %d of class `%s'", - parent, name); - camel_type_lock_down (); - return CAMEL_INVALID_TYPE; - } - - if (parent_info->instance_size > instance_size) { - g_warning - ("camel_type_register: instance of class `%s' would be smaller than parent `%s'", - name, parent_info->name); - camel_type_lock_down (); - return CAMEL_INVALID_TYPE; - } - - if (parent_info->classfuncs_size > classfuncs_size) { - g_warning - ("camel_type_register: classfuncs of class `%s' would be smaller than parent `%s'", - name, parent_info->name); - camel_type_lock_down (); - return CAMEL_INVALID_TYPE; - } - - cur_max_type++; - - obj_info = g_new (CamelTypeInfo, 1); - obj_info->self = cur_max_type; - obj_info->parent = parent; - obj_info->name = name; - - obj_info->instance_size = instance_size; - chunkname = - g_strdup_printf ("chunk for instances of Camel type `%s'", - name); - obj_info->instance_chunk = - g_mem_chunk_new (chunkname, instance_size, - instance_size * DEFAULT_PREALLOCS, - G_ALLOC_ONLY); - g_free (chunkname); - obj_info->instance_init = instance_init; - obj_info->instance_finalize = instance_finalize; - obj_info->free_instances = NULL; - - obj_info->classfuncs_size = classfuncs_size; - obj_info->class_init = class_init; - obj_info->class_finalize = class_finalize; - - g_hash_table_insert (ctype_to_typeinfo, - GINT_TO_POINTER (obj_info->self), obj_info); - - /* Sigh. Ugly. */ - make_global_classfuncs (obj_info); - - camel_type_lock_down (); - return obj_info->self; -} - -CamelObjectClass * -camel_type_get_global_classfuncs (CamelType type) -{ - CamelTypeInfo *type_info; - - g_return_val_if_fail (type != CAMEL_INVALID_TYPE, NULL); - - camel_type_lock_up (); - type_info = - g_hash_table_lookup (ctype_to_typeinfo, - GINT_TO_POINTER (type)); - camel_type_lock_down (); - - g_return_val_if_fail (type_info != NULL, NULL); - - return type_info->global_classfuncs; -} - -const gchar * -camel_type_to_name (CamelType type) -{ - CamelTypeInfo *type_info; - - g_return_val_if_fail (type != CAMEL_INVALID_TYPE, - "(the invalid type)"); - - camel_type_lock_up (); - type_info = - g_hash_table_lookup (ctype_to_typeinfo, - GINT_TO_POINTER (type)); - camel_type_lock_down (); - - g_return_val_if_fail (type_info != NULL, - "(a bad type parameter was specified)"); - - return type_info->name; -} - -/* ** The CamelObject ***************************************************** */ - -static void -obj_init (CamelObject * obj) -{ - obj->s.magic = CAMEL_OBJECT_MAGIC_VALUE; - obj->ref_count = 1; - obj->event_to_hooklist = NULL; - obj->in_event = 0; -} - -static void -obj_finalize (CamelObject * obj) -{ - g_return_if_fail (obj->s.magic == CAMEL_OBJECT_MAGIC_VALUE); - g_return_if_fail (obj->ref_count == 0); - g_return_if_fail (obj->in_event == 0); - - obj->s.magic = CAMEL_OBJECT_FINALIZED_VALUE; - - if (obj->event_to_hooklist) { - g_hash_table_foreach (obj->event_to_hooklist, (GHFunc) g_free, - NULL); - g_hash_table_destroy (obj->event_to_hooklist); - obj->event_to_hooklist = NULL; - } -} - -static void -obj_class_init (CamelObjectClass * class) -{ - class->s.magic = CAMEL_OBJECT_CLASS_MAGIC_VALUE; - - camel_object_class_declare_event (class, "finalize", NULL); -} - -static void -obj_class_finalize (CamelObjectClass * class) -{ - g_return_if_fail (class->s.magic == CAMEL_OBJECT_CLASS_MAGIC_VALUE); - - class->s.magic = CAMEL_OBJECT_CLASS_FINALIZED_VALUE; - - if (class->event_to_preplist) { - g_hash_table_foreach (class->event_to_preplist, - (GHFunc) g_free, NULL); - g_hash_table_destroy (class->event_to_preplist); - class->event_to_preplist = NULL; - } -} - -CamelType -camel_object_get_type (void) -{ - if (type_system_initialized == FALSE) - camel_type_init (); - - return camel_object_type; -} - -CamelObject * -camel_object_new (CamelType type) -{ - CamelTypeInfo *type_info; - GSList *parents = NULL; - GSList *head = NULL; - CamelObject *instance; - - g_return_val_if_fail (type != CAMEL_INVALID_TYPE, NULL); - - /* Look up the type */ - - camel_type_lock_up (); - - type_info = - g_hash_table_lookup (ctype_to_typeinfo, - GINT_TO_POINTER (type)); - - if (type_info == NULL) { - g_warning - ("camel_object_new: trying to create object of invalid type %d", - type); - camel_type_lock_down (); - return NULL; - } - - /* Grab an instance out of the freed ones if possible, alloc otherwise */ - - if (type_info->free_instances) { - GList *first; - - first = g_list_first (type_info->free_instances); - instance = first->data; - type_info->free_instances = - g_list_remove_link (type_info->free_instances, first); - g_list_free_1 (first); - } else { - instance = g_mem_chunk_alloc0 (type_info->instance_chunk); - } - - /* Init the instance and classfuncs a bit */ - - instance->s.type = type; - instance->classfuncs = type_info->global_classfuncs; - - /* Loop through the parents in simplest -> most complex order, initing the class and instance. - - * When parent = CAMEL_INVALID_TYPE and we're at the end of the line, _lookup returns NULL - * because we inserted it as corresponding to CAMEL_INVALID_TYPE. Clever, eh? - */ - - while (type_info) { - parents = g_slist_prepend (parents, type_info); - type_info = - g_hash_table_lookup (ctype_to_typeinfo, - GINT_TO_POINTER (type_info-> - parent)); - } - - head = parents; - - for (; parents && parents->data; parents = parents->next) { - CamelTypeInfo *thisinfo; - - thisinfo = parents->data; - if (thisinfo->instance_init) - (thisinfo->instance_init) (instance); - } - - g_slist_free (head); - - camel_type_lock_down (); - return instance; -} - -void -camel_object_ref (CamelObject * obj) -{ - g_return_if_fail (CAMEL_IS_OBJECT (obj)); - - G_LOCK (refcount); - obj->ref_count++; - G_UNLOCK (refcount); -} - -void -camel_object_unref (CamelObject * obj) -{ - CamelTypeInfo *type_info; - CamelTypeInfo *iter; - GSList *parents = NULL; - GSList *head = NULL; - - g_return_if_fail (CAMEL_IS_OBJECT (obj)); - - G_LOCK (refcount); - obj->ref_count--; - - if (obj->ref_count > 0) { - G_UNLOCK (refcount); - return; - } - - G_UNLOCK (refcount); - - /* Oh no! We want to emit a "finalized" event, but that function refs the object - * because it's not supposed to get finalized in an event, but it is being finalized - * right now, and AAUGH AAUGH AUGH AUGH! - * - * So we don't call camel_object_trigger_event. We do it ourselves. We even know - * that CamelObject doesn't provide a prep for the finalized event, so we plunge - * right in and call our hooks. - * - * And there was much rejoicing. - */ - -#define hooklist parents /*cough */ - - if (obj->event_to_hooklist) { - CamelHookPair *pair; - - hooklist = - g_hash_table_lookup (obj->event_to_hooklist, - "finalize"); - - while (hooklist && hooklist->data) { - pair = hooklist->data; - (pair->func) (obj, NULL, pair->user_data); - hooklist = hooklist->next; - } - } - - hooklist = NULL; /* Don't mess with this line */ - -#undef hooklist - - /* Destroy it! hahaha! */ - - camel_type_lock_up (); - - type_info = - g_hash_table_lookup (ctype_to_typeinfo, - GINT_TO_POINTER (obj->s.type)); - - if (type_info == NULL) { - g_warning - ("camel_object_unref: seemingly valid object has a bad type %d", - obj->s.type); - camel_type_lock_down (); - return; - } - - /* Loop through the parents in most complex -> simplest order, finalizing the class - * and instance. - * - * When parent = CAMEL_INVALID_TYPE and we're at the end of the line, _lookup returns NULL - * because we inserted it as corresponding to CAMEL_INVALID_TYPE. Clever, eh? - * - * Use iter to preserve type_info for free_{instance,classfunc}s - */ - - iter = type_info; - - while (iter) { - parents = g_slist_prepend (parents, iter); - iter = - g_hash_table_lookup (ctype_to_typeinfo, - GINT_TO_POINTER (iter->parent)); - } - - parents = g_slist_reverse (parents); - head = parents; - - for (; parents && parents->data; parents = parents->next) { - CamelTypeInfo *thisinfo; - - thisinfo = parents->data; - if (thisinfo->instance_finalize) - (thisinfo->instance_finalize) (obj); - } - - g_slist_free (head); - - /* A little bit of cleaning up. - - * Don't erase the type, so we can peek at it if a finalized object - * is check_cast'ed somewhere. - */ - - memset (obj, 0, type_info->instance_size); - obj->s.type = type_info->self; - obj->s.magic = CAMEL_OBJECT_FINALIZED_VALUE; - - /* Tuck away the pointer for use in a new object */ - - type_info->free_instances = - g_list_prepend (type_info->free_instances, obj); - - camel_type_lock_down (); -} - -gboolean -camel_object_is_of_type (CamelObject * obj, CamelType ctype) -{ - return shared_is_of_type ((CamelObjectShared *) obj, ctype, TRUE); -} - -gboolean -camel_object_class_is_of_type (CamelObjectClass * class, CamelType ctype) -{ - return shared_is_of_type ((CamelObjectShared *) class, ctype, FALSE); -} - -#ifdef BAST_CASTARD -#define ERRVAL NULL -#else -#define ERRVAL obj -#endif - -CamelObject * -camel_object_check_cast (CamelObject * obj, CamelType ctype) -{ - if (shared_is_of_type ((CamelObjectShared *) obj, ctype, TRUE)) - return obj; - return ERRVAL; -} - -CamelObjectClass * -camel_object_class_check_cast (CamelObjectClass * class, CamelType ctype) -{ - if (shared_is_of_type ((CamelObjectShared *) class, ctype, FALSE)) - return class; - return ERRVAL; -} - -#undef ERRVAL - -gchar * -camel_object_describe (CamelObject * obj) -{ - if (obj == NULL) - return g_strdup ("a NULL pointer"); - - if (obj->s.magic == CAMEL_OBJECT_MAGIC_VALUE) { - return g_strdup_printf ("an instance of `%s' at %p", - camel_type_to_name (obj->s.type), - obj); - } else if (obj->s.magic == CAMEL_OBJECT_FINALIZED_VALUE) { - return g_strdup_printf ("a finalized instance of `%s' at %p", - camel_type_to_name (obj->s.type), - obj); - } else if (obj->s.magic == CAMEL_OBJECT_CLASS_MAGIC_VALUE) { - return g_strdup_printf ("the classfuncs of `%s' at %p", - camel_type_to_name (obj->s.type), - obj); - } else if (obj->s.magic == CAMEL_OBJECT_CLASS_FINALIZED_VALUE) { - return - g_strdup_printf - ("the finalized classfuncs of `%s' at %p", - camel_type_to_name (obj->s.type), obj); - } - - return g_strdup ("not a CamelObject"); -} - -/* This is likely to be called in the class_init callback, - * and the type will likely be somewhat uninitialized. - * Is this a problem? We'll see.... - */ -void -camel_object_class_declare_event (CamelObjectClass * class, - const gchar * name, - CamelObjectEventPrepFunc prep) -{ - g_return_if_fail (CAMEL_IS_OBJECT_CLASS (class)); - g_return_if_fail (name); - - if (class->event_to_preplist == NULL) - class->event_to_preplist = - g_hash_table_new (g_str_hash, g_str_equal); - else if (g_hash_table_lookup (class->event_to_preplist, name) != NULL) { - g_warning - ("camel_object_class_declare_event: event `%s' already declared for `%s'", - name, camel_type_to_name (class->s.type)); - return; - } - - /* AIEEEEEEEEEEEEEEEEEEEEEE - - * I feel so naughty. Since it's valid to declare an event and not - * provide a hook, it should be valid to insert a NULL value into - * the table. However, then our lookup in trigger_event would be - * ambiguous, not telling us whether the event is undefined or whether - * it merely has no hook. - * - * So we create an 'NULL prep' value that != NULL... specifically, it - * equals the address of one of our static functions , because that - * can't possibly be your hook. - * - * Just don't forget to check for the 'evil value' and it'll work, - * I promise. - */ - - if (prep == NULL) - prep = NULL_PREP_VALUE; - - g_hash_table_insert (class->event_to_preplist, g_strdup (name), prep); -} - -void -camel_object_hook_event (CamelObject * obj, const gchar * name, - CamelObjectEventHookFunc hook, gpointer user_data) -{ - GSList *hooklist; - CamelHookPair *pair; - - g_return_if_fail (CAMEL_IS_OBJECT (obj)); - g_return_if_fail (name); - g_return_if_fail (hook); - - if (obj->event_to_hooklist == NULL) - obj->event_to_hooklist = - g_hash_table_new (g_str_hash, g_str_equal); - - pair = g_new (CamelHookPair, 1); - pair->func = hook; - pair->user_data = user_data; - - hooklist = g_hash_table_lookup (obj->event_to_hooklist, name); - hooklist = g_slist_prepend (hooklist, pair); - g_hash_table_insert (obj->event_to_hooklist, g_strdup (name), - hooklist); -} - -void -camel_object_unhook_event (CamelObject * obj, const gchar * name, - CamelObjectEventHookFunc hook, gpointer user_data) -{ - GSList *hooklist; - GSList *head; - - g_return_if_fail (CAMEL_IS_OBJECT (obj)); - g_return_if_fail (name); - g_return_if_fail (hook); - - if (obj->event_to_hooklist == NULL) { - g_warning - ("camel_object_unhook_event: trying to unhook `%s' from an instance " - "of `%s' with no hooks attached", name, - camel_type_to_name (obj->s.type)); - return; - } - - hooklist = g_hash_table_lookup (obj->event_to_hooklist, name); - - if (hooklist == NULL) { - g_warning - ("camel_object_unhook_event: trying to unhook `%s' from an instance " - "of `%s' with no hooks attached to that event.", - name, camel_type_to_name (obj->s.type)); - return; - } - - head = hooklist; - - while (hooklist) { - CamelHookPair *pair = (CamelHookPair *) hooklist->data; - - if (pair->func == hook && pair->user_data == user_data) { - g_free (hooklist->data); - head = g_slist_remove_link (head, hooklist); - g_slist_free_1 (hooklist); - g_hash_table_insert (obj->event_to_hooklist, (char *) name, - head); - return; - } - - hooklist = hooklist->next; - } - - g_warning - ("camel_object_unhook_event: cannot find hook/data pair %p/%p in an " - "instance of `%s' attached to `%s'", hook, user_data, - camel_type_to_name (obj->s.type), name); -} - -void -camel_object_trigger_event (CamelObject * obj, const gchar * name, - gpointer event_data) -{ - GSList *hooklist; - CamelHookPair *pair; - CamelObjectEventPrepFunc prep; - - g_return_if_fail (CAMEL_IS_OBJECT (obj)); - g_return_if_fail (name); - - if (obj->in_event) { - g_warning - ("camel_object_trigger_event: trying to trigger `%s' in class " - "`%s' while already triggering another event", name, - camel_type_to_name (obj->s.type)); - return; - } - - if (obj->classfuncs->event_to_preplist == NULL) { - g_warning - ("camel_object_trigger_event: trying to trigger `%s' in class " - "`%s' with no defined events.", name, - camel_type_to_name (obj->s.type)); - return; - } - - prep = g_hash_table_lookup (obj->classfuncs->event_to_preplist, name); - - if (prep == NULL) { - g_warning - ("camel_object_trigger_event: trying to trigger undefined " - "event `%s' in class `%s'.", name, - camel_type_to_name (obj->s.type)); - return; - } - - /* Ref so that it can't get destroyed in the event, which would - * be Bad. And it's a valid ref anyway... - */ - - camel_object_ref (obj); - obj->in_event = 1; - - if ((prep != NULL_PREP_VALUE && !prep (obj, event_data)) - || obj->event_to_hooklist == NULL) { - obj->in_event = 0; - camel_object_unref (obj); - return; - } - - hooklist = g_hash_table_lookup (obj->event_to_hooklist, name); - - while (hooklist && hooklist->data) { - pair = hooklist->data; - (pair->func) (obj, event_data, pair->user_data); - hooklist = hooklist->next; - } - - obj->in_event = 0; - camel_object_unref (obj); -} - -/* ** Static helpers ****************************************************** */ - -static gboolean -shared_is_of_type (CamelObjectShared * sh, CamelType ctype, gboolean is_obj) -{ - CamelTypeInfo *type_info; - gchar *targtype; - - if (is_obj) - targtype = "instance"; - else - targtype = "classdata"; - - if (ctype == CAMEL_INVALID_TYPE) { - g_warning - ("shared_is_of_type: trying to cast to CAMEL_INVALID_TYPE"); - return FALSE; - } - - if (sh == NULL) { - g_warning - ("shared_is_of_type: trying to cast NULL to %s of `%s'", - targtype, camel_type_to_name (ctype)); - return FALSE; - } - - if (sh->magic == CAMEL_OBJECT_FINALIZED_VALUE) { - g_warning - ("shared_is_of_type: trying to cast finalized instance " - "of `%s' into %s of `%s'", - camel_type_to_name (sh->type), targtype, - camel_type_to_name (ctype)); - return FALSE; - } - - if (sh->magic == CAMEL_OBJECT_CLASS_FINALIZED_VALUE) { - g_warning - ("shared_is_of_type: trying to cast finalized classdata " - "of `%s' into %s of `%s'", - camel_type_to_name (sh->type), targtype, - camel_type_to_name (ctype)); - return FALSE; - } - - if (is_obj) { - if (sh->magic == CAMEL_OBJECT_CLASS_MAGIC_VALUE) { - g_warning - ("shared_is_of_type: trying to cast classdata " - "of `%s' into instance of `%s'", - camel_type_to_name (sh->type), - camel_type_to_name (ctype)); - return FALSE; - } - - if (sh->magic != CAMEL_OBJECT_MAGIC_VALUE) { - g_warning - ("shared_is_of_type: trying to cast junk data " - "into instance of `%s'", - camel_type_to_name (ctype)); - return FALSE; - } - } else { - if (sh->magic == CAMEL_OBJECT_MAGIC_VALUE) { - g_warning - ("shared_is_of_type: trying to cast instance " - "of `%s' into classdata of `%s'", - camel_type_to_name (sh->type), - camel_type_to_name (ctype)); - return FALSE; - } - - if (sh->magic != CAMEL_OBJECT_CLASS_MAGIC_VALUE) { - g_warning - ("shared_is_of_type: trying to cast junk data " - "into classdata of `%s'", - camel_type_to_name (ctype)); - return FALSE; - } - } - - camel_type_lock_up (); - - type_info = - g_hash_table_lookup (ctype_to_typeinfo, - GINT_TO_POINTER (sh->type)); - - if (type_info == NULL) { - g_warning ("shared_is_of_type: seemingly valid %s has " - "bad type %d.", targtype, sh->type); - camel_type_lock_down (); - return FALSE; - } - - while (type_info) { - if (type_info->self == ctype) { - camel_type_lock_down (); - return TRUE; - } - - type_info = - g_hash_table_lookup (ctype_to_typeinfo, - GINT_TO_POINTER (type_info-> - parent)); - } - - /* this isn't an error, e.g. CAMEL_IS_FOLDER(folder), its upto the - caller to handle the false case */ - /*g_warning - ("shared_is_of_type: %s of `%s' (@%p) is not also %s of `%s'", - targtype, camel_type_to_name (sh->type), sh, targtype, - camel_type_to_name (ctype));*/ - - camel_type_lock_down (); - return FALSE; -} - -static void -make_global_classfuncs (CamelTypeInfo * type_info) -{ - CamelObjectClass *funcs; - GSList *parents; - GSList *head; - - g_assert (type_info); - - funcs = g_malloc0 (type_info->classfuncs_size); - funcs->s.type = type_info->self; - - type_info->global_classfuncs = funcs; - - parents = NULL; - while (type_info) { - parents = g_slist_prepend (parents, type_info); - type_info = - g_hash_table_lookup (ctype_to_typeinfo, - GINT_TO_POINTER (type_info-> - parent)); - } - - head = parents; - - for (; parents && parents->data; parents = parents->next) { - CamelTypeInfo *thisinfo; - - thisinfo = parents->data; - if (thisinfo->class_init) - (thisinfo->class_init) (funcs); - } - - g_slist_free (head); -} diff --git a/camel/camel-object.h b/camel/camel-object.h deleted file mode 100644 index 1308e075d5..0000000000 --- a/camel/camel-object.h +++ /dev/null @@ -1,147 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-object.h: Base class for Camel */ - -/* - * Author: - * Dan Winship <danw@helixcode.com> - * - * Copyright 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef CAMEL_OBJECT_H -#define CAMEL_OBJECT_H 1 - -#ifdef __cplusplus -extern "C" -{ -#pragma } -#endif /* __cplusplus } */ - -#include <stdlib.h> /* size_t */ -#include <camel/camel-types.h> -#include <glib.h> -#include <libgnome/gnome-defs.h> -#include <libgnome/gnome-i18n.h> - -#ifdef G_DISABLE_CHECKS -#define CAMEL_CHECK_CAST( obj, ctype, ptype ) ((ptype *) obj) -#define CAMEL_CHECK_CLASS_CAST( class, ctype, ptype ) ((ptype *) class) -#define CAMEL_CHECK_TYPE( obj, ctype ) (TRUE) -#define CAMEL_CHECK_CLASS_TYPE( class, ctype ) (TRUE) -#else -#define CAMEL_CHECK_CAST( obj, ctype, ptype ) ((ptype *) camel_object_check_cast( (CamelObject *)(obj), (CamelType)(ctype) )) -#define CAMEL_CHECK_CLASS_CAST( class, ctype, ptype ) ((ptype *) camel_object_class_check_cast( (CamelObjectClass *)(class), (CamelType)(ctype) )) -#define CAMEL_CHECK_TYPE( obj, ctype ) (camel_object_is_of_type( (CamelObject *)(obj), (CamelType)(ctype) )) -#define CAMEL_CHECK_CLASS_TYPE( class, ctype ) (camel_object_class_is_of_type( (CamelObjectClass *)(class), (CamelType)(ctype) )) -#endif - -#define CAMEL_INVALID_TYPE ((CamelType)0) - -#define CAMEL_OBJECT_TYPE (camel_object_get_type ()) - -#define CAMEL_OBJECT(obj) (CAMEL_CHECK_CAST((obj), CAMEL_OBJECT_TYPE, CamelObject)) -#define CAMEL_OBJECT_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_OBJECT_TYPE, CamelObjectClass)) -#define CAMEL_IS_OBJECT(o) (CAMEL_CHECK_TYPE((o), CAMEL_OBJECT_TYPE)) -#define CAMEL_IS_OBJECT_CLASS(k) (CAMEL_CHECK_CLASS_TYPE((k), CAMEL_OBJECT_TYPE)) - -#define CAMEL_OBJECT_GET_CLASS(o) ((CamelObjectClass *)(CAMEL_OBJECT(o))->classfuncs) -#define CAMEL_OBJECT_GET_TYPE(o) ((CamelType)(CAMEL_OBJECT(o))->s.type) - - typedef guint32 CamelType; - - typedef struct _CamelObjectShared - { - guint32 magic; - CamelType type; - } - CamelObjectShared; - - typedef struct _CamelObjectClass - { - CamelObjectShared s; - - GHashTable *event_to_preplist; - } - CamelObjectClass; - - typedef struct _CamelObject - { - CamelObjectShared s; - guint32 ref_count:31; - guint32 in_event:1; - CamelObjectClass *classfuncs; - GHashTable *event_to_hooklist; - } - CamelObject; - - typedef void (*CamelObjectClassInitFunc) (CamelObjectClass *); - typedef void (*CamelObjectClassFinalizeFunc) (CamelObjectClass *); - typedef void (*CamelObjectInitFunc) (CamelObject *); - typedef void (*CamelObjectFinalizeFunc) (CamelObject *); - - typedef gboolean (*CamelObjectEventPrepFunc) (CamelObject *, - gpointer); - typedef void (*CamelObjectEventHookFunc) (CamelObject *, gpointer, - gpointer); - -/* The type system .... it's pretty simple..... */ - - void camel_type_init (void); - CamelType camel_type_register (CamelType parent, const gchar * name, - size_t instance_size, - size_t classfuncs_size, - CamelObjectClassInitFunc class_init, - CamelObjectClassFinalizeFunc - class_finalize, - CamelObjectInitFunc instance_init, - CamelObjectFinalizeFunc - instance_finalize); - CamelObjectClass *camel_type_get_global_classfuncs (CamelType type); - const gchar *camel_type_to_name (CamelType type); - - CamelType camel_object_get_type (void); - CamelObject *camel_object_new (CamelType type); - void camel_object_ref (CamelObject * obj); - void camel_object_unref (CamelObject * obj); - CamelObject *camel_object_check_cast (CamelObject * obj, - CamelType ctype); - CamelObjectClass *camel_object_class_check_cast (CamelObjectClass * - class, - CamelType ctype); - gboolean camel_object_is_of_type (CamelObject * obj, CamelType ctype); - gboolean camel_object_class_is_of_type (CamelObjectClass * class, - CamelType ctype); - gchar *camel_object_describe (CamelObject * obj); - void camel_object_class_declare_event (CamelObjectClass * class, - const gchar * name, - CamelObjectEventPrepFunc prep); - void camel_object_hook_event (CamelObject * obj, const gchar * name, - CamelObjectEventHookFunc hook, - gpointer user_data); - void camel_object_unhook_event (CamelObject * obj, const gchar * name, - CamelObjectEventHookFunc hook, - gpointer user_data); - void camel_object_trigger_event (CamelObject * obj, - const gchar * name, - gpointer event_data); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_OBJECT_H */ diff --git a/camel/camel-provider.c b/camel/camel-provider.c deleted file mode 100644 index 03be7cdf1e..0000000000 --- a/camel/camel-provider.c +++ /dev/null @@ -1,148 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-provider.c: provider framework */ - -/* - * - * Authors: - * Bertrand Guiheneuf <bertrand@helixcode.com> - * Dan Winship <danw@helixcode.com> - * Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -/* FIXME: Shouldn't we add a version number to providers ? */ - -#include "config.h" -#include "camel-provider.h" -#include "camel-exception.h" -#include "hash-table-utils.h" - -#include <dirent.h> -#include <errno.h> -#include <stdio.h> -#include <string.h> - -#include <gmodule.h> - -/** - * camel_provider_init: - * - * Initialize the Camel provider system by reading in the .urls - * files in the provider directory and creating a hash table mapping - * URLs to module names. - * - * A .urls file has the same initial prefix as the shared library it - * correspond to, and consists of a series of lines containing the URL - * protocols that that library handles. - * - * Return value: a hash table mapping URLs to module names - **/ -GHashTable * -camel_provider_init (void) -{ - GHashTable *providers; - DIR *dir; - struct dirent *d; - char *p, *name, buf[80]; - FILE *f; - - providers = g_hash_table_new (g_strcase_hash, g_strcase_equal); - - dir = opendir (CAMEL_PROVIDERDIR); - if (!dir) { - g_error ("Could not open camel provider directory: %s", - g_strerror (errno)); - return NULL; - } - - while ((d = readdir (dir))) { - p = strchr (d->d_name, '.'); - if (!p || strcmp (p, ".urls") != 0) - continue; - - name = g_strdup_printf ("%s/%s", CAMEL_PROVIDERDIR, d->d_name); - f = fopen (name, "r"); - if (!f) { - g_warning ("Could not read provider info file %s: %s", - name, g_strerror (errno)); - g_free (name); - continue; - } - - p = strrchr (name, '.'); - strcpy (p, ".so"); - while ((fgets (buf, sizeof (buf), f))) { - buf[sizeof (buf) - 1] = '\0'; - p = strchr (buf, '\n'); - if (p) - *p = '\0'; - - g_hash_table_insert (providers, g_strdup (buf), name); - } - fclose (f); - } - - closedir (dir); - return providers; -} - -/** - * camel_provider_load: - * @session: the current session - * @path: the path to a shared library - * @ex: a CamelException - * - * Loads the provider at @path, and calls its initialization function, - * passing @session as an argument. The provider should then register - * itself with @session. - **/ -void -camel_provider_load (CamelSession *session, const char *path, CamelException *ex) -{ - GModule *module; - CamelProvider *(*camel_provider_module_init) (); - - if (!g_module_supported ()) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "Could not load %s: Module loading " - "not supported on this system.", - path); - return; - } - - module = g_module_open (path, 0); - if (!module) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not load %s: %s"), - path, g_module_error ()); - return; - } - - if (!g_module_symbol (module, "camel_provider_module_init", - (gpointer *)&camel_provider_module_init)) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not load %s: No initialization " - "code in module."), path); - g_module_close (module); - return; - } - - camel_provider_module_init (session); -} diff --git a/camel/camel-provider.h b/camel/camel-provider.h deleted file mode 100644 index f5a434cde5..0000000000 --- a/camel/camel-provider.h +++ /dev/null @@ -1,119 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-provider.h : provider definition */ - -/* - * - * Authors: - * Bertrand Guiheneuf <bertrand@helixcode.com> - * Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_PROVIDER_H -#define CAMEL_PROVIDER_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-types.h> -#include <camel/camel-object.h> - -#define CAMEL_PROVIDER(obj) ((CamelProvider *)(obj)) - -typedef enum { - CAMEL_PROVIDER_STORE, - CAMEL_PROVIDER_TRANSPORT, - CAMEL_NUM_PROVIDER_TYPES -} CamelProviderType; - -extern char *camel_provider_type_name[CAMEL_NUM_PROVIDER_TYPES]; - -/* _IS_SOURCE means the user can get mail from there. - * _IS_STORAGE means the user can read mail from there. - */ -#define CAMEL_PROVIDER_IS_REMOTE (1 << 0) -#define CAMEL_PROVIDER_IS_SOURCE (1 << 1) -#define CAMEL_PROVIDER_IS_STORAGE (1 << 2) - - -/* Flags for url_flags. "ALLOW" means the config dialog will let - * the user configure it. "NEED" implies "ALLOW" but means the user - * must configure it. Service code can assume that any url part - * for which it has set the NEED flag will be set when the service - * is created. - */ -#define CAMEL_URL_ALLOW_USER (1 << 0) -#define CAMEL_URL_ALLOW_AUTH (1 << 1) -#define CAMEL_URL_ALLOW_PASSWORD (1 << 2) -#define CAMEL_URL_ALLOW_HOST (1 << 3) -#define CAMEL_URL_ALLOW_PORT (1 << 4) -#define CAMEL_URL_ALLOW_PATH (1 << 5) - -#define CAMEL_URL_NEED_USER (1 << 6 | 1 << 0) -#define CAMEL_URL_NEED_AUTH (1 << 7 | 1 << 1) -#define CAMEL_URL_NEED_PASSWORD (1 << 8 | 1 << 2) -#define CAMEL_URL_NEED_HOST (1 << 9 | 1 << 3) -#define CAMEL_URL_NEED_PORT (1 << 10 | 1 << 4) -#define CAMEL_URL_NEED_PATH (1 << 11 | 1 << 5) - - -typedef struct { - /* Provider name used in CamelURLs. */ - char *protocol; - - /* Provider name as used by people. (May be the same as protocol) */ - char *name; - - /* Description of the provider. A novice user should be able - * to read this description, and the information provided by - * an ISP, IS department, etc, and determine whether or not - * this provider is relevant to him, and if so, which - * information goes with it. - */ - char *description; - - /* The category of message that this provider works with. - * (evolution-mail will only list a provider in the store/transport - * config dialogs if its domain is "mail".) - */ - char *domain; - - int flags, url_flags; - - CamelType object_types [CAMEL_NUM_PROVIDER_TYPES]; - - GHashTable *service_cache; - -} CamelProvider; - -GHashTable *camel_provider_init (void); -void camel_provider_load (CamelSession *session, const char *path, CamelException *ex); - -/* This is defined by each module, not by camel-provider.c. */ -void camel_provider_module_init (CamelSession *session); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_PROVIDER_H */ diff --git a/camel/camel-remote-store.c b/camel/camel-remote-store.c deleted file mode 100644 index eeca0d4080..0000000000 --- a/camel/camel-remote-store.c +++ /dev/null @@ -1,491 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-remote-store.c : class for an remote store */ - -/* - * Authors: Peter Williams <peterw@helixcode.com> - * based on camel-imap-provider.c - * - * Copyright 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#include <config.h> - -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> - -#include <gal/util/e-util.h> - -#include "camel-remote-store.h" -#include "camel-folder.h" -#include "camel-exception.h" -#include "camel-session.h" -#include "camel-stream.h" -#include "camel-stream-buffer.h" -#include "camel-stream-fs.h" -#include "camel-url.h" -#include "string-utils.h" - -#define d(x) x -#if d(!)0 -extern gboolean camel_verbose_debug; -#endif - -#define CSRVC(obj) (CAMEL_SERVICE_CLASS (CAMEL_OBJECT_GET_CLASS (obj))) -#define CSTRC(obj) (CAMEL_STORE_CLASS (CAMEL_OBJECT_GET_CLASS (obj))) -#define CRSC(obj) (CAMEL_REMOTE_STORE_CLASS (CAMEL_OBJECT_GET_CLASS (obj))) - -static CamelStoreClass *store_class = NULL; - -static gboolean remote_connect (CamelService *service, CamelException *ex); -static gboolean remote_disconnect (CamelService *service, gboolean clean, CamelException *ex); -static GList *remote_query_auth_types_generic (CamelService *service, CamelException *ex); -static GList *remote_query_auth_types_connected (CamelService *service, CamelException *ex); -static void remote_free_auth_types (CamelService *service, GList *authtypes); -static char *remote_get_name (CamelService *service, gboolean brief); -static char *remote_get_folder_name (CamelStore *store, - const char *folder_name, - CamelException *ex); -static gint remote_send_string (CamelRemoteStore *store, CamelException *ex, - char *fmt, va_list ap); -static gint remote_send_stream (CamelRemoteStore *store, CamelStream *stream, - CamelException *ex); -static gint remote_recv_line (CamelRemoteStore *store, char **dest, - CamelException *ex); - -static void -camel_remote_store_class_init (CamelRemoteStoreClass *camel_remote_store_class) -{ - /* virtual method overload */ - CamelServiceClass *camel_service_class = - CAMEL_SERVICE_CLASS (camel_remote_store_class); - CamelStoreClass *camel_store_class = - CAMEL_STORE_CLASS (camel_remote_store_class); - - store_class = CAMEL_STORE_CLASS (camel_type_get_global_classfuncs (camel_store_get_type ())); - - /* virtual method overload */ - camel_service_class->connect = remote_connect; - camel_service_class->disconnect = remote_disconnect; - camel_service_class->query_auth_types_generic = remote_query_auth_types_generic; - camel_service_class->query_auth_types_connected = remote_query_auth_types_connected; - camel_service_class->free_auth_types = remote_free_auth_types; - camel_service_class->get_name = remote_get_name; - - camel_store_class->get_folder_name = remote_get_folder_name; - - camel_remote_store_class->send_string = remote_send_string; - camel_remote_store_class->send_stream = remote_send_stream; - camel_remote_store_class->recv_line = remote_recv_line; - camel_remote_store_class->keepalive = NULL; -} - -static void -camel_remote_store_init (CamelObject *object) -{ - CamelStore *store = CAMEL_STORE (object); - CamelRemoteStore *remote_store = CAMEL_REMOTE_STORE (object); - - store->folders = g_hash_table_new (g_str_hash, g_str_equal); - - remote_store->istream = NULL; - remote_store->ostream = NULL; - remote_store->timeout_id = 0; -} - -/* - *static void - *camel_remote_store_finalize (CamelObject *object) - *{ - * CamelRemoteStore *remote_store = CAMEL_REMOTE_STORE (object); - * - * g_free (remote_store->nice_name); - *} - */ - -CamelType -camel_remote_store_get_type (void) -{ - static CamelType camel_remote_store_type = CAMEL_INVALID_TYPE; - - if (camel_remote_store_type == CAMEL_INVALID_TYPE) { - camel_remote_store_type = - camel_type_register (CAMEL_STORE_TYPE, "CamelRemoteStore", - sizeof (CamelRemoteStore), - sizeof (CamelRemoteStoreClass), - (CamelObjectClassInitFunc) camel_remote_store_class_init, - NULL, - (CamelObjectInitFunc) camel_remote_store_init, - (CamelObjectFinalizeFunc) NULL); - } - - return camel_remote_store_type; -} - -/* Auth stuff */ - -/* -static CamelServiceAuthType password_authtype = { - N_("SSH Tunneling"), - - N_("This option will connect to the server using a " - "SSH tunnel."), - - "", - TRUE -}; -*/ - -static GList * -remote_query_auth_types_connected (CamelService *service, CamelException *ex) -{ - return NULL; -} - -static GList * -remote_query_auth_types_generic (CamelService *service, CamelException *ex) -{ - return NULL; -} - -static void -remote_free_auth_types (CamelService *service, GList *authtypes) -{ - g_list_free (authtypes); -} - -static char * -remote_get_name (CamelService *service, gboolean brief) -{ - if (brief) - return g_strdup_printf (_("%s server %s"), - service->provider->name, - service->url->host); - else { - return g_strdup_printf (_("%s service for %s on %s"), - service->provider->name, - service->url->user, - service->url->host); - } -} - -static gboolean -timeout_cb (gpointer data) -{ - CRSC (data)->keepalive (CAMEL_REMOTE_STORE (data)); - return TRUE; -} - -static gboolean -remote_connect (CamelService *service, CamelException *ex) -{ - CamelRemoteStore *store = CAMEL_REMOTE_STORE (service); - struct hostent *h; - struct sockaddr_in sin; - gint fd; - gint port; - - h = camel_service_gethost (service, ex); - if (!h) - return FALSE; - - /* connect to the server */ - sin.sin_family = h->h_addrtype; - - if (service->url->port) - port = service->url->port; - else - port = store->default_port; - sin.sin_port = htons (port); - - memcpy (&sin.sin_addr, h->h_addr, sizeof (sin.sin_addr)); - - fd = socket (h->h_addrtype, SOCK_STREAM, 0); - if (fd == -1 || connect (fd, (struct sockaddr *)&sin, sizeof (sin)) == -1) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - _("Could not connect to %s (port %d): %s"), - service->url->host ? service->url->host : _("(unknown host)"), - port, g_strerror (errno)); - if (fd > -1) - close (fd); - - return FALSE; - } - - /* parent class connect initialization */ - if (CAMEL_SERVICE_CLASS (store_class)->connect (service, ex) == FALSE) - return FALSE; - - store->ostream = camel_stream_fs_new_with_fd (fd); - store->istream = camel_stream_buffer_new (store->ostream, CAMEL_STREAM_BUFFER_READ); - - /* Okay, good enough for us */ - CAMEL_SERVICE (store)->connected = TRUE; - - /* Add a timeout so that we can hopefully prevent getting disconnected */ - /* (Only if the implementation supports it) */ - if (CRSC (store)->keepalive) { - CamelSession *session = camel_service_get_session (CAMEL_SERVICE (store)); - - store->timeout_id = camel_session_register_timeout (session, 10 * 60 * 1000, - timeout_cb, - store); - } - - return TRUE; -} - -static gboolean -remote_disconnect (CamelService *service, gboolean clean, CamelException *ex) -{ - CamelRemoteStore *store = CAMEL_REMOTE_STORE (service); - - if (store->timeout_id) { - camel_session_remove_timeout (camel_service_get_session (CAMEL_SERVICE (store)), - store->timeout_id); - store->timeout_id = 0; - } - - if (!CAMEL_SERVICE_CLASS (store_class)->disconnect (service, clean, ex)) - return FALSE; - - if (store->istream) { - camel_object_unref (CAMEL_OBJECT (store->istream)); - store->istream = NULL; - } - - if (store->ostream) { - camel_object_unref (CAMEL_OBJECT (store->ostream)); - store->ostream = NULL; - } - - return TRUE; -} - -static gchar * -remote_get_folder_name (CamelStore *store, const char *folder_name, CamelException *ex) -{ - return g_strdup (folder_name); -} - -static gint -remote_send_string (CamelRemoteStore *store, CamelException *ex, char *fmt, va_list ap) -{ - gchar *cmdbuf; - - /* Check for connectedness. Failed (or cancelled) operations will - * close the connection. */ - - if (store->ostream == NULL) { - d(g_message ("remote: (send) disconnected, reconnecting.")); - - if (!camel_service_connect (CAMEL_SERVICE (store), ex)) - return -1; - } - - /* create the command */ - cmdbuf = g_strdup_vprintf (fmt, ap); - -#if d(!)0 - if (camel_verbose_debug) { - if (strncmp (cmdbuf, "PASS ", 5) == 0) - fprintf (stderr, "sending : PASS xxxx\n"); - else if (strstr (cmdbuf, "LOGIN \"")) - fprintf (stderr, "sending : ---- LOGIN \"xxxx\" \"xxxx\"\n"); - else - fprintf (stderr, "sending : %s", cmdbuf); - } -#endif - - if (camel_stream_printf (store->ostream, "%s", cmdbuf) == -1) { - g_free (cmdbuf); - camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - g_strerror (errno)); - - camel_service_disconnect (CAMEL_SERVICE (store), FALSE, NULL); - return -1; - } - g_free (cmdbuf); - - return 0; -} - -/** - * camel_remote_store_send_string: Writes a string to the server - * @store: a CamelRemoteStore - * @ex: a CamelException - * @fmt: the printf-style format to use for creating the string to send - * @...: the arguments to the printf string @fmt - * Return value: 0 on success, nonzero on error - * - * Formats the string and sends it to the server. - **/ - -gint -camel_remote_store_send_string (CamelRemoteStore *store, CamelException *ex, - char *fmt, ...) -{ - va_list ap; - gint ret; - - g_return_val_if_fail (CAMEL_IS_REMOTE_STORE (store), -1); - g_return_val_if_fail (fmt, -1); - - va_start (ap, fmt); - ret = CRSC (store)->send_string (store, ex, fmt, ap); - va_end (ap); - - return ret; -} - -static gint -remote_send_stream (CamelRemoteStore *store, CamelStream *stream, CamelException *ex) -{ - /* Check for connectedness. Failed (or cancelled) operations will - * close the connection. */ - - if (store->ostream == NULL) { - d(g_message ("remote: (sendstream) disconnected, reconnecting.")); - - if (!camel_service_connect (CAMEL_SERVICE (store), ex)) - return -1; - } - - d(fprintf (stderr, "(sending stream)\n")); - - if (camel_stream_write_to_stream (stream, store->ostream) < 0) { - camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - g_strerror (errno)); - - camel_service_disconnect (CAMEL_SERVICE (store), FALSE, NULL); - return -1; - } - - return 0; -} - -/** - * camel_remote_store_send_stream: Writes a CamelStream to the server - * @store: a CamelRemoteStore - * @stream: the stream to write - * @ex: a CamelException - * Return value: 0 on success, nonzero on error - * - * Sends the stream to the server. - **/ - -gint -camel_remote_store_send_stream (CamelRemoteStore *store, CamelStream *stream, CamelException *ex) -{ - g_return_val_if_fail (CAMEL_IS_REMOTE_STORE (store), -1); - g_return_val_if_fail (CAMEL_IS_STREAM (stream), -1); - - return CRSC (store)->send_stream (store, stream, ex); -} - -static gint -remote_recv_line (CamelRemoteStore *store, char **dest, CamelException *ex) -{ - CamelStreamBuffer *stream = CAMEL_STREAM_BUFFER (store->istream); - - *dest = NULL; - - /* Check for connectedness. Failed (or cancelled) operations will - * close the connection. We can't expect a read to have any - * meaning if we reconnect, so always set an exception. - */ - - if (store->istream == NULL) { - g_message ("remote: (recv) disconnected, reconnecting."); - - camel_service_connect (CAMEL_SERVICE (store), ex); - - if (!camel_exception_is_set (ex)) - camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_NOT_CONNECTED, - g_strerror (errno)); - - return -1; - } - - *dest = camel_stream_buffer_read_line (stream); - - if (!*dest) { - camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - g_strerror (errno)); - - camel_service_disconnect (CAMEL_SERVICE (store), FALSE, NULL); - return -1; - } - -#if d(!)0 - if (camel_verbose_debug) - fprintf (stderr, "received: %s\n", *dest); -#endif - - return 0; -} - -/** - * camel_remote_store_recv_line: Reads a line from the server - * @store: a CamelRemoteStore - * @dest: a pointer that will be set to the location of a buffer - * holding the server's response - * @ex: a CamelException - * Return value: 0 on success, -1 on error - * - * Reads a line from the server (terminated by \n or \r\n). - **/ - -gint -camel_remote_store_recv_line (CamelRemoteStore *store, char **dest, - CamelException *ex) -{ - g_return_val_if_fail (CAMEL_IS_REMOTE_STORE (store), -1); - g_return_val_if_fail (dest, -1); - - return CRSC (store)->recv_line (store, dest, ex); -} - -static void -refresh_folder_info (gpointer key, gpointer value, gpointer data) -{ - CamelFolder *folder = CAMEL_FOLDER (value); - - camel_folder_refresh_info (folder, (CamelException *) data); -} - -/** - * camel_remote_store_refresh_folders: Refresh the folders that I - * contain - * @store: a CamelRemoteStore - * @ex: a CamelException - * - * Refreshes the folders listed in the folders hashtable. - **/ - -void -camel_remote_store_refresh_folders (CamelRemoteStore *store, CamelException *ex) -{ - g_hash_table_foreach (CAMEL_STORE (store)->folders, refresh_folder_info, ex); -} diff --git a/camel/camel-remote-store.h b/camel/camel-remote-store.h deleted file mode 100644 index 2d6bc829c2..0000000000 --- a/camel/camel-remote-store.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-remote-store.h : class for a remote store */ - -/* - * Authors: Peter Williams <peterw@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef CAMEL_REMOTE_STORE_H -#define CAMEL_REMOTE_STORE_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include "camel-store.h" - -#define CAMEL_REMOTE_STORE_TYPE (camel_remote_store_get_type ()) -#define CAMEL_REMOTE_STORE(obj) (CAMEL_CHECK_CAST((obj), CAMEL_REMOTE_STORE_TYPE, CamelRemoteStore)) -#define CAMEL_REMOTE_STORE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_REMOTE_STORE_TYPE, CamelRemoteStoreClass)) -#define CAMEL_IS_REMOTE_STORE(o) (CAMEL_CHECK_TYPE((o), CAMEL_REMOTE_STORE_TYPE)) - -typedef struct { - CamelStore parent_object; - - CamelStream *istream, *ostream; - guint timeout_id, default_port; -} CamelRemoteStore; - - -typedef struct { - CamelStoreClass parent_class; - - gint (*send_string) (CamelRemoteStore *store, CamelException *ex, - char *fmt, va_list ap); - gint (*send_stream) (CamelRemoteStore *store, CamelStream *stream, - CamelException *ex); - gint (*recv_line) (CamelRemoteStore *store, char **dest, - CamelException *ex); - void (*keepalive) (CamelRemoteStore *store); -} CamelRemoteStoreClass; - - -/* Standard Camel function */ -CamelType camel_remote_store_get_type (void); - -/* Extra public functions */ -gint camel_remote_store_send_string (CamelRemoteStore *store, CamelException *ex, - char *fmt, ...); -gint camel_remote_store_send_stream (CamelRemoteStore *store, CamelStream *stream, - CamelException *ex); -gint camel_remote_store_recv_line (CamelRemoteStore *store, char **dest, - CamelException *ex); -void camel_remote_store_refresh_folders (CamelRemoteStore *store, - CamelException *ex); -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_REMOTE_STORE_H */ diff --git a/camel/camel-seekable-stream.c b/camel/camel-seekable-stream.c deleted file mode 100644 index c4ca950baa..0000000000 --- a/camel/camel-seekable-stream.c +++ /dev/null @@ -1,201 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * Author: - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#include <config.h> -#include "camel-seekable-stream.h" - -static CamelStreamClass *parent_class = NULL; - -/* Returns the class for a CamelSeekableStream */ -#define CSS_CLASS(so) CAMEL_SEEKABLE_STREAM_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - -static off_t seek (CamelSeekableStream *stream, off_t offset, - CamelStreamSeekPolicy policy); -static off_t stream_tell (CamelSeekableStream *stream); -static int reset (CamelStream *stream); -static int set_bounds (CamelSeekableStream *stream, off_t start, off_t end); - -static void -camel_seekable_stream_class_init (CamelSeekableStreamClass *camel_seekable_stream_class) -{ - CamelStreamClass *camel_stream_class = - CAMEL_STREAM_CLASS (camel_seekable_stream_class); - - parent_class = CAMEL_STREAM_CLASS( camel_type_get_global_classfuncs( CAMEL_STREAM_TYPE ) ); - - /* seekable stream methods */ - camel_seekable_stream_class->seek = seek; - camel_seekable_stream_class->tell = stream_tell; - camel_seekable_stream_class->set_bounds = set_bounds; - - /* camel stream methods overload */ - camel_stream_class->reset = reset; -} - -static void -camel_seekable_stream_init (void *o) -{ - CamelSeekableStream *stream = (CamelSeekableStream *)o; - - stream->bound_start = 0; - stream->bound_end = CAMEL_STREAM_UNBOUND; -} - -CamelType -camel_seekable_stream_get_type (void) -{ - static CamelType camel_seekable_stream_type = CAMEL_INVALID_TYPE; - - if (camel_seekable_stream_type == CAMEL_INVALID_TYPE) { - camel_seekable_stream_type = camel_type_register( CAMEL_STREAM_TYPE, - "CamelSeekableStream", - sizeof( CamelSeekableStream ), - sizeof( CamelSeekableStreamClass ), - (CamelObjectClassInitFunc) camel_seekable_stream_class_init, - NULL, - (CamelObjectInitFunc) camel_seekable_stream_init, - NULL ); - } - - return camel_seekable_stream_type; -} - - -static off_t -seek (CamelSeekableStream *stream, off_t offset, - CamelStreamSeekPolicy policy) -{ - g_warning ("CamelSeekableStream::seek called on default " - "implementation\n"); - return -1; -} - -/** - * camel_stream_seek: - * @stream: a CamelStream object. - * @offset: offset value - * @policy: what to do with the offset - * - * Seek to the specified position in @stream. - * - * If @policy is CAMEL_STREAM_SET, seeks to @offset. - * - * If @policy is CAMEL_STREAM_CUR, seeks to the current position plus - * @offset. - * - * If @policy is CAMEL_STREAM_END, seeks to the end of the stream plus - * @offset. - * - * Regardless of @policy, the stream's final position will be clamped - * to the range specified by its lower and upper bounds, and the - * stream's eos state will be updated. - * - * Return value: new position, -1 if operation failed. - **/ -off_t -camel_seekable_stream_seek (CamelSeekableStream *stream, off_t offset, - CamelStreamSeekPolicy policy) -{ - g_return_val_if_fail (CAMEL_IS_SEEKABLE_STREAM (stream), -1); - - return CSS_CLASS (stream)->seek (stream, offset, policy); -} - - -static off_t -stream_tell (CamelSeekableStream *stream) -{ - return stream->position; -} - -/** - * camel_seekable_stream_tell: - * @stream: seekable stream object - * - * Get the current position of a seekable stream. - * - * Return value: the position. - **/ -off_t -camel_seekable_stream_tell (CamelSeekableStream *stream) -{ - g_return_val_if_fail (CAMEL_IS_SEEKABLE_STREAM (stream), -1); - - return CSS_CLASS (stream)->tell (stream); -} - -static int -set_bounds (CamelSeekableStream *stream, off_t start, off_t end) -{ - /* store the bounds */ - stream->bound_start = start; - stream->bound_end = end; - - if (start > stream->position) - return camel_seekable_stream_seek (stream, start, CAMEL_STREAM_SET); - - return 0; -} - -/** - * camel_seekable_stream_set_bounds: - * @stream: a seekable stream - * @start: the first valid position - * @end: the first invalid position, or CAMEL_STREAM_UNBOUND - * - * Set the range of valid data this stream is allowed to cover. If - * there is to be no @end value, then @end should be set to - * #CAMEL_STREAM_UNBOUND. - * - * Return value: -1 on error. - **/ -int -camel_seekable_stream_set_bounds (CamelSeekableStream *stream, - off_t start, off_t end) -{ - g_return_val_if_fail (CAMEL_IS_SEEKABLE_STREAM (stream), -1); - g_return_val_if_fail (end == CAMEL_STREAM_UNBOUND || end >= start, -1); - - return CSS_CLASS (stream)->set_bounds (stream, start, end); -} - -/* a default implementation of reset for seekable streams */ -static int -reset (CamelStream *stream) -{ - CamelSeekableStream *seekable_stream; - - seekable_stream = CAMEL_SEEKABLE_STREAM (stream); - - return camel_seekable_stream_seek (seekable_stream, - seekable_stream->bound_start, - CAMEL_STREAM_SET); -} - - - - - - diff --git a/camel/camel-seekable-stream.h b/camel/camel-seekable-stream.h deleted file mode 100644 index 0fc67d59f8..0000000000 --- a/camel/camel-seekable-stream.h +++ /dev/null @@ -1,88 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-stream-fs.h :stream based on unix filesystem */ - -/* - * Author: - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_SEEKABLE_STREAM_H -#define CAMEL_SEEKABLE_STREAM_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-stream.h> -#include <sys/types.h> -#include <unistd.h> - -#define CAMEL_SEEKABLE_STREAM_TYPE (camel_seekable_stream_get_type ()) -#define CAMEL_SEEKABLE_STREAM(obj) (CAMEL_CHECK_CAST((obj), CAMEL_SEEKABLE_STREAM_TYPE, CamelSeekableStream)) -#define CAMEL_SEEKABLE_STREAM_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_SEEKABLE_STREAM_TYPE, CamelSeekableStreamClass)) -#define CAMEL_IS_SEEKABLE_STREAM(o) (CAMEL_CHECK_TYPE((o), CAMEL_SEEKABLE_STREAM_TYPE)) - - -typedef enum -{ - CAMEL_STREAM_SET = SEEK_SET, - CAMEL_STREAM_CUR = SEEK_CUR, - CAMEL_STREAM_END = SEEK_END -} CamelStreamSeekPolicy; - -#define CAMEL_STREAM_UNBOUND (~0) - -struct _CamelSeekableStream -{ - CamelStream parent_object; - - off_t position; /* current postion in the stream */ - off_t bound_start; /* first valid position */ - off_t bound_end; /* first invalid position */ -}; - -typedef struct { - CamelStreamClass parent_class; - - /* Virtual methods */ - off_t (*seek) (CamelSeekableStream *stream, off_t offset, - CamelStreamSeekPolicy policy); - off_t (*tell) (CamelSeekableStream *stream); - int (*set_bounds) (CamelSeekableStream *stream, - off_t start, off_t end); -} CamelSeekableStreamClass; - -/* Standard Camel function */ -CamelType camel_seekable_stream_get_type (void); - -/* public methods */ -off_t camel_seekable_stream_seek (CamelSeekableStream *stream, off_t offset, - CamelStreamSeekPolicy policy); -off_t camel_seekable_stream_tell (CamelSeekableStream *stream); -int camel_seekable_stream_set_bounds (CamelSeekableStream *, off_t start, off_t end); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_SEEKABLE_STREAM_H */ diff --git a/camel/camel-seekable-substream.c b/camel/camel-seekable-substream.c deleted file mode 100644 index 9b197f97bd..0000000000 --- a/camel/camel-seekable-substream.c +++ /dev/null @@ -1,271 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-stream-fs.c : file system based stream - * - * Authors: Bertrand Guiheneuf <bertrand@helixcode.com> - * Michael Zucchi <notzed@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ -#include <config.h> -#include "camel-seekable-substream.h" - -static CamelSeekableStreamClass *parent_class = NULL; - -/* Returns the class for a CamelSeekableSubStream */ -#define CSS_CLASS(so) CAMEL_SEEKABLE_SUBSTREAM_CLASS (CAMEL_OBJECT(so)->klass) - -static int stream_read (CamelStream *stream, char *buffer, unsigned int n); -static int stream_write (CamelStream *stream, const char *buffer, unsigned int n); -static int stream_flush (CamelStream *stream); -static int stream_close (CamelStream *stream); -static gboolean eos (CamelStream *stream); -static off_t stream_seek (CamelSeekableStream *stream, off_t offset, - CamelStreamSeekPolicy policy); - -static void -camel_seekable_substream_class_init (CamelSeekableSubstreamClass *camel_seekable_substream_class) -{ - CamelSeekableStreamClass *camel_seekable_stream_class = - CAMEL_SEEKABLE_STREAM_CLASS (camel_seekable_substream_class); - CamelStreamClass *camel_stream_class = - CAMEL_STREAM_CLASS (camel_seekable_substream_class); - - parent_class = CAMEL_SEEKABLE_STREAM_CLASS (camel_type_get_global_classfuncs (camel_seekable_stream_get_type ())); - - /* virtual method definition */ - - /* virtual method overload */ - camel_stream_class->read = stream_read; - camel_stream_class->write = stream_write; - camel_stream_class->flush = stream_flush; - camel_stream_class->close = stream_close; - camel_stream_class->eos = eos; - - camel_seekable_stream_class->seek = stream_seek; - -} - -static void -camel_seekable_substream_finalize (CamelObject *object) -{ - CamelSeekableSubstream *seekable_substream = - CAMEL_SEEKABLE_SUBSTREAM (object); - - if (seekable_substream->parent_stream) - camel_object_unref (CAMEL_OBJECT (seekable_substream->parent_stream)); -} - - -CamelType -camel_seekable_substream_get_type (void) -{ - static CamelType camel_seekable_substream_type = CAMEL_INVALID_TYPE; - - if (camel_seekable_substream_type == CAMEL_INVALID_TYPE) { - camel_seekable_substream_type = camel_type_register (camel_seekable_stream_get_type (), "CamelSeekableSubstream", - sizeof (CamelSeekableSubstream), - sizeof (CamelSeekableSubstreamClass), - (CamelObjectClassInitFunc) camel_seekable_substream_class_init, - NULL, - NULL, - (CamelObjectFinalizeFunc) camel_seekable_substream_finalize); - } - - return camel_seekable_substream_type; -} - -/** - * camel_seekable_substream_new_with_seekable_stream_and_bounds: - * @parent_stream: a seekable parent stream - * @inf_bound: a lower bound - * @sup_bound: an upper bound - * - * Creates a new CamelSeekableSubstream that references the portion - * of @parent_stream from @inf_bound to @sup_bound. (If @sup_bound is - * #CAMEL_STREAM_UNBOUND, it references to the end of stream, even if - * the stream grows.) - * - * While the substream is open, the caller cannot assume anything about - * the current position of @parent_stream. After the substream has been - * closed, @parent_stream will stabilize again. - * - * Return value: the substream - **/ -CamelStream * -camel_seekable_substream_new_with_seekable_stream_and_bounds (CamelSeekableStream *parent_stream, - off_t start, off_t end) -{ - CamelSeekableSubstream *seekable_substream; - - g_return_val_if_fail (CAMEL_IS_SEEKABLE_STREAM (parent_stream), NULL); - - /* Create the seekable substream. */ - seekable_substream = CAMEL_SEEKABLE_SUBSTREAM (camel_object_new (camel_seekable_substream_get_type ())); - - /* Initialize it. */ - seekable_substream->parent_stream = parent_stream; - camel_object_ref (CAMEL_OBJECT (parent_stream)); - - /* Set the bound of the substream. We can ignore any possible error - * here, because if we fail to seek now, it will try again later. - */ - camel_seekable_stream_set_bounds ((CamelSeekableStream *)seekable_substream, start, end); - - return CAMEL_STREAM (seekable_substream); -} - -static gboolean -parent_reset (CamelSeekableSubstream *seekable_substream, CamelSeekableStream *parent) -{ - CamelSeekableStream *seekable_stream = - CAMEL_SEEKABLE_STREAM (seekable_substream); - - if (camel_seekable_stream_tell (parent) == seekable_stream->position) - return TRUE; - - return camel_seekable_stream_seek (parent, seekable_stream->position, CAMEL_STREAM_SET) - == seekable_stream->position; -} - -static int -stream_read (CamelStream *stream, char *buffer, unsigned int n) -{ - CamelSeekableStream *parent; - CamelSeekableStream *seekable_stream = CAMEL_SEEKABLE_STREAM (stream); - CamelSeekableSubstream *seekable_substream = - CAMEL_SEEKABLE_SUBSTREAM (stream); - int v; - - if (n == 0) - return 0; - - parent = seekable_substream->parent_stream; - - /* Go to our position in the parent stream. */ - if (!parent_reset (seekable_substream, parent)) { - stream->eos = TRUE; - return 0; - } - - /* Compute how many bytes should be read. */ - if (seekable_stream->bound_end != CAMEL_STREAM_UNBOUND) - n = MIN (seekable_stream->bound_end - seekable_stream->position, n); - - if (n == 0) { - stream->eos = TRUE; - return 0; - } - - v = camel_stream_read (CAMEL_STREAM (parent), buffer, n); - - /* ignore <0 - it's an error, let the caller deal */ - if (v > 0) - seekable_stream->position += v; - - return v; -} - -static int -stream_write (CamelStream *stream, const char *buffer, unsigned int n) -{ - /* NOT VALID ON SEEKABLE SUBSTREAM */ - /* Well, it's entirely valid, just not implemented */ - g_warning ("CamelSeekableSubstream:: seekable substream doesn't " - "have a write method yet?\n"); - return -1; -} - -static int -stream_flush (CamelStream *stream) -{ - /* NOT VALID ON SEEKABLE SUBSTREAM */ - g_warning ("CamelSeekableSubstream:: seekable substream doesn't " - "have a flush method\n"); - return -1; -} - -static int -stream_close (CamelStream *stream) -{ - /* we dont really want to close the substream ... */ - return 0; -} - -static gboolean -eos (CamelStream *stream) -{ - CamelSeekableSubstream *seekable_substream = - CAMEL_SEEKABLE_SUBSTREAM (stream); - CamelSeekableStream *seekable_stream = CAMEL_SEEKABLE_STREAM (stream); - CamelSeekableStream *parent; - gboolean eos; - - if (stream->eos) - eos = TRUE; - else { - parent = seekable_substream->parent_stream; - if (!parent_reset (seekable_substream, parent)) - return TRUE; - - eos = camel_stream_eos (CAMEL_STREAM (parent)); - if (!eos && (seekable_stream->bound_end != CAMEL_STREAM_UNBOUND)) { - eos = seekable_stream->position >= seekable_stream->bound_end; - } - } - - return eos; -} - -static off_t -stream_seek (CamelSeekableStream *seekable_stream, off_t offset, - CamelStreamSeekPolicy policy) -{ - CamelSeekableSubstream *seekable_substream = - CAMEL_SEEKABLE_SUBSTREAM (seekable_stream); - CamelStream *stream = CAMEL_STREAM (seekable_stream); - off_t real_offset = 0; - - stream->eos = FALSE; - - switch (policy) { - case CAMEL_STREAM_SET: - real_offset = offset; - break; - - case CAMEL_STREAM_CUR: - real_offset = seekable_stream->position + offset; - break; - - case CAMEL_STREAM_END: - real_offset = camel_seekable_stream_seek (seekable_substream->parent_stream, - offset, - CAMEL_STREAM_END); - if (real_offset == -1) - return -1; - break; - } - - if (seekable_stream->bound_end != CAMEL_STREAM_UNBOUND) - real_offset = MIN (real_offset, seekable_stream->bound_end); - - if (real_offset<seekable_stream->bound_start) - real_offset = seekable_stream->bound_start; - - seekable_stream->position = real_offset; - return real_offset; -} diff --git a/camel/camel-seekable-substream.h b/camel/camel-seekable-substream.h deleted file mode 100644 index 6ac5588a42..0000000000 --- a/camel/camel-seekable-substream.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-seekable-substream.h: stream that piggybacks on another stream */ - -/* - * Author: - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_SEEKABLE_SUBSTREAM_H -#define CAMEL_SEEKABLE_SUBSTREAM_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-seekable-stream.h> - -#define CAMEL_SEEKABLE_SUBSTREAM_TYPE (camel_seekable_substream_get_type ()) -#define CAMEL_SEEKABLE_SUBSTREAM(obj) (CAMEL_CHECK_CAST((obj), CAMEL_SEEKABLE_SUBSTREAM_TYPE, CamelSeekableSubstream)) -#define CAMEL_SEEKABLE_SUBSTREAM_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_SEEKABLE_SUBSTREAM_TYPE, CamelSeekableSubstreamClass)) -#define CAMEL_IS_SEEKABLE_SUBSTREAM(o) (CAMEL_CHECK_TYPE((o), CAMEL_SEEKABLE_SUBSTREAM_TYPE)) - -struct _CamelSeekableSubstream -{ - CamelSeekableStream parent_object; - - /* --**-- Private fields --**-- */ - CamelSeekableStream *parent_stream; -}; - -typedef struct { - CamelSeekableStreamClass parent_class; - -} CamelSeekableSubstreamClass; - -/* Standard Camel function */ -CamelType camel_seekable_substream_get_type (void); - -/* public methods */ - -/* obtain a new seekable substream */ -CamelStream * -camel_seekable_substream_new_with_seekable_stream_and_bounds (CamelSeekableStream *parent_stream, - off_t start, off_t end); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_SEEKABLE_SUBSTREAM_H */ diff --git a/camel/camel-service.c b/camel/camel-service.c deleted file mode 100644 index 15702db42f..0000000000 --- a/camel/camel-service.c +++ /dev/null @@ -1,496 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-service.c : Abstract class for an email service */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ -#include <config.h> -#include "camel-service.h" -#include "camel-session.h" -#include "camel-exception.h" - -#include <ctype.h> -#include <stdlib.h> - -static CamelObjectClass *parent_class = NULL; - -/* Returns the class for a CamelService */ -#define CSERV_CLASS(so) CAMEL_SERVICE_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - -static gboolean service_connect(CamelService *service, CamelException *ex); -static gboolean service_disconnect(CamelService *service, gboolean clean, - CamelException *ex); -/*static gboolean is_connected (CamelService *service);*/ -static GList * query_auth_types_func (CamelService *service, CamelException *ex); -static void free_auth_types (CamelService *service, GList *authtypes); -static char * get_name (CamelService *service, gboolean brief); -static char * get_path (CamelService *service); -static gboolean check_url (CamelService *service, CamelException *ex); - - -static void -camel_service_class_init (CamelServiceClass *camel_service_class) -{ - parent_class = camel_type_get_global_classfuncs (CAMEL_OBJECT_TYPE); - - /* virtual method definition */ - camel_service_class->connect = service_connect; - camel_service_class->disconnect = service_disconnect; - /*camel_service_class->is_connected = is_connected;*/ - camel_service_class->query_auth_types_connected = query_auth_types_func; - camel_service_class->query_auth_types_generic = query_auth_types_func; - camel_service_class->free_auth_types = free_auth_types; - camel_service_class->get_name = get_name; - camel_service_class->get_path = get_path; -} - -static void -camel_service_finalize (CamelObject *object) -{ - CamelService *camel_service = CAMEL_SERVICE (object); - - if (camel_service->connected) { - CamelException ex; - - /*g_warning ("camel_service_finalize: finalizing while still connected!");*/ - camel_exception_init (&ex); - CSERV_CLASS (camel_service)->disconnect (camel_service, FALSE, &ex); - if (camel_exception_is_set (&ex)) { - g_warning ("camel_service_finalize: silent disconnect failure: %s", - camel_exception_get_description(&ex)); - } - camel_exception_clear (&ex); - } - - if (camel_service->url) - camel_url_free (camel_service->url); - if (camel_service->session) - camel_object_unref (CAMEL_OBJECT (camel_service->session)); -} - - - -CamelType -camel_service_get_type (void) -{ - static CamelType camel_service_type = CAMEL_INVALID_TYPE; - - if (camel_service_type == CAMEL_INVALID_TYPE) { - camel_service_type = camel_type_register( CAMEL_OBJECT_TYPE, "CamelService", - sizeof (CamelService), - sizeof (CamelServiceClass), - (CamelObjectClassInitFunc) camel_service_class_init, - NULL, - NULL, - camel_service_finalize ); - } - - return camel_service_type; -} - -static gboolean -check_url (CamelService *service, CamelException *ex) -{ - char *url_string; - - if (((service->provider->url_flags & CAMEL_URL_NEED_USER) - == CAMEL_URL_NEED_USER) && - (service->url->user == NULL || service->url->user[0] == '\0')) { - url_string = camel_url_to_string (service->url, FALSE); - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID, - _("URL '%s' needs a username component"), - url_string); - g_free (url_string); - return FALSE; - } else if (((service->provider->url_flags & CAMEL_URL_NEED_HOST) - == CAMEL_URL_NEED_HOST) && - (service->url->host == NULL || service->url->host[0] == '\0')) { - url_string = camel_url_to_string (service->url, FALSE); - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID, - _("URL '%s' needs a host component"), - url_string); - g_free (url_string); - return FALSE; - } else if (((service->provider->url_flags & CAMEL_URL_NEED_PATH) - == CAMEL_URL_NEED_PATH) && - (service->url->path == NULL || service->url->path[0] == '\0')) { - url_string = camel_url_to_string (service->url, FALSE); - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID, - _("URL '%s' needs a path component"), - url_string); - g_free (url_string); - return FALSE; - } - - return TRUE; -} - -/** - * camel_service_new: create a new CamelService or subtype - * @type: the CamelType of the class to create - * @session: the session for the service - * @provider: the service's provider - * @url: the default URL for the service (may be NULL) - * @ex: a CamelException - * - * Creates a new CamelService (or one of its subtypes), initialized - * with the given parameters. - * - * Return value: the CamelService, or NULL. - **/ -CamelService * -camel_service_new (CamelType type, CamelSession *session, - CamelProvider *provider, CamelURL *url, - CamelException *ex) -{ - CamelService *service; - - g_return_val_if_fail (CAMEL_IS_SESSION (session), NULL); - - service = CAMEL_SERVICE (camel_object_new (type)); - - /*service->connect_level = 0;*/ - - service->provider = provider; - service->url = url; - if (!url->empty && !check_url (service, ex)) { - camel_object_unref (CAMEL_OBJECT (service)); - return NULL; - } - - service->session = session; - camel_object_ref (CAMEL_OBJECT (session)); - - service->connected = FALSE; - - return service; -} - - -static gboolean -service_connect (CamelService *service, CamelException *ex) -{ - /* Things like the CamelMboxStore can validly - * not define a connect function. - */ - return TRUE; -} - -/** - * camel_service_connect: - * @service: CamelService object - * @ex: a CamelException - * - * Connect to the service using the parameters it was initialized - * with. - * - * Return value: whether or not the connection succeeded - **/ - -gboolean -camel_service_connect (CamelService *service, CamelException *ex) -{ - g_return_val_if_fail (CAMEL_IS_SERVICE (service), FALSE); - g_return_val_if_fail (service->session != NULL, FALSE); - g_return_val_if_fail (service->url != NULL, FALSE); - - if (service->connected) { - /* But we're still connected, so no exception - * and return true. - */ - g_warning ("camel_service_connect: trying to connect to an already connected service"); - return TRUE; - } - - if (CSERV_CLASS (service)->connect (service, ex)) { - service->connected = TRUE; - return TRUE; - } - - return FALSE; -} - -static gboolean -service_disconnect (CamelService *service, gboolean clean, CamelException *ex) -{ - /*service->connect_level--;*/ - - /* We let people get away with not having a disconnect - * function -- CamelMboxStore, for example. - */ - - return TRUE; -} - -/** - * camel_service_disconnect: - * @service: CamelService object - * @clean: whether or not to try to disconnect cleanly. - * @ex: a CamelException - * - * Disconnect from the service. If @clean is %FALSE, it should not - * try to do any synchronizing or other cleanup of the connection. - * - * Return value: whether or not the disconnection succeeded without - * errors. (Consult @ex if %FALSE.) - **/ -gboolean -camel_service_disconnect (CamelService *service, gboolean clean, - CamelException *ex) -{ - gboolean res; - - g_return_val_if_fail (service->connected, FALSE); - res = CSERV_CLASS (service)->disconnect (service, clean, ex); - service->connected = FALSE; - return res; -} - -/** - * camel_service_get_url: - * @service: a service - * - * Returns the URL representing a service. The returned URL must be - * freed when it is no longer needed. For security reasons, this - * routine does not return the password. - * - * Return value: the url name - **/ -char * -camel_service_get_url (CamelService *service) -{ - return camel_url_to_string(service->url, FALSE); -} - - -static char * -get_name (CamelService *service, gboolean brief) -{ - g_warning ("CamelService::get_name not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (service))); - return "???"; -} - -/** - * camel_service_get_name: - * @service: the service - * @brief: whether or not to use a briefer form - * - * This gets the name of the service in a "friendly" (suitable for - * humans) form. If @brief is %TRUE, this should be a brief description - * such as for use in the folder tree. If @brief is %FALSE, it should - * be a more complete and mostly unambiguous description. - * - * Return value: the description, which the caller must free. - **/ -char * -camel_service_get_name (CamelService *service, gboolean brief) -{ - g_return_val_if_fail (CAMEL_IS_SERVICE (service), NULL); - g_return_val_if_fail (service->url, NULL); - - return CSERV_CLASS (service)->get_name (service, brief); -} - - -static char * -get_path (CamelService *service) -{ - GString *gpath; - char *path; - CamelURL *url = service->url; - int flags = service->provider->url_flags; - - /* A sort of ad-hoc default implementation that works for our - * current set of services. - */ - - gpath = g_string_new (service->provider->protocol); - if (flags & CAMEL_URL_ALLOW_USER) { - if (flags & CAMEL_URL_ALLOW_HOST) { - g_string_sprintfa (gpath, "/%s@%s", - url->user ? url->user : "", - url->host ? url->host : ""); - } else { - g_string_sprintfa (gpath, "/%s%s", - url->user ? url->user : "", - ((flags & CAMEL_URL_NEED_USER) == CAMEL_URL_NEED_USER) ? "" : "@"); - } - } else if (flags & CAMEL_URL_ALLOW_HOST) { - g_string_sprintfa (gpath, "/%s%s", - ((flags & CAMEL_URL_NEED_HOST) == CAMEL_URL_NEED_HOST) ? "" : "@", - url->host ? url->host : ""); - } - if ((flags & CAMEL_URL_NEED_PATH) == CAMEL_URL_NEED_PATH) { - g_string_sprintfa (gpath, "%s%s", - *url->path == '/' ? "" : "/", - url->path); - } - - path = gpath->str; - g_string_free (gpath, FALSE); - return path; -} - -/** - * camel_service_get_path: - * @service: the service - * - * This gets a valid UNIX relative path describing the service, which - * is guaranteed to be different from the path returned for any - * different service. This path MUST start with the name of the - * provider, followed by a "/", but after that, it is up to the - * provider. - * - * Return value: the path, which the caller must free. - **/ -char * -camel_service_get_path (CamelService *service) -{ - g_return_val_if_fail (CAMEL_IS_SERVICE (service), NULL); - g_return_val_if_fail (service->url, NULL); - - return CSERV_CLASS (service)->get_path (service); -} - - -/** - * camel_service_get_session: - * @service: a service - * - * Returns the CamelSession associated with the service. - * - * Return value: the session - **/ -CamelSession * -camel_service_get_session (CamelService *service) -{ - return service->session; -} - -/** - * camel_service_get_provider: - * @service: a service - * - * Returns the CamelProvider associated with the service. - * - * Return value: the provider - **/ -CamelProvider * -camel_service_get_provider (CamelService *service) -{ - return service->provider; -} - -GList * -query_auth_types_func (CamelService *service, CamelException *ex) -{ - return NULL; -} - -/** - * camel_service_query_auth_types: - * @service: a CamelService - * @ex: a CamelException - * - * This is used by the mail source wizard to get the list of - * authentication types supported by the protocol, and information - * about them. - * - * This may be called on a service with or without an associated URL. - * If there is no URL, the routine must return a generic answer. If - * the service does have a URL, the routine SHOULD connect to the - * server and query what authentication mechanisms it supports. If - * it cannot do that for any reason, it should set @ex accordingly. - * - * Return value: a list of CamelServiceAuthType records. The caller - * must free the list by calling camel_service_free_auth_types when - * it is done. - **/ -GList * -camel_service_query_auth_types (CamelService *service, CamelException *ex) -{ - if (service->url->empty) - return CSERV_CLASS (service)->query_auth_types_generic (service, ex); - else - return CSERV_CLASS (service)->query_auth_types_connected (service, ex); -} - -static void -free_auth_types (CamelService *service, GList *authtypes) -{ - ; -} - -/** - * camel_service_free_auth_types: - * @service: the service - * @authtypes: the list of authtypes - * - * This frees the data allocated by camel_service_query_auth_types(). - **/ -void -camel_service_free_auth_types (CamelService *service, GList *authtypes) -{ - CSERV_CLASS (service)->free_auth_types (service, authtypes); -} - - -/* URL utility routines */ - -/** - * camel_service_gethost: - * @service: a CamelService - * @ex: a CamelException - * - * This is a convenience function to do a gethostbyname on the host - * for the service's URL. - * - * Return value: a (statically-allocated) hostent. - **/ -struct hostent * -camel_service_gethost (CamelService *service, CamelException *ex) -{ - struct hostent *h; - char *hostname; - - if (service->url->host) - hostname = service->url->host; - else - hostname = "localhost"; - h = gethostbyname (hostname); - if (!h) { - extern int h_errno; - - if (h_errno == HOST_NOT_FOUND || h_errno == NO_DATA) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID, - _("No such host %s."), hostname); - } else { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - _("Temporarily unable to look " - "up hostname %s."), hostname); - } - return NULL; - } - - return h; -} diff --git a/camel/camel-service.h b/camel/camel-service.h deleted file mode 100644 index 3f5acabbb5..0000000000 --- a/camel/camel-service.h +++ /dev/null @@ -1,125 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-service.h : Abstract class for an email service */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_SERVICE_H -#define CAMEL_SERVICE_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-object.h> -#include <camel/camel-url.h> -#include <camel/camel-provider.h> -#include <netdb.h> - -#define CAMEL_SERVICE_TYPE (camel_service_get_type ()) -#define CAMEL_SERVICE(obj) (CAMEL_CHECK_CAST((obj), CAMEL_SERVICE_TYPE, CamelService)) -#define CAMEL_SERVICE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_SERVICE_TYPE, CamelServiceClass)) -#define CAMEL_IS_SERVICE(o) (CAMEL_CHECK_TYPE((o), CAMEL_SERVICE_TYPE)) - - -struct _CamelService { - CamelObject parent_object; - - CamelSession *session; - CamelProvider *provider; - gboolean connected; - CamelURL *url; -}; - - -typedef struct { - CamelObjectClass parent_class; - - gboolean (*connect) (CamelService *service, - CamelException *ex); - gboolean (*disconnect) (CamelService *service, - gboolean clean, - CamelException *ex); - - /*gboolean (*is_connected) (CamelService *service);*/ - - GList * (*query_auth_types_connected) (CamelService *service, - CamelException *ex); - GList * (*query_auth_types_generic) (CamelService *service, - CamelException *ex); - void (*free_auth_types) (CamelService *service, - GList *authtypes); - - char * (*get_name) (CamelService *service, - gboolean brief); - char * (*get_path) (CamelService *service); - -} CamelServiceClass; - - -/* query_auth_types returns a GList of these */ -typedef struct { - char *name, *description, *authproto; - gboolean need_password; -} CamelServiceAuthType; - - -/* public methods */ -CamelService * camel_service_new (CamelType type, - CamelSession *session, - CamelProvider *provider, - CamelURL *url, - CamelException *ex); -gboolean camel_service_connect (CamelService *service, - CamelException *ex); -gboolean camel_service_disconnect (CamelService *service, - gboolean clean, - CamelException *ex); -char * camel_service_get_url (CamelService *service); -char * camel_service_get_name (CamelService *service, - gboolean brief); -char * camel_service_get_path (CamelService *service); -CamelSession * camel_service_get_session (CamelService *service); -CamelProvider * camel_service_get_provider (CamelService *service); -GList * camel_service_query_auth_types (CamelService *service, - CamelException *ex); -void camel_service_free_auth_types (CamelService *service, - GList *authtypes); - -/* convenience functions */ -struct hostent * camel_service_gethost (CamelService *service, - CamelException *ex); - - -/* Standard Camel function */ -CamelType camel_service_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_SERVICE_H */ - diff --git a/camel/camel-session.c b/camel/camel-session.c deleted file mode 100644 index ac85005da2..0000000000 --- a/camel/camel-session.c +++ /dev/null @@ -1,455 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-session.c : Abstract class for an email session */ - -/* - * - * Author: - * Bertrand Guiheneuf <bertrand@helixcode.com> - * Dan Winship <danw@helixcode.com> - * Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> -#include <errno.h> -#include <stdio.h> -#include <string.h> -#include <sys/stat.h> -#include <unistd.h> -#include <gal/util/e-util.h> -#include "camel-session.h" -#include "camel-store.h" -#include "camel-transport.h" -#include "camel-exception.h" -#include "string-utils.h" -#include "camel-url.h" -#include "hash-table-utils.h" - -static CamelObjectClass *parent_class; - -static void -camel_session_init (CamelSession *session) -{ - session->modules = camel_provider_init (); - session->providers = g_hash_table_new (g_strcase_hash, g_strcase_equal); -} - -static gboolean -camel_session_destroy_provider (gpointer key, gpointer value, gpointer user_data) -{ - CamelProvider *prov = (CamelProvider *)value; - - g_hash_table_destroy (prov->service_cache); - - return TRUE; -} - -static void -camel_session_finalise (CamelObject *o) -{ - CamelSession *session = (CamelSession *)o; - - g_hash_table_foreach_remove (session->providers, - camel_session_destroy_provider, NULL); - g_hash_table_destroy (session->providers); -} - -static void -camel_session_class_init (CamelSessionClass *camel_session_class) -{ - parent_class = camel_type_get_global_classfuncs (camel_object_get_type ()); -} - -CamelType -camel_session_get_type (void) -{ - static CamelType camel_session_type = CAMEL_INVALID_TYPE; - - if (camel_session_type == CAMEL_INVALID_TYPE) { - camel_session_type = camel_type_register (camel_object_get_type (), "CamelSession", - sizeof (CamelSession), - sizeof (CamelSessionClass), - (CamelObjectClassInitFunc) camel_session_class_init, - NULL, - (CamelObjectInitFunc) camel_session_init, - (CamelObjectFinalizeFunc) camel_session_finalise); - } - - return camel_session_type; -} - -/** - * camel_session_new: - * @storage_path: Path to a directory Camel can use for persistent storage. - * (This directory must already exist.) - * @authenticator: A callback for discussing authentication information - * @registrar: A callback for registering timeout callbacks - * @remove: A callback for removing timeout callbacks - * - * This creates a new CamelSession object, which represents global state - * for the Camel library, and contains callbacks that can be used to - * interact with the main application. - * - * Return value: the new CamelSession - **/ -CamelSession * -camel_session_new (const char *storage_path, - CamelAuthCallback authenticator, - CamelTimeoutRegisterCallback registrar, - CamelTimeoutRemoveCallback remover) -{ - CamelSession *session = CAMEL_SESSION (camel_object_new (CAMEL_SESSION_TYPE)); - - session->storage_path = g_strdup (storage_path); - session->authenticator = authenticator; - session->registrar = registrar; - session->remover = remover; - return session; -} - -/** - * camel_session_register_provider: - * @session: a session object - * @protocol: the protocol the provider provides for - * @provider: provider object - * - * Registers a protocol to provider mapping for the session. - **/ -void -camel_session_register_provider (CamelSession *session, - CamelProvider *provider) -{ - g_return_if_fail (CAMEL_IS_SESSION (session)); - g_return_if_fail (provider != NULL); - - g_hash_table_insert (session->providers, provider->protocol, provider); -} - -static void -ensure_loaded (gpointer key, gpointer value, gpointer user_data) -{ - CamelSession *session = user_data; - char *name = key; - char *path = value; - - if (!g_hash_table_lookup (session->providers, name)) { - CamelException ex; - - camel_exception_init (&ex); - camel_provider_load (session, path, &ex); - camel_exception_clear (&ex); - } -} - -static gint -provider_compare (gconstpointer a, gconstpointer b) -{ - const CamelProvider *cpa = (const CamelProvider *)a; - const CamelProvider *cpb = (const CamelProvider *)b; - - return strcmp (cpa->name, cpb->name); -} - -static void -add_to_list (gpointer key, gpointer value, gpointer user_data) -{ - GList **list = user_data; - CamelProvider *prov = value; - - *list = g_list_insert_sorted (*list, prov, provider_compare); -} - -/** - * camel_session_list_providers: - * @session: the session - * @load: whether or not to load in providers that are not already loaded - * - * This returns a list of available providers in this session. If @load - * is %TRUE, it will first load in all available providers that haven't - * yet been loaded. - * - * Return value: a GList of providers, which the caller must free. - **/ -GList * -camel_session_list_providers (CamelSession *session, gboolean load) -{ - GList *list; - - g_return_val_if_fail (CAMEL_IS_SESSION (session), NULL); - - if (load) { - g_hash_table_foreach (session->modules, ensure_loaded, session); - } - - list = NULL; - g_hash_table_foreach (session->providers, add_to_list, &list); - return list; -} - -static void -service_cache_remove (CamelService *service, gpointer event_data, gpointer user_data) -{ - CamelProvider *provider; - CamelSession *session = CAMEL_SESSION (user_data); - - g_return_if_fail (CAMEL_IS_SESSION (session)); - g_return_if_fail (service != NULL); - g_return_if_fail (service->url != NULL); - - provider = g_hash_table_lookup (session->providers, service->url->protocol); - g_hash_table_remove (provider->service_cache, service->url); -} - -/** - * camel_session_get_service: - * @session: the CamelSession - * @url_string: a Camel URL describing the service to get - * @type: the provider type (%CAMEL_PROVIDER_STORE or - * %CAMEL_PROVIDER_TRANSPORT) to get, since some URLs may be able - * to specify either type. - * @ex: a CamelException - * - * This resolves a CamelURL into a CamelService, including loading the - * provider library for that service if it has not already been loaded. - * - * Services are cached, and asking for "the same" @url_string multiple - * times will return the same CamelService (with its reference count - * incremented by one each time). What constitutes "the same" URL - * depends in part on the provider. - * - * Return value: the requested CamelService, or %NULL - **/ -CamelService * -camel_session_get_service (CamelSession *session, const char *url_string, - CamelProviderType type, CamelException *ex) -{ - CamelURL *url; - CamelProvider *provider; - CamelService *service; - - url = camel_url_new (url_string, ex); - if (!url) - return NULL; - - /* We need to look up the provider so we can then lookup - the service in the provider's cache */ - provider = g_hash_table_lookup (session->providers, url->protocol); - if (!provider) { - /* See if there's one we can load. */ - char *path; - - path = g_hash_table_lookup (session->modules, url->protocol); - if (path) { - camel_provider_load (session, path, ex); - if (camel_exception_get_id (ex) != - CAMEL_EXCEPTION_NONE) { - camel_url_free (url); - return NULL; - } - } - provider = g_hash_table_lookup (session->providers, url->protocol); - } - - if (!provider || !provider->object_types[type]) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID, - _("No provider available for protocol `%s'"), - url->protocol); - camel_url_free (url); - return NULL; - } - - /* Now look up the service in the provider's cache */ - service = g_hash_table_lookup (provider->service_cache, url); - if (service != NULL) { - camel_url_free (url); - camel_object_ref (CAMEL_OBJECT (service)); - return service; - } - - service = camel_service_new (provider->object_types[type], session, provider, url, ex); - if (service) { - g_hash_table_insert (provider->service_cache, url, service); - camel_object_hook_event (CAMEL_OBJECT (service), "finalize", (CamelObjectEventHookFunc) service_cache_remove, session); - } - - return service; -} - -/** - * camel_session_get_service_connected: - * @session: the CamelSession - * @url_string: a Camel URL describing the service to get - * @type: the provider type - * @ex: a CamelException - * - * This works like camel_session_get_service(), but also ensures that - * the returned service will have been successfully connected (via - * camel_service_connect().) - * - * Return value: the requested CamelService, or %NULL - **/ -CamelService * -camel_session_get_service_connected (CamelSession *session, - const char *url_string, - CamelProviderType type, - CamelException *ex) -{ - CamelService *svc; - - svc = camel_session_get_service (session, url_string, type, ex); - if (svc == NULL) - return NULL; - - if (svc->connected == FALSE) { - if (camel_service_connect (svc, ex) == FALSE) { - camel_object_unref (CAMEL_OBJECT (svc)); - return NULL; - } - } - - return svc; -} - -/** - * camel_session_get_storage_path: - * @session: session object - * @service: a CamelService - * @ex: a CamelException - * - * This returns the path to a directory which the service can use for - * its own purposes. Data stored there will remain between Evolution - * sessions. No code outside of that service should ever touch the - * files in this directory. If the directory does not exist, it will - * be created. - * - * Return value: the path (which the caller must free), or %NULL if - * an error occurs. - **/ -char * -camel_session_get_storage_path (CamelSession *session, CamelService *service, - CamelException *ex) -{ - char *path, *p; - - p = camel_service_get_path (service); - path = g_strdup_printf ("%s/%s", session->storage_path, p); - g_free (p); - - if (access (path, F_OK) == 0) - return path; - - if (e_mkdir_hier (path, S_IRWXU) == -1) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not create directory %s:\n%s"), - path, g_strerror (errno)); - g_free (path); - return NULL; - } - - return path; -} - -/** - * camel_session_query_authenticator: query the session authenticator - * @session: session object - * @mode: %CAMEL_AUTHENTICATOR_ASK or %CAMEL_AUTHENTICATOR_TELL - * @data: prompt to query user with, or data to cache - * @secret: whether or not the data is secret (eg, a password) - * @service: the service this query is being made by - * @item: an identifier, unique within this service, for the information - * @ex: a CamelException - * - * This function is used by a CamelService to discuss authentication - * information with the application. - * - * @service and @item together uniquely identify the piece of data the - * caller is concerned with. - * - * If @mode is %CAMEL_AUTHENTICATOR_ASK, then @data is a question to - * ask the user (if the application doesn't already have the answer - * cached). If @secret is set, the user's input should not be echoed - * back. The authenticator should set @ex to - * %CAMEL_EXCEPTION_USER_CANCEL if the user did not provide the - * information. The caller must g_free() the information returned when - * it is done with it. - * - * If @mode is %CAMEL_AUTHENTICATOR_TELL, then @data is information - * that the application should cache, or %NULL if it should stop - * caching anything about that datum (eg, because the data is a - * password that turned out to be incorrect). - * - * Return value: the authentication information or %NULL. - **/ -char * -camel_session_query_authenticator (CamelSession *session, - CamelAuthCallbackMode mode, - char *prompt, gboolean secret, - CamelService *service, char *item, - CamelException *ex) -{ - return session->authenticator (mode, prompt, secret, - service, item, ex); -} - -/** - * camel_session_register_timeout: Register a timeout to be called - * periodically. - * - * @session: the CamelSession - * @interval: the number of milliseconds interval between calls - * @callback: the function to call - * @user_data: extra data to be passed to the callback - * - * This function will use the registrar callback provided upon - * camel_session_new to register the timeout. The callback will - * be called every @interval milliseconds until it returns @FALSE. - * It will be passed one argument, @user_data. - * - * Returns a nonzero handle that can be used with - * camel_session_remove_timeout on success, and 0 on failure to - * register the timeout. - **/ -guint -camel_session_register_timeout (CamelSession *session, - guint32 interval, - CamelTimeoutCallback callback, - gpointer user_data) -{ - g_return_val_if_fail (CAMEL_IS_SESSION (session), FALSE); - - return session->registrar (interval, callback, user_data); -} - -/** - * camel_session_remove_timeout: Remove a previously registered - * timeout. - * - * @session: the CamelSession - * @handle: a value returned from camel_session_register_timeout - * - * This function will use the remover callback provided upon - * camel_session_new to remove the timeout. - * - * Returns TRUE on success and FALSE on failure. - **/ -gboolean -camel_session_remove_timeout (CamelSession *session, guint handle) -{ - return session->remover (handle); -} diff --git a/camel/camel-session.h b/camel/camel-session.h deleted file mode 100644 index fed21be6f1..0000000000 --- a/camel/camel-session.h +++ /dev/null @@ -1,132 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-session.h : Abstract class for an email session */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_SESSION_H -#define CAMEL_SESSION_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-object.h> -#include <camel/camel-provider.h> - -#define CAMEL_SESSION_TYPE (camel_session_get_type ()) -#define CAMEL_SESSION(obj) (CAMEL_CHECK_CAST((obj), CAMEL_SESSION_TYPE, CamelSession)) -#define CAMEL_SESSION_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_SESSION_TYPE, CamelSessionClass)) -#define CAMEL_IS_SESSION(o) (CAMEL_CHECK_TYPE((o), CAMEL_SESSION_TYPE)) - - -typedef enum { - CAMEL_AUTHENTICATOR_ASK, CAMEL_AUTHENTICATOR_TELL -} CamelAuthCallbackMode; - -typedef char *(*CamelAuthCallback) (CamelAuthCallbackMode mode, - char *data, gboolean secret, - CamelService *service, char *item, - CamelException *ex); -typedef gboolean (*CamelTimeoutCallback) (gpointer data); -typedef guint (*CamelTimeoutRegisterCallback) (guint32 interval, - CamelTimeoutCallback cb, - gpointer camel_data); -typedef gboolean (*CamelTimeoutRemoveCallback) (guint id); - -struct _CamelSession -{ - CamelObject parent_object; - - char *storage_path; - CamelAuthCallback authenticator; - CamelTimeoutRegisterCallback registrar; - CamelTimeoutRemoveCallback remover; - - GHashTable *providers, *modules; -}; - -typedef struct { - CamelObjectClass parent_class; - -} CamelSessionClass; - - -/* public methods */ - -/* Standard Camel function */ -CamelType camel_session_get_type (void); - - -CamelSession * camel_session_new (const char *storage_path, - CamelAuthCallback authenticator, - CamelTimeoutRegisterCallback registrar, - CamelTimeoutRemoveCallback remover); - -void camel_session_register_provider (CamelSession *session, - CamelProvider *provider); -GList * camel_session_list_providers (CamelSession *session, - gboolean load); - -CamelService * camel_session_get_service (CamelSession *session, - const char *url_string, - CamelProviderType type, - CamelException *ex); -CamelService * camel_session_get_service_connected (CamelSession *session, - const char *url_string, - CamelProviderType type, - CamelException *ex); - -#define camel_session_get_store(session, url_string, ex) \ - ((CamelStore *) camel_session_get_service_connected (session, url_string, CAMEL_PROVIDER_STORE, ex)) -#define camel_session_get_transport(session, url_string, ex) \ - ((CamelTransport *) camel_session_get_service_connected (session, url_string, CAMEL_PROVIDER_TRANSPORT, ex)) - -char * camel_session_get_storage_path (CamelSession *session, - CamelService *service, - CamelException *ex); - -char * camel_session_query_authenticator (CamelSession *session, - CamelAuthCallbackMode mode, - char *prompt, - gboolean secret, - CamelService *service, - char *item, - CamelException *ex); - -guint camel_session_register_timeout (CamelSession *session, - guint32 interval, - CamelTimeoutCallback callback, - gpointer user_data); - -gboolean camel_session_remove_timeout (CamelSession *session, - guint handle); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_SESSION_H */ diff --git a/camel/camel-store.c b/camel/camel-store.c deleted file mode 100644 index c9236676b2..0000000000 --- a/camel/camel-store.c +++ /dev/null @@ -1,652 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-store.c : Abstract class for an email store */ - -/* - * - * Authors: - * Bertrand Guiheneuf <bertrand@helixcode.com> - * Dan Winship <danw@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ -#include <config.h> -#include <string.h> - -#include "camel-store.h" -#include "camel-folder.h" -#include "camel-exception.h" - -static CamelServiceClass *parent_class = NULL; - -/* Returns the class for a CamelStore */ -#define CS_CLASS(so) CAMEL_STORE_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - -static CamelFolder *get_folder (CamelStore *store, const char *folder_name, - guint32 flags, CamelException *ex); -static void delete_folder (CamelStore *store, const char *folder_name, - CamelException *ex); -static void rename_folder (CamelStore *store, const char *old_name, - const char *new_name, CamelException *ex); - -static char *get_folder_name (CamelStore *store, const char *folder_name, - CamelException *ex); -static char *get_root_folder_name (CamelStore *store, CamelException *ex); -static char *get_default_folder_name (CamelStore *store, CamelException *ex); - -static CamelFolderInfo *get_folder_info (CamelStore *store, const char *top, - gboolean fast, gboolean recursive, - gboolean subscribed_only, - CamelException *ex); -static void free_folder_info (CamelStore *store, CamelFolderInfo *tree); - -static CamelFolder *lookup_folder (CamelStore *store, const char *folder_name); -static void cache_folder (CamelStore *store, const char *folder_name, - CamelFolder *folder); -static void uncache_folder (CamelStore *store, CamelFolder *folder); - -static gboolean folder_subscribed (CamelStore *store, const char *folder_name); -static void subscribe_folder (CamelStore *store, const char *folder_name, CamelException *ex); -static void unsubscribe_folder (CamelStore *store, const char *folder_name, CamelException *ex); - -static void -camel_store_class_init (CamelStoreClass *camel_store_class) -{ - parent_class = CAMEL_SERVICE_CLASS (camel_type_get_global_classfuncs (camel_service_get_type ())); - - /* virtual method definition */ - camel_store_class->get_folder = get_folder; - camel_store_class->delete_folder = delete_folder; - camel_store_class->rename_folder = rename_folder; - camel_store_class->get_folder_name = get_folder_name; - camel_store_class->get_root_folder_name = get_root_folder_name; - camel_store_class->get_default_folder_name = get_default_folder_name; - camel_store_class->get_folder_info = get_folder_info; - camel_store_class->free_folder_info = free_folder_info; - camel_store_class->lookup_folder = lookup_folder; - camel_store_class->cache_folder = cache_folder; - camel_store_class->uncache_folder = uncache_folder; - camel_store_class->folder_subscribed = folder_subscribed; - camel_store_class->subscribe_folder = subscribe_folder; - camel_store_class->unsubscribe_folder = unsubscribe_folder; -} - -static void -camel_store_init (void *o, void *k) -{ - CamelStore *store = o; - - store->folders = g_hash_table_new (g_str_hash, g_str_equal); - store->flags = 0; -} - -static void -camel_store_finalize (CamelObject *object) -{ - CamelStore *store = CAMEL_STORE (object); - - if (store->folders) { - if (g_hash_table_size (store->folders) != 0) { - g_warning ("Folder cache for store %p contains " - "%d folders at destruction.", store, - g_hash_table_size (store->folders)); - } - g_hash_table_destroy (store->folders); - } -} - - -CamelType -camel_store_get_type (void) -{ - static CamelType camel_store_type = CAMEL_INVALID_TYPE; - - if (camel_store_type == CAMEL_INVALID_TYPE) { - camel_store_type = camel_type_register (CAMEL_SERVICE_TYPE, "CamelStore", - sizeof (CamelStore), - sizeof (CamelStoreClass), - (CamelObjectClassInitFunc) camel_store_class_init, - NULL, - (CamelObjectInitFunc) camel_store_init, - (CamelObjectFinalizeFunc) camel_store_finalize ); - } - - return camel_store_type; -} - - -static CamelFolder * -get_folder(CamelStore *store, const char *folder_name, guint32 flags, CamelException *ex) -{ - g_warning("CamelStore::get_folder not implemented for `%s'", - camel_type_to_name(CAMEL_OBJECT_GET_TYPE(store))); - return NULL; -} - -static void -delete_folder (CamelStore *store, const char *folder_name, CamelException *ex) -{ - g_warning ("CamelStore::delete_folder not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (store))); -} - -static void -rename_folder (CamelStore *store, const char *old_name, - const char *new_name, CamelException *ex) -{ - g_warning ("CamelStore::rename_folder not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (store))); -} - - -/* CamelStore::get_folder_name should: - * a) make sure that the provided name is valid - * b) return it in canonical form, in allocated memory. - * - * This is used to make sure that duplicate names for the same folder - * don't result in duplicate cache entries. - */ -static char * -get_folder_name (CamelStore *store, const char *folder_name, - CamelException *ex) -{ - g_warning ("CamelStore::get_folder_name not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (store))); - return NULL; -} - -static char * -get_root_folder_name (CamelStore *store, CamelException *ex) -{ - return g_strdup ("/"); -} - -static char * -get_default_folder_name (CamelStore *store, CamelException *ex) -{ - return CS_CLASS (store)->get_root_folder_name (store, ex); -} - -static CamelFolder * -lookup_folder (CamelStore *store, const char *folder_name) -{ - if (store->folders) { - CamelFolder *folder = g_hash_table_lookup (store->folders, folder_name); - if (folder) - camel_object_ref(CAMEL_OBJECT(folder)); - return folder; - } - return NULL; -} - -static void folder_finalize (CamelObject *folder, gpointer event_data, gpointer user_data) -{ - CS_CLASS (user_data)->uncache_folder (CAMEL_STORE(user_data), CAMEL_FOLDER(folder)); -} - -static void -cache_folder (CamelStore *store, const char *folder_name, CamelFolder *folder) -{ - if (!store->folders) - return; - - if (g_hash_table_lookup (store->folders, folder_name)) { - g_warning ("Caching folder %s that already exists.", - folder_name); - } - g_hash_table_insert (store->folders, g_strdup (folder_name), folder); - - camel_object_hook_event (CAMEL_OBJECT (folder), "finalize", folder_finalize, store); - - /* - * gt_k so as not to get caught by my little gt_k cleanliness detector. - * - * gt_k_signal_connect_object (CAMEL_OBJECT (folder), "destroy", - * GT_K_SIGNAL_FUNC (CS_CLASS (store)->uncache_folder), - * CAMEL_OBJECT (store)); - */ -} - -static gboolean -folder_matches (gpointer key, gpointer value, gpointer user_data) -{ - if (value == user_data) { - g_free (key); - return TRUE; - } else - return FALSE; -} - -static void -uncache_folder (CamelStore *store, CamelFolder *folder) -{ - g_hash_table_foreach_remove (store->folders, folder_matches, folder); -} - - -static CamelFolder * -get_folder_internal(CamelStore *store, const char *folder_name, guint32 flags, CamelException *ex) -{ - CamelFolder *folder = NULL; - - /* Try cache first. */ - folder = CS_CLASS(store)->lookup_folder(store, folder_name); - - if (!folder) { - folder = CS_CLASS(store)->get_folder(store, folder_name, flags, ex); - if (!folder) - return NULL; - - CS_CLASS(store)->cache_folder(store, folder_name, folder); - } - - return folder; -} - - - -/** - * camel_store_get_folder: Return the folder corresponding to a path. - * @store: a CamelStore - * @folder_name: name of the folder to get - * @create: whether or not to create the folder if it doesn't already exist - * @ex: a CamelException - * - * Returns the folder corresponding to the path @folder_name. If the - * path begins with the separator character, it is relative to the - * root folder. Otherwise, it is relative to the default folder. If - * @create is %TRUE and the named folder does not already exist, it will - * be created. - * - * Return value: the folder - **/ -CamelFolder * -camel_store_get_folder(CamelStore *store, const char *folder_name, guint32 flags, CamelException *ex) -{ - char *name; - CamelFolder *folder = NULL; - - name = CS_CLASS(store)->get_folder_name(store, folder_name, ex); - if (name) { - folder = get_folder_internal(store, name, flags, ex); - g_free (name); - } - return folder; -} - - -/** - * camel_store_delete_folder: Delete the folder corresponding to a path. - * @store: a CamelStore - * @folder_name: name of the folder to delete - * @ex: a CamelException - * - * Deletes the named folder. The folder must be empty. - **/ -void -camel_store_delete_folder (CamelStore *store, const char *folder_name, - CamelException *ex) -{ - char *name; - - name = CS_CLASS (store)->get_folder_name (store, folder_name, ex); - if (name) { - CS_CLASS (store)->delete_folder (store, name, ex); - g_free (name); - } -} - -/** - * camel_store_rename_folder: - * @store: - * @old_name: - * @new_name: - * @ex: - * - * Rename a named folder to a new name. - **/ -void camel_store_rename_folder (CamelStore *store, - const char *old_name, - const char *new_name, - CamelException *ex) -{ - char *old, *new; - - old = CS_CLASS (store)->get_folder_name(store, old_name, ex); - if (old) { - new = CS_CLASS (store)->get_folder_name(store, new_name, ex); - if (new) { - CS_CLASS (store)->rename_folder(store, old, new, ex); - g_free(new); - } - g_free(old); - } -} - - -/** - * camel_store_get_root_folder: return the top-level folder - * - * Returns the folder which is at the top of the folder hierarchy. - * This folder may or may not be the same as the default folder. - * - * Return value: the top-level folder. - **/ -CamelFolder * -camel_store_get_root_folder (CamelStore *store, CamelException *ex) -{ - char *name; - CamelFolder *folder = NULL; - - name = CS_CLASS (store)->get_root_folder_name (store, ex); - if (name) { - folder = get_folder_internal (store, name, TRUE, ex); - g_free (name); - } - return folder; -} - -/** - * camel_store_get_default_folder: return the store default folder - * - * The default folder is the folder which is presented to the user in - * the default configuration. This defaults to the root folder if - * the store doesn't override it. - * - * Return value: the default folder. - **/ -CamelFolder * -camel_store_get_default_folder (CamelStore *store, CamelException *ex) -{ - char *name; - CamelFolder *folder = NULL; - - name = CS_CLASS (store)->get_default_folder_name (store, ex); - if (name) { - folder = get_folder_internal (store, name, TRUE, ex); - g_free (name); - } - return folder; -} - - -static CamelFolderInfo * -get_folder_info (CamelStore *store, const char *top, - gboolean fast, gboolean recursive, - gboolean subscribed_only, - CamelException *ex) -{ - g_warning ("CamelStore::get_folder_info not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (store))); - return NULL; -} - -/** - * camel_store_get_folder_info: - * @store: a CamelStore - * @top: the name of the folder to start from - * @fast: whether or not to do a "fast" scan. - * @recursive: whether to include information for subfolders - * @ex: a CamelException - * - * This fetches information about the folder structure of @store, - * starting with @top, and returns a tree of CamelFolderInfo - * structures. If @fast is %TRUE, the message_count or - * unread_message_count fields of some or all of the structures may be - * set to -1, if the store cannot determine that information quickly. - * If @recursive is %TRUE, the returned tree will include all levels of - * hierarchy below @top. If it is %FALSE, it will only include the - * immediate subfolders of @top. - * - * Return value: a CamelFolderInfo tree, which must be freed with - * camel_store_free_folder_info. - **/ -CamelFolderInfo * -camel_store_get_folder_info (CamelStore *store, const char *top, - gboolean fast, gboolean recursive, - gboolean subscribed_only, - CamelException *ex) -{ - g_return_val_if_fail (CAMEL_IS_STORE (store), NULL); - - return CS_CLASS (store)->get_folder_info (store, top, fast, - recursive, subscribed_only, - ex); -} - - -static void -free_folder_info (CamelStore *store, CamelFolderInfo *fi) -{ - g_warning ("CamelStore::free_folder_info not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (store))); -} - -/** - * camel_store_free_folder_info: - * @store: a CamelStore - * @tree: the tree returned by camel_store_get_folder_info() - * - * Frees the data returned by camel_store_get_folder_info(). - **/ -void -camel_store_free_folder_info (CamelStore *store, CamelFolderInfo *fi) -{ - g_return_if_fail (CAMEL_IS_STORE (store)); - - CS_CLASS (store)->free_folder_info (store, fi); -} - -/** - * camel_store_free_folder_info_full: - * @store: a CamelStore - * @tree: the tree returned by camel_store_get_folder_info() - * - * An implementation for CamelStore::free_folder_info. Frees all - * of the data. - **/ -void -camel_store_free_folder_info_full (CamelStore *store, CamelFolderInfo *fi) -{ - camel_folder_info_free (fi); -} - -/** - * camel_store_free_folder_info_nop: - * @store: a CamelStore - * @tree: the tree returned by camel_store_get_folder_info() - * - * An implementation for CamelStore::free_folder_info. Does nothing. - **/ -void -camel_store_free_folder_info_nop (CamelStore *store, CamelFolderInfo *fi) -{ - ; -} - - -/** - * camel_folder_info_free: - * @fi: the CamelFolderInfo - * - * Frees @fi. - **/ -void -camel_folder_info_free (CamelFolderInfo *fi) -{ - if (fi) { - camel_folder_info_free (fi->sibling); - camel_folder_info_free (fi->child); - g_free (fi->name); - g_free (fi->full_name); - g_free (fi->url); - g_free (fi); - } -} - - -/** - * camel_folder_info_build: - * @folders: an array of CamelFolderInfo - * @top: the top of the folder tree - * @separator: the hieararchy separator character - * @short_names: %TRUE if the (short) name of a folder is the part after - * the last @separator in the full name. %FALSE if it is the full name. - * - * This takes an array of folders and attaches them together. @top points - * to the (or at least, "a") top-level element of the tree: it may or may - * not also be an element of @folders. If necessary, camel_folder_info_build - * will create additional CamelFolderInfo with %NULL urls to fill in gaps - * in the tree. The value of @short_names is used in constructing the - * names of these intermediate folders. - **/ -void -camel_folder_info_build (GPtrArray *folders, CamelFolderInfo *top, - char separator, gboolean short_names) -{ - CamelFolderInfo *fi, *pfi; - GHashTable *hash; - char *p, *pname; - int i; - - /* Hash the folders. */ - hash = g_hash_table_new (g_str_hash, g_str_equal); - pfi = top; - for (i = 0; i < folders->len; i++) { - fi = folders->pdata[i]; - if (fi == top) - pfi = NULL; - g_hash_table_insert (hash, fi->full_name, fi); - } - if (pfi) - g_hash_table_insert (hash, pfi->full_name, pfi); - - /* Now find parents. */ - for (i = 0; i < folders->len; i++) { - fi = folders->pdata[i]; - if (fi == top) - continue; - - p = strrchr (fi->full_name, separator); - if (p) { - pname = g_strndup (fi->full_name, p - fi->full_name); - pfi = g_hash_table_lookup (hash, pname); - if (pfi) { - g_free (pname); - } else { - pfi = g_new0 (CamelFolderInfo, 1); - pfi->full_name = pname; - if (short_names) { - pfi->name = strrchr (pname, separator); - if (pfi->name) - pfi->name = g_strdup (pfi->name + 1); - else - pfi->name = g_strdup (pname); - } else - pfi->name = g_strdup (pname); - g_hash_table_insert (hash, pname, pfi); - g_ptr_array_add (folders, pfi); - } - fi->sibling = pfi->child; - fi->parent = pfi; - pfi->child = fi; - } else { - fi->sibling = top->child; - fi->parent = top; - top->child = fi; - } - } -} - -gboolean -camel_store_supports_subscriptions (CamelStore *store) -{ - return (store->flags & CAMEL_STORE_SUBSCRIPTIONS); -} - - -static gboolean -folder_subscribed (CamelStore *store, const char *folder_name) -{ - g_warning ("CamelStore::folder_subscribed not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (store))); - return FALSE; -} - -/** - * camel_store_folder_subscribed: Tell whether or not a folder has been subscribed to. - * @store: a CamelStore - * @folder_name: the folder on which we're querying subscribed status. - * Return value: TRUE if folder is subscribed, FALSE if not. - **/ -gboolean -camel_store_folder_subscribed (CamelStore *store, - const char *folder_name) -{ - g_return_val_if_fail (CAMEL_IS_STORE (store), FALSE); - g_return_val_if_fail (store->flags & CAMEL_STORE_SUBSCRIPTIONS, FALSE); - - return CS_CLASS (store)->folder_subscribed (store, folder_name); -} - -static void -subscribe_folder (CamelStore *store, const char *folder_name, CamelException *ex) -{ - g_warning ("CamelStore::subscribe_folder not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (store))); -} - -/** - * camel_store_subscribe_folder: marks a folder as subscribed. - * @store: a CamelStore - * @folder_name: the folder to subscribe to. - **/ -void -camel_store_subscribe_folder (CamelStore *store, - const char *folder_name, - CamelException *ex) -{ - g_return_if_fail (CAMEL_IS_STORE (store)); - g_return_if_fail (store->flags & CAMEL_STORE_SUBSCRIPTIONS); - - CS_CLASS (store)->subscribe_folder (store, folder_name, ex); -} - -static void -unsubscribe_folder (CamelStore *store, const char *folder_name, CamelException *ex) -{ - g_warning ("CamelStore::unsubscribe_folder not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (store))); -} - - -/** - * camel_store_unsubscribe_folder: marks a folder as unsubscribed. - * @store: a CamelStore - * @folder_name: the folder to unsubscribe from. - **/ -void -camel_store_unsubscribe_folder (CamelStore *store, - const char *folder_name, - CamelException *ex) -{ - g_return_if_fail (CAMEL_IS_STORE (store)); - g_return_if_fail (store->flags & CAMEL_STORE_SUBSCRIPTIONS); - - CS_CLASS (store)->unsubscribe_folder (store, folder_name, ex); -} - diff --git a/camel/camel-store.h b/camel/camel-store.h deleted file mode 100644 index 7558c0eb5a..0000000000 --- a/camel/camel-store.h +++ /dev/null @@ -1,178 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-store.h : Abstract class for an email store */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_STORE_H -#define CAMEL_STORE_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-object.h> -#include <camel/camel-service.h> - - -typedef struct _CamelFolderInfo { - struct _CamelFolderInfo *parent, *sibling, *child; - char *url, *full_name, *name; - int message_count, unread_message_count; -} CamelFolderInfo; - - -#define CAMEL_STORE_TYPE (camel_store_get_type ()) -#define CAMEL_STORE(obj) (CAMEL_CHECK_CAST((obj), CAMEL_STORE_TYPE, CamelStore)) -#define CAMEL_STORE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_STORE_TYPE, CamelStoreClass)) -#define CAMEL_IS_STORE(o) (CAMEL_CHECK_TYPE((o), CAMEL_STORE_TYPE)) - - -/* Flags for store flags */ -#define CAMEL_STORE_SUBSCRIPTIONS (1 << 0) - -struct _CamelStore -{ - CamelService parent_object; - - GHashTable *folders; - - int flags; -}; - - -/* open mode for folder */ -#define CAMEL_STORE_FOLDER_CREATE (1<<0) -#define CAMEL_STORE_FOLDER_BODY_INDEX (1<<1) - -typedef struct { - CamelServiceClass parent_class; - - CamelFolder * (*get_folder) (CamelStore *store, - const char *folder_name, - guint32 flags, - CamelException *ex); - - void (*delete_folder) (CamelStore *store, - const char *folder_name, - CamelException *ex); - void (*rename_folder) (CamelStore *store, - const char *old_name, - const char *new_name, - CamelException *ex); - char * (*get_folder_name) (CamelStore *store, - const char *folder_name, - CamelException *ex); - char * (*get_root_folder_name) (CamelStore *store, - CamelException *ex); - char * (*get_default_folder_name) (CamelStore *store, - CamelException *ex); - - CamelFolder * (*lookup_folder) (CamelStore *store, - const char *folder_name); - void (*cache_folder) (CamelStore *store, - const char *folder_name, - CamelFolder *folder); - void (*uncache_folder) (CamelStore *store, - CamelFolder *folder); - - CamelFolderInfo *(*get_folder_info) (CamelStore *store, - const char *top, - gboolean fast, - gboolean recursive, - gboolean subscribed_only, - CamelException *ex); - void (*free_folder_info) (CamelStore *store, - CamelFolderInfo *fi); - - gboolean (*folder_subscribed) (CamelStore *store, - const char *folder_name); - void (*subscribe_folder) (CamelStore *store, - const char *folder_name, - CamelException *ex); - void (*unsubscribe_folder) (CamelStore *store, - const char *folder_name, - CamelException *ex); -} CamelStoreClass; - - -/* Standard Camel function */ -CamelType camel_store_get_type (void); - -/* public methods */ -CamelFolder * camel_store_get_folder (CamelStore *store, - const char *folder_name, - guint32 flags, - CamelException *ex); -CamelFolder * camel_store_get_root_folder (CamelStore *store, - CamelException *ex); -CamelFolder * camel_store_get_default_folder (CamelStore *store, - CamelException *ex); - -void camel_store_delete_folder (CamelStore *store, - const char *folder_name, - CamelException *ex); -void camel_store_rename_folder (CamelStore *store, - const char *old_name, - const char *new_name, - CamelException *ex); - -CamelFolderInfo *camel_store_get_folder_info (CamelStore *store, - const char *top, - gboolean fast, - gboolean recursive, - gboolean subscribed_only, - CamelException *ex); -void camel_store_free_folder_info (CamelStore *store, - CamelFolderInfo *fi); - -void camel_store_free_folder_info_full (CamelStore *store, - CamelFolderInfo *fi); -void camel_store_free_folder_info_nop (CamelStore *store, - CamelFolderInfo *fi); - -void camel_folder_info_free (CamelFolderInfo *fi); -void camel_folder_info_build (GPtrArray *folders, - CamelFolderInfo *top, - char separator, - gboolean short_names); - -gboolean camel_store_supports_subscriptions (CamelStore *store); - -gboolean camel_store_folder_subscribed (CamelStore *store, - const char *folder_name); -void camel_store_subscribe_folder (CamelStore *store, - const char *folder_name, - CamelException *ex); -void camel_store_unsubscribe_folder (CamelStore *store, - const char *folder_name, - CamelException *ex); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_STORE_H */ diff --git a/camel/camel-stream-buffer.c b/camel/camel-stream-buffer.c deleted file mode 100644 index c25cda09bc..0000000000 --- a/camel/camel-stream-buffer.c +++ /dev/null @@ -1,453 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */ - -/* camel-stream-buffer.c : Buffer any other other stream - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#include <config.h> -#include "camel-stream-buffer.h" -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <errno.h> - -static CamelStreamClass *parent_class = NULL; - -enum { - BUF_USER = 1<<0, /* user-supplied buffer, do not free */ -}; - -#define BUF_SIZE 1024 - -static ssize_t stream_read (CamelStream *stream, char *buffer, size_t n); -static ssize_t stream_write (CamelStream *stream, const char *buffer, size_t n); -static int stream_flush (CamelStream *stream); -static int stream_close (CamelStream *stream); -static gboolean stream_eos (CamelStream *stream); - -static void init_vbuf(CamelStreamBuffer *sbf, CamelStream *s, CamelStreamBufferMode mode, char *buf, guint32 size); -static void init(CamelStreamBuffer *sbuf, CamelStream *s, CamelStreamBufferMode mode); - -static void -camel_stream_buffer_class_init (CamelStreamBufferClass *camel_stream_buffer_class) -{ - CamelStreamClass *camel_stream_class = CAMEL_STREAM_CLASS (camel_stream_buffer_class); - - parent_class = CAMEL_STREAM_CLASS (camel_type_get_global_classfuncs (camel_stream_get_type ())); - - /* virtual method definition */ - camel_stream_buffer_class->init = init; - camel_stream_buffer_class->init_vbuf = init_vbuf; - - /* virtual method overload */ - camel_stream_class->read = stream_read; - camel_stream_class->write = stream_write; - camel_stream_class->flush = stream_flush; - camel_stream_class->close = stream_close; - camel_stream_class->eos = stream_eos; -} - -static void -camel_stream_buffer_init (gpointer object, gpointer klass) -{ - CamelStreamBuffer *sbf = CAMEL_STREAM_BUFFER (object); - - sbf->flags = 0; - sbf->size = BUF_SIZE; - sbf->buf = g_malloc(BUF_SIZE); - sbf->ptr = sbf->buf; - sbf->end = sbf->buf; - sbf->mode = CAMEL_STREAM_BUFFER_READ | CAMEL_STREAM_BUFFER_BUFFER; - sbf->stream = 0; - sbf->linesize = 80; - sbf->linebuf = g_malloc(sbf->linesize); -} - -static void -camel_stream_buffer_finalize (CamelObject *object) -{ - CamelStreamBuffer *sbf = CAMEL_STREAM_BUFFER (object); - - if (!(sbf->flags & BUF_USER)) { - g_free(sbf->buf); - } - if (sbf->stream) - camel_object_unref(CAMEL_OBJECT(sbf->stream)); - - g_free(sbf->linebuf); -} - - -CamelType -camel_stream_buffer_get_type (void) -{ - static CamelType camel_stream_buffer_type = CAMEL_INVALID_TYPE; - - if (camel_stream_buffer_type == CAMEL_INVALID_TYPE) { - camel_stream_buffer_type = camel_type_register (camel_stream_get_type (), "CamelStreamBuffer", - sizeof (CamelStreamBuffer), - sizeof (CamelStreamBufferClass), - (CamelObjectClassInitFunc) camel_stream_buffer_class_init, - NULL, - (CamelObjectInitFunc) camel_stream_buffer_init, - (CamelObjectFinalizeFunc) camel_stream_buffer_finalize); - } - - return camel_stream_buffer_type; -} - - -static void -set_vbuf(CamelStreamBuffer *sbf, char *buf, CamelStreamBufferMode mode, int size) -{ - if (sbf->buf && !(sbf->flags & BUF_USER)) { - g_free(sbf->buf); - } - if (buf) { - sbf->buf = buf; - sbf->flags |= BUF_USER; - } else { - sbf->buf = g_malloc(size); - sbf->flags &= ~BUF_USER; - } - sbf->size = size; - sbf->mode = mode; -} - -static void -init_vbuf(CamelStreamBuffer *sbf, CamelStream *s, CamelStreamBufferMode mode, char *buf, guint32 size) -{ - set_vbuf(sbf, buf, mode, size); - if (sbf->stream) - camel_object_unref(CAMEL_OBJECT(sbf->stream)); - sbf->stream = s; - camel_object_ref(CAMEL_OBJECT(sbf->stream)); -} - -static void -init(CamelStreamBuffer *sbuf, CamelStream *s, CamelStreamBufferMode mode) -{ - init_vbuf(sbuf, s, mode, NULL, BUF_SIZE); -} - - -/** - * camel_stream_buffer_new: - * @stream: Existing stream to buffer. - * @mode: Operational mode of buffered stream. - * - * Create a new buffered stream of another stream. A default - * buffer size (1024 bytes), automatically managed will be used - * for buffering. - * - * See camel_stream_buffer_new_with_vbuf() for details on the - * @mode parameter. - * - * Return value: A newly created buffered stream. - **/ -CamelStream * -camel_stream_buffer_new (CamelStream *stream, CamelStreamBufferMode mode) -{ - CamelStreamBuffer *sbf; - sbf = CAMEL_STREAM_BUFFER (camel_object_new (camel_stream_buffer_get_type ())); - CAMEL_STREAM_BUFFER_CLASS (CAMEL_OBJECT_GET_CLASS(sbf))->init (sbf, stream, mode); - - return CAMEL_STREAM (sbf); -} - -/** - * camel_stream_buffer_new_with_vbuf: - * @stream: An existing stream to buffer. - * @mode: Mode to buffer in. - * @buf: Memory to use for buffering. - * @size: Size of buffer to use. - * - * Create a new stream which buffers another stream, @stream. - * - * The following values are available for @mode: - * - * CAMEL_STREAM_BUFFER_BUFFER, Buffer the input/output in blocks. - * CAMEL_STREAM_BUFFER_NEWLINE, Buffer on newlines (for output). - * CAMEL_STREAM_BUFFER_NONE, Perform no buffering. - * - * Note that currently this is ignored and CAMEL_STREAM_BUFFER_BUFFER - * is always used. - * - * In addition, one of the following mode options should be or'd - * together with the buffering mode: - * - * CAMEL_STREAM_BUFFER_WRITE, Buffer in write mode. - * CAMEL_STREAM_BUFFER_READ, Buffer in read mode. - * - * Buffering can only be done in one direction for any - * buffer instance. - * - * If @buf is non-NULL, then use the memory pointed to - * (for upto @size bytes) as the buffer for all buffering - * operations. It is upto the application to free this buffer. - * If @buf is NULL, then allocate and manage @size bytes - * for all buffering. - * - * Return value: A new stream with buffering applied. - **/ -CamelStream *camel_stream_buffer_new_with_vbuf (CamelStream *stream, CamelStreamBufferMode mode, char *buf, guint32 size) -{ - CamelStreamBuffer *sbf; - sbf = CAMEL_STREAM_BUFFER (camel_object_new (camel_stream_buffer_get_type ())); - CAMEL_STREAM_BUFFER_CLASS (CAMEL_OBJECT_GET_CLASS(sbf))->init_vbuf (sbf, stream, mode, buf, size); - - return CAMEL_STREAM (sbf); -} - -static ssize_t -stream_read (CamelStream *stream, char *buffer, size_t n) -{ - CamelStreamBuffer *sbf = CAMEL_STREAM_BUFFER (stream); - ssize_t bytes_read = 1; - ssize_t bytes_left; - char *bptr = buffer; - - g_return_val_if_fail( (sbf->mode & CAMEL_STREAM_BUFFER_MODE) == CAMEL_STREAM_BUFFER_READ, 0); - - while (n && bytes_read > 0) { - bytes_left = sbf->end - sbf->ptr; - if (bytes_left < n) { - if (bytes_left > 0) { - memcpy(bptr, sbf->ptr, bytes_left); - n -= bytes_left; - bptr += bytes_left; - sbf->ptr += bytes_left; - } - /* if we are reading a lot, then read directly to the destination buffer */ - if (n >= sbf->size/3) { - bytes_read = camel_stream_read(sbf->stream, bptr, n); - if (bytes_read>0) { - n -= bytes_read; - bptr += bytes_read; - } - } else { - bytes_read = camel_stream_read(sbf->stream, sbf->buf, sbf->size); - if (bytes_read>0) { - sbf->ptr = sbf->buf; - sbf->end = sbf->buf+bytes_read; - memcpy(bptr, sbf->ptr, n); - sbf->ptr += n; - bptr += n; - n -= bytes_read; - } - } - } else { - memcpy(bptr, sbf->ptr, bytes_left); - sbf->ptr += n; - bptr += n; - n = 0; - } - } - - return (ssize_t)(bptr - buffer); -} - -static ssize_t -stream_write (CamelStream *stream, const char *buffer, size_t n) -{ - CamelStreamBuffer *sbf = CAMEL_STREAM_BUFFER (stream); - const char *bptr = buffer; - ssize_t bytes_written = 1; - ssize_t bytes_left; - ssize_t total = n; - - g_return_val_if_fail( (sbf->mode & CAMEL_STREAM_BUFFER_MODE) == CAMEL_STREAM_BUFFER_WRITE, 0); - - while (n && bytes_written > 0) { - bytes_left = sbf->size - (sbf->ptr-sbf->buf); - if (bytes_left<n) { - memcpy(sbf->ptr, bptr, bytes_left); - n -= bytes_left; - bptr += bytes_left; - bytes_written = camel_stream_write(sbf->stream, sbf->buf, sbf->size); - sbf->ptr = sbf->buf; - /* if we are writing a lot, write directly to the stream */ - if (n >= sbf->size/3) { - bytes_written = camel_stream_write(sbf->stream, bptr, n); - if (bytes_written >0) { - bytes_written = n; - n -= bytes_written; - bptr += bytes_written; - } - } else { - memcpy(sbf->ptr, bptr, n); - sbf->ptr += n; - bptr += n; - n = 0; - } - } else { - memcpy(sbf->ptr, bptr, n); - sbf->ptr += n; - bptr += n; - n = 0; - } - } - if (bytes_written == -1) - return -1; - - return total; -} - -static int -stream_flush (CamelStream *stream) -{ - CamelStreamBuffer *sbf = CAMEL_STREAM_BUFFER (stream); - - if ((sbf->mode & CAMEL_STREAM_BUFFER_MODE) == CAMEL_STREAM_BUFFER_WRITE) { - int len = sbf->ptr-sbf->buf; - int written = camel_stream_write(sbf->stream, sbf->buf, len); - if (written > 0) - sbf->ptr += written; - if (written != len) - return -1; - } else { - /* nothing to do for read mode 'flush' */ - } - - return camel_stream_flush(sbf->stream); -} - -static int -stream_close (CamelStream *stream) -{ - CamelStreamBuffer *sbf = CAMEL_STREAM_BUFFER (stream); - - if (stream_flush(stream) == -1) - return -1; - return camel_stream_close(sbf->stream); -} - -static gboolean -stream_eos (CamelStream *stream) -{ - CamelStreamBuffer *sbf = CAMEL_STREAM_BUFFER (stream); - - return camel_stream_eos(sbf->stream) && sbf->ptr == sbf->end; -} - -/** - * camel_stream_buffer_gets: - * @sbf: A CamelStreamBuffer. - * @buf: Memory to write the string to. - * @max: Maxmimum number of characters to store. - * - * Read a line of characters up to the next newline character or - * @max characters. - * - * If the newline character is encountered, then it will be - * included in the buffer @buf. The buffer will be #NUL terminated. - * - * Return value: The number of characters read, or 0 for end of file, - * and -1 on error. - **/ -int camel_stream_buffer_gets(CamelStreamBuffer *sbf, char *buf, unsigned int max) -{ - register char *outptr, *inptr, *inend, c, *outend; - int bytes_read; - - outptr = buf; - inptr = sbf->ptr; - inend = sbf->end; - outend = buf+max-1; /* room for NUL */ - - do { - while (inptr<inend && outptr<outend) { - c = *inptr++; - *outptr++ = c; - if (c == '\n') { - *outptr = 0; - sbf->ptr = inptr; - return outptr-buf; - } - } - if (outptr == outend) - break; - - bytes_read = camel_stream_read(sbf->stream, sbf->buf, sbf->size); - if (bytes_read == -1) - return -1; - inptr = sbf->ptr = sbf->buf; - inend = sbf->end = sbf->buf + bytes_read; - } while (bytes_read>0); - - sbf->ptr = inptr; - if (outptr <= outend) - *outptr = 0; - - return (int)(outptr - buf); -} - -/** - * camel_stream_buffer_read_line: read a complete line from the stream - * @sbf: A CamelStreamBuffer - * - * This function reads a complete newline-terminated line from the stream - * and returns it in allocated memory. The trailing newline (and carriage - * return if any) are not included in the returned string. - * - * Return value: the line read, which the caller must free when done with, - * or NULL on eof. If an error occurs, @ex will be set. - **/ -char * -camel_stream_buffer_read_line (CamelStreamBuffer *sbf) -{ - unsigned char *p; - int nread; - - p = sbf->linebuf; - - while (1) { - nread = camel_stream_buffer_gets (sbf, p, sbf->linesize - (p - sbf->linebuf)); - if (nread <=0) { - if (p > sbf->linebuf) - break; - return NULL; - } - - p += nread; - if (p[-1] == '\n') - break; - - nread = p - sbf->linebuf; - sbf->linesize *= 2; - sbf->linebuf = g_realloc (sbf->linebuf, sbf->linesize); - p = sbf->linebuf + nread; - } - - p--; - if (p[-1] == '\r') - p--; - p[0] = 0; - - return g_strdup(sbf->linebuf); -} - - - - - - diff --git a/camel/camel-stream-buffer.h b/camel/camel-stream-buffer.h deleted file mode 100644 index 5c9037595a..0000000000 --- a/camel/camel-stream-buffer.h +++ /dev/null @@ -1,109 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-stream-buffer.h :stream which buffers another stream */ - -/* - * - * Author : - * Michael Zucchi <notzed@helixcode.com> - * - * Copyright 2000 Helix Code Inc. (http://www.helixcode.com) . - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_STREAM_BUFFER_H -#define CAMEL_STREAM_BUFFER_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-seekable-stream.h> -#include <stdio.h> - -#define CAMEL_STREAM_BUFFER_TYPE (camel_stream_buffer_get_type ()) -#define CAMEL_STREAM_BUFFER(obj) (CAMEL_CHECK_CAST((obj), CAMEL_STREAM_BUFFER_TYPE, CamelStreamBuffer)) -#define CAMEL_STREAM_BUFFER_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_STREAM_BUFFER_TYPE, CamelStreamBufferClass)) -#define CAMEL_IS_STREAM_BUFFER(o) (CAMEL_CHECK_TYPE((o), CAMEL_STREAM_BUFFER_TYPE)) - -typedef enum -{ - CAMEL_STREAM_BUFFER_BUFFER = 0, - CAMEL_STREAM_BUFFER_NEWLINE, - CAMEL_STREAM_BUFFER_NONE, - CAMEL_STREAM_BUFFER_READ = 0x00, - CAMEL_STREAM_BUFFER_WRITE = 0x80, - CAMEL_STREAM_BUFFER_MODE = 0x80 -} CamelStreamBufferMode; - -struct _CamelStreamBuffer -{ - CamelStream parent_object; - - /* these are all of course, private */ - CamelStream *stream; - - unsigned char *buf, *ptr, *end; - int size; - - unsigned char *linebuf; /* for reading lines at a time */ - int linesize; - - CamelStreamBufferMode mode; - unsigned int flags; /* internal flags */ -}; - - -typedef struct { - CamelStreamClass parent_class; - - /* Virtual methods */ - void (*init) (CamelStreamBuffer *stream_buffer, CamelStream *stream, - CamelStreamBufferMode mode); - void (*init_vbuf) (CamelStreamBuffer *stream_buffer, - CamelStream *stream, CamelStreamBufferMode mode, - char *buf, guint32 size); - -} CamelStreamBufferClass; - - -/* Standard Camel function */ -CamelType camel_stream_buffer_get_type (void); - - -/* public methods */ -CamelStream *camel_stream_buffer_new (CamelStream *s, - CamelStreamBufferMode mode); -CamelStream *camel_stream_buffer_new_with_vbuf (CamelStream *s, - CamelStreamBufferMode mode, - char *buf, guint32 size); - -/* unimplemented - CamelStream *camel_stream_buffer_set_vbuf (CamelStreamBuffer *b, CamelStreamBufferMode mode, char *buf, guint32 size); */ - -/* read a line of characters */ -int camel_stream_buffer_gets (CamelStreamBuffer *b, char *buf, unsigned int max); - -char *camel_stream_buffer_read_line (CamelStreamBuffer *sbf); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_STREAM_BUFFER_H */ diff --git a/camel/camel-stream-filter.c b/camel/camel-stream-filter.c deleted file mode 100644 index 211db36e7f..0000000000 --- a/camel/camel-stream-filter.c +++ /dev/null @@ -1,384 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "camel-stream-filter.h" - -#define d(x) -/*#include <stdio.h>*/ - -struct _filter { - struct _filter *next; - int id; - CamelMimeFilter *filter; -}; - -struct _CamelStreamFilterPrivate { - struct _filter *filters; - int filterid; /* next filter id */ - - char *realbuffer; /* buffer - READ_PAD */ - char *buffer; /* READ_SIZE bytes */ - - char *filtered; /* the filtered data */ - size_t filteredlen; - - int last_was_read; /* was the last op read or write? */ -}; - -#define READ_PAD (64) /* bytes padded before buffer */ -#define READ_SIZE (4096) - -#define _PRIVATE(o) (((CamelStreamFilter *)(o))->priv) - -static void camel_stream_filter_class_init (CamelStreamFilterClass *klass); -static void camel_stream_filter_init (CamelStreamFilter *obj); - -static ssize_t do_read (CamelStream *stream, char *buffer, size_t n); -static ssize_t do_write (CamelStream *stream, const char *buffer, size_t n); -static int do_flush (CamelStream *stream); -static int do_close (CamelStream *stream); -static gboolean do_eos (CamelStream *stream); -static int do_reset (CamelStream *stream); - -static CamelStreamClass *camel_stream_filter_parent; - -static void -camel_stream_filter_class_init (CamelStreamFilterClass *klass) -{ - CamelStreamClass *camel_stream_class = (CamelStreamClass *) klass; - - camel_stream_filter_parent = CAMEL_STREAM_CLASS (camel_type_get_global_classfuncs (camel_stream_get_type ())); - - camel_stream_class->read = do_read; - camel_stream_class->write = do_write; - camel_stream_class->flush = do_flush; - camel_stream_class->close = do_close; - camel_stream_class->eos = do_eos; - camel_stream_class->reset = do_reset; - -} - -static void -camel_stream_filter_init (CamelStreamFilter *obj) -{ - struct _CamelStreamFilterPrivate *p; - - _PRIVATE(obj) = p = g_malloc0(sizeof(*p)); - p->realbuffer = g_malloc(READ_SIZE + READ_PAD); - p->buffer = p->realbuffer + READ_PAD; - p->last_was_read = TRUE; -} - -static void -camel_stream_filter_finalize(CamelObject *o) -{ - CamelStreamFilter *filter = (CamelStreamFilter *)o; - struct _CamelStreamFilterPrivate *p = _PRIVATE(filter); - struct _filter *fn, *f; - - f = p->filters; - while (f) { - fn = f->next; - camel_object_unref((CamelObject *)f->filter); - g_free(f); - f = fn; - } - g_free(p->realbuffer); - g_free(p); - camel_object_unref((CamelObject *)filter->source); -} - - -CamelType -camel_stream_filter_get_type (void) -{ - static CamelType type = CAMEL_INVALID_TYPE; - - if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register (CAMEL_STREAM_TYPE, "CamelStreamFilter", - sizeof (CamelStreamFilter), - sizeof (CamelStreamFilterClass), - (CamelObjectClassInitFunc) camel_stream_filter_class_init, - NULL, - (CamelObjectInitFunc) camel_stream_filter_init, - (CamelObjectFinalizeFunc) camel_stream_filter_finalize); - } - - return type; -} - - -/** - * camel_stream_filter_new: - * - * Create a new CamelStreamFilter object. - * - * Return value: A new CamelStreamFilter object. - **/ -CamelStreamFilter * -camel_stream_filter_new_with_stream(CamelStream *stream) -{ - CamelStreamFilter *new = CAMEL_STREAM_FILTER ( camel_object_new (camel_stream_filter_get_type ())); - - new->source = stream; - camel_object_ref ((CamelObject *)stream); - - return new; -} - - -/** - * camel_stream_filter_add: - * @filter: Initialised CamelStreamFilter. - * @mf: Filter to perform processing on stream. - * - * Add a new CamelMimeFilter to execute during the processing of this - * stream. Each filter added is processed after the previous one. - * - * Note that a filter should only be added to a single stream - * at a time, otherwise unpredictable results may occur. - * - * Return value: A filter id for this CamelStreamFilter. - **/ -int -camel_stream_filter_add(CamelStreamFilter *filter, CamelMimeFilter *mf) -{ - struct _CamelStreamFilterPrivate *p = _PRIVATE(filter); - struct _filter *fn, *f; - - fn = g_malloc(sizeof(*fn)); - fn->id = p->filterid++; - fn->filter = mf; - camel_object_ref((CamelObject *)mf); - - /* sure, we could use a GList, but we wouldn't save much */ - f = (struct _filter *)&p->filters; - while (f->next) - f = f->next; - f->next = fn; - fn->next = NULL; - return fn->id; -} - -/** - * camel_stream_filter_remove: - * @filter: Initialised CamelStreamFilter. - * @id: Filter id, as returned from camel_stream_filter_add(). - * - * Remove a processing filter from the stream, by id. - **/ -void -camel_stream_filter_remove(CamelStreamFilter *filter, int id) -{ - struct _CamelStreamFilterPrivate *p = _PRIVATE(filter); - struct _filter *fn, *f; - - f = (struct _filter *)&p->filters; - while (f && f->next) { - fn = f->next; - if (fn->id == id) { - f->next = fn->next; - camel_object_unref((CamelObject *)fn->filter); - g_free(fn); - } - f = f->next; - } -} - -static ssize_t -do_read (CamelStream *stream, char *buffer, size_t n) -{ - CamelStreamFilter *filter = (CamelStreamFilter *)stream; - struct _CamelStreamFilterPrivate *p = _PRIVATE(filter); - ssize_t size; - struct _filter *f; - - p->last_was_read = TRUE; - - if (p->filteredlen<=0) { - int presize = READ_SIZE; - - size = camel_stream_read(filter->source, p->buffer, READ_SIZE); - if (size <= 0) { - /* this is somewhat untested */ - if (camel_stream_eos(filter->source)) { - f = p->filters; - p->filtered = p->buffer; - p->filteredlen = 0; - while (f) { - camel_mime_filter_complete(f->filter, p->filtered, p->filteredlen, - presize, &p->filtered, &p->filteredlen, &presize); - f = f->next; - } - size = p->filteredlen; - } - if (size <= 0) - return size; - } else { - f = p->filters; - p->filtered = p->buffer; - p->filteredlen = size; - - d(printf ("\n\nOriginal content: '")); - d(fwrite(p->filtered, sizeof(char), p->filteredlen, stdout)); - d(printf("'\n")); - - while (f) { - camel_mime_filter_filter(f->filter, p->filtered, p->filteredlen, presize, - &p->filtered, &p->filteredlen, &presize); - - d(printf ("Filtered content (%s): '", - camel_type_to_name(((CamelObject *)f->filter)->s.type))); - d(fwrite(p->filtered, sizeof(char), p->filteredlen, stdout)); - d(printf("'\n")); - - f = f->next; - } - } - } - - size = MIN(n, p->filteredlen); - memcpy(buffer, p->filtered, size); - p->filteredlen -= size; - p->filtered += size; - - return size; -} - -/* Note: Since the caller expects to write out as much as they asked us to - write (for 'success'), we return what they asked us to write (for 'success') - rather than the true number of written bytes */ -static ssize_t -do_write (CamelStream *stream, const char *buf, size_t n) -{ - CamelStreamFilter *filter = (CamelStreamFilter *)stream; - struct _CamelStreamFilterPrivate *p = _PRIVATE(filter); - struct _filter *f; - int presize; - char *buffer = (char *)buf; - size_t len = n; - - p->last_was_read = FALSE; - - d(printf ("\n\nWriting: Original content: '")); - d(fwrite(buffer, sizeof(char), len, stdout)); - d(printf("'\n")); - - f = p->filters; - presize = 0; - while (f) { - camel_mime_filter_filter(f->filter, buffer, len, presize, &buffer, &len, &presize); - - d(printf ("Filtered content (%s): '", - camel_type_to_name(((CamelObject *)f->filter)->s.type))); - d(fwrite(buffer, sizeof(char), len, stdout)); - d(printf("'\n")); - - f = f->next; - } - - if (camel_stream_write(filter->source, buffer, len) != len) - return -1; - - return n; -} - -static int -do_flush (CamelStream *stream) -{ - CamelStreamFilter *filter = (CamelStreamFilter *)stream; - struct _CamelStreamFilterPrivate *p = _PRIVATE(filter); - struct _filter *f; - char *buffer; - int len, presize; - - if (p->last_was_read) { - g_warning("Flushing a filter stream without writing to it"); - return 0; - } - - buffer = ""; - len = 0; - presize = 0; - f = p->filters; - - d(printf ("\n\nFlushing: Original content: '")); - d(fwrite(buffer, sizeof(char), len, stdout)); - d(printf("'\n")); - - while (f) { - camel_mime_filter_complete(f->filter, buffer, len, presize, &buffer, &len, &presize); - - d(printf ("Filtered content (%s): '", - camel_type_to_name(((CamelObject *)f->filter)->s.type))); - d(fwrite(buffer, sizeof(char), len, stdout)); - d(printf("'\n")); - - f = f->next; - } - if (len > 0 && camel_stream_write(filter->source, buffer, len) == -1) - return -1; - return camel_stream_flush(filter->source); -} - -static int -do_close (CamelStream *stream) -{ - CamelStreamFilter *filter = (CamelStreamFilter *)stream; - struct _CamelStreamFilterPrivate *p = _PRIVATE(filter); - - if (!p->last_was_read) { - do_flush(stream); - } - return camel_stream_close(filter->source); -} - -static gboolean -do_eos (CamelStream *stream) -{ - CamelStreamFilter *filter = (CamelStreamFilter *)stream; - struct _CamelStreamFilterPrivate *p = _PRIVATE(filter); - - if (p->filteredlen > 0) - return FALSE; - - return camel_stream_eos(filter->source); -} - -static int -do_reset (CamelStream *stream) -{ - CamelStreamFilter *filter = (CamelStreamFilter *)stream; - struct _CamelStreamFilterPrivate *p = _PRIVATE(filter); - struct _filter *f; - - p->filteredlen = 0; - - /* and reset filters */ - f = p->filters; - while (f) { - camel_mime_filter_reset(f->filter); - f = f->next; - } - - return camel_stream_reset(filter->source); -} - diff --git a/camel/camel-stream-filter.h b/camel/camel-stream-filter.h deleted file mode 100644 index d0683135c7..0000000000 --- a/camel/camel-stream-filter.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef _CAMEL_STREAM_FILTER_H -#define _CAMEL_STREAM_FILTER_H - -#include <camel/camel-stream.h> -#include <camel/camel-mime-filter.h> - -#define CAMEL_STREAM_FILTER(obj) CAMEL_CHECK_CAST (obj, camel_stream_filter_get_type (), CamelStreamFilter) -#define CAMEL_STREAM_FILTER_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_stream_filter_get_type (), CamelStreamFilterClass) -#define IS_CAMEL_STREAM_FILTER(obj) CAMEL_CHECK_TYPE (obj, camel_stream_filter_get_type ()) - -typedef struct _CamelStreamFilterClass CamelStreamFilterClass; - -struct _CamelStreamFilter { - CamelStream parent; - - CamelStream *source; - - struct _CamelStreamFilterPrivate *priv; -}; - -struct _CamelStreamFilterClass { - CamelStreamClass parent_class; -}; - -guint camel_stream_filter_get_type (void); - -CamelStreamFilter *camel_stream_filter_new_with_stream (CamelStream *stream); - -int camel_stream_filter_add (CamelStreamFilter *filter, CamelMimeFilter *); -void camel_stream_filter_remove (CamelStreamFilter *filter, int id); - -#endif /* ! _CAMEL_STREAM_FILTER_H */ diff --git a/camel/camel-stream-fs.c b/camel/camel-stream-fs.c deleted file mode 100644 index 17c6b98e08..0000000000 --- a/camel/camel-stream-fs.c +++ /dev/null @@ -1,298 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */ -/* camel-stream-fs.c : file system based stream */ - -/* - * Authors: Bertrand Guiheneuf <bertrand@helixcode.com> - * Michael Zucchi <notzed@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> -#include "camel-stream-fs.h" -#include <unistd.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <errno.h> -#include <string.h> - -static CamelSeekableStreamClass *parent_class = NULL; - -/* Returns the class for a CamelStreamFS */ -#define CSFS_CLASS(so) CAMEL_STREAM_FS_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - -static ssize_t stream_read (CamelStream *stream, char *buffer, size_t n); -static ssize_t stream_write (CamelStream *stream, const char *buffer, size_t n); -static int stream_flush (CamelStream *stream); -static int stream_close (CamelStream *stream); -static off_t stream_seek (CamelSeekableStream *stream, off_t offset, - CamelStreamSeekPolicy policy); - -static void -camel_stream_fs_class_init (CamelStreamFsClass *camel_stream_fs_class) -{ - CamelSeekableStreamClass *camel_seekable_stream_class = - CAMEL_SEEKABLE_STREAM_CLASS (camel_stream_fs_class); - CamelStreamClass *camel_stream_class = - CAMEL_STREAM_CLASS (camel_stream_fs_class); - - parent_class = CAMEL_SEEKABLE_STREAM_CLASS (camel_type_get_global_classfuncs (camel_seekable_stream_get_type ())); - - /* virtual method overload */ - camel_stream_class->read = stream_read; - camel_stream_class->write = stream_write; - camel_stream_class->flush = stream_flush; - camel_stream_class->close = stream_close; - - camel_seekable_stream_class->seek = stream_seek; -} - -static void -camel_stream_fs_init (gpointer object, gpointer klass) -{ - CamelStreamFs *stream = CAMEL_STREAM_FS (object); - - stream->fd = -1; -} - -static void -camel_stream_fs_finalize (CamelObject *object) -{ - CamelStreamFs *stream_fs = CAMEL_STREAM_FS (object); - - if (stream_fs->fd != -1) - close (stream_fs->fd); -} - - -CamelType -camel_stream_fs_get_type (void) -{ - static CamelType camel_stream_fs_type = CAMEL_INVALID_TYPE; - - if (camel_stream_fs_type == CAMEL_INVALID_TYPE) { - camel_stream_fs_type = camel_type_register (camel_seekable_stream_get_type (), "CamelStreamFs", - sizeof (CamelStreamFs), - sizeof (CamelStreamFsClass), - (CamelObjectClassInitFunc) camel_stream_fs_class_init, - NULL, - (CamelObjectInitFunc) camel_stream_fs_init, - (CamelObjectFinalizeFunc) camel_stream_fs_finalize); - } - - return camel_stream_fs_type; -} - -/** - * camel_stream_fs_new_with_fd: - * @fd: a file descriptor - * - * Returns a stream associated with the given file descriptor. - * When the stream is destroyed, the file descriptor will be closed. - * - * Return value: the stream - **/ -CamelStream * -camel_stream_fs_new_with_fd (int fd) -{ - CamelStreamFs *stream_fs; - off_t offset; - - stream_fs = CAMEL_STREAM_FS (camel_object_new (camel_stream_fs_get_type ())); - stream_fs->fd = fd; - offset = lseek (fd, 0, SEEK_CUR); - if (offset == -1) - offset = 0; - CAMEL_SEEKABLE_STREAM (stream_fs)->position = offset; - - return CAMEL_STREAM (stream_fs); -} - -/** - * camel_stream_fs_new_with_fd_and_bounds: - * @fd: a file descriptor - * @start: the first valid position in the file - * @end: the first invalid position in the file, or CAMEL_STREAM_UNBOUND - * - * Returns a stream associated with the given file descriptor and bounds. - * When the stream is destroyed, the file descriptor will be closed. - * - * Return value: the stream - **/ -CamelStream * -camel_stream_fs_new_with_fd_and_bounds (int fd, off_t start, off_t end) -{ - CamelStream *stream; - - stream = camel_stream_fs_new_with_fd (fd); - camel_seekable_stream_set_bounds (CAMEL_SEEKABLE_STREAM (stream), start, end); - - return stream; -} - -/** - * camel_stream_fs_new_with_name: - * @name: a local filename - * @flags: flags as in open(2) - * @mode: a file mode - * - * Creates a new CamelStream corresponding to the named file, flags, - * and mode. - * - * Return value: the stream, or #NULL on error. - **/ -CamelStream * -camel_stream_fs_new_with_name (const char *name, int flags, mode_t mode) -{ - int fd; - - fd = open (name, flags, mode); - if (fd == -1) { - return NULL; - } - - return camel_stream_fs_new_with_fd (fd); -} - -/** - * camel_stream_fs_new_with_name_and_bounds: - * @name: a local filename - * @flags: flags as in open(2) - * @mode: a file mode - * @start: the first valid position in the file - * @end: the first invalid position in the file, or CAMEL_STREAM_UNBOUND - * - * Creates a new CamelStream corresponding to the given arguments. - * - * Return value: the stream, or NULL on error. - **/ -CamelStream * -camel_stream_fs_new_with_name_and_bounds (const char *name, int flags, - mode_t mode, off_t start, off_t end) -{ - CamelStream *stream; - - stream = camel_stream_fs_new_with_name (name, flags, mode); - if (stream == NULL) - return NULL; - - camel_seekable_stream_set_bounds (CAMEL_SEEKABLE_STREAM (stream), - start, end); - - return stream; -} - - -static ssize_t -stream_read (CamelStream *stream, char *buffer, size_t n) -{ - CamelStreamFs *stream_fs = CAMEL_STREAM_FS (stream); - CamelSeekableStream *seekable = CAMEL_SEEKABLE_STREAM (stream); - ssize_t nread; - - if (seekable->bound_end != CAMEL_STREAM_UNBOUND) - n = MIN (seekable->bound_end - seekable->position, n); - - do { - nread = read (stream_fs->fd, buffer, n); - } while (nread == -1 && errno == EINTR); - - if (nread > 0) - seekable->position += nread; - else if (nread == 0) - stream->eos = TRUE; - - return nread; -} - -static ssize_t -stream_write (CamelStream *stream, const char *buffer, size_t n) -{ - CamelStreamFs *stream_fs = CAMEL_STREAM_FS (stream); - CamelSeekableStream *seekable = CAMEL_SEEKABLE_STREAM (stream); - ssize_t v, written = 0; - - if (seekable->bound_end != CAMEL_STREAM_UNBOUND) - n = MIN (seekable->bound_end - seekable->position, n); - - do { - v = write (stream_fs->fd, buffer, n); - if (v > 0) - written += v; - } while (v == -1 && errno == EINTR); - - if (written > 0) - seekable->position += written; - else if (v == -1) - return -1; - - return written; -} - -static int -stream_flush (CamelStream *stream) -{ - return fsync(((CamelStreamFs *)stream)->fd); -} - -static int -stream_close (CamelStream *stream) -{ - return close(((CamelStreamFs *)stream)->fd); -} - -static off_t -stream_seek (CamelSeekableStream *stream, off_t offset, CamelStreamSeekPolicy policy) -{ - CamelStreamFs *stream_fs = CAMEL_STREAM_FS (stream); - off_t real = 0; - - switch (policy) { - case CAMEL_STREAM_SET: - real = offset; - break; - case CAMEL_STREAM_CUR: - real = stream->position + offset; - break; - case CAMEL_STREAM_END: - if (stream->bound_end != CAMEL_STREAM_UNBOUND) { - real = lseek(stream_fs->fd, offset, SEEK_END); - if (real != -1) - stream->position = real; - return real; - } - real = stream->bound_end + offset; - break; - } - - if (stream->bound_end != CAMEL_STREAM_UNBOUND) - real = MIN (real, stream->bound_end); - real = MAX (real, stream->bound_start); - - real = lseek(stream_fs->fd, real, SEEK_SET); - if (real == -1) - return -1; - - if (real != stream->position && ((CamelStream *)stream)->eos) - ((CamelStream *)stream)->eos = FALSE; - - stream->position = real; - - return real; -} diff --git a/camel/camel-stream-fs.h b/camel/camel-stream-fs.h deleted file mode 100644 index ea403f584f..0000000000 --- a/camel/camel-stream-fs.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-stream-fs.h :stream based on unix filesystem */ - -/* - * Author: - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_STREAM_FS_H -#define CAMEL_STREAM_FS_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-seekable-stream.h> - -/* for open flags */ -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> - -#define CAMEL_STREAM_FS_TYPE (camel_stream_fs_get_type ()) -#define CAMEL_STREAM_FS(obj) (CAMEL_CHECK_CAST((obj), CAMEL_STREAM_FS_TYPE, CamelStreamFs)) -#define CAMEL_STREAM_FS_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_STREAM_FS_TYPE, CamelStreamFsClass)) -#define CAMEL_IS_STREAM_FS(o) (CAMEL_CHECK_TYPE((o), CAMEL_STREAM_FS_TYPE)) - -struct _CamelStreamFs -{ - CamelSeekableStream parent_object; - - int fd; /* file descriptor on the underlying file */ -}; - -typedef struct { - CamelSeekableStreamClass parent_class; - -} CamelStreamFsClass; - -/* Standard Camel function */ -CamelType camel_stream_fs_get_type (void); - -/* public methods */ -CamelStream * camel_stream_fs_new_with_name (const char *name, int flags, mode_t mode); -CamelStream * camel_stream_fs_new_with_name_and_bounds (const char *name, int flags, mode_t mode, - off_t start, off_t end); - -CamelStream * camel_stream_fs_new_with_fd (int fd); -CamelStream * camel_stream_fs_new_with_fd_and_bounds (int fd, off_t start, off_t end); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_STREAM_FS_H */ diff --git a/camel/camel-stream-mem.c b/camel/camel-stream-mem.c deleted file mode 100644 index 77941894b7..0000000000 --- a/camel/camel-stream-mem.c +++ /dev/null @@ -1,249 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-stream-mem.c: memory buffer based stream */ - -/* - * Authors: Bertrand Guiheneuf <bertrand@helixcode.com> - * Michael Zucchi <notzed@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> -#include "camel-stream-mem.h" -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <errno.h> - -static CamelSeekableStreamClass *parent_class = NULL; - -/* Returns the class for a CamelStreamMem */ -#define CSM_CLASS(so) CAMEL_STREAM_MEM_CLASS(CAMEL_OBJECT_GET_CLASS(so)) - -static ssize_t stream_read (CamelStream *stream, char *buffer, size_t n); -static ssize_t stream_write (CamelStream *stream, const char *buffer, size_t n); -static gboolean stream_eos (CamelStream *stream); -static off_t stream_seek (CamelSeekableStream *stream, off_t offset, - CamelStreamSeekPolicy policy); - -static void camel_stream_mem_finalize (CamelObject *object); - -static void -camel_stream_mem_class_init (CamelStreamMemClass *camel_stream_mem_class) -{ - CamelSeekableStreamClass *camel_seekable_stream_class = - CAMEL_SEEKABLE_STREAM_CLASS (camel_stream_mem_class); - CamelStreamClass *camel_stream_class = - CAMEL_STREAM_CLASS (camel_stream_mem_class); - - parent_class = CAMEL_SEEKABLE_STREAM_CLASS( camel_type_get_global_classfuncs( CAMEL_SEEKABLE_STREAM_TYPE ) ); - - /* virtual method overload */ - camel_stream_class->read = stream_read; - camel_stream_class->write = stream_write; - camel_stream_class->eos = stream_eos; - - camel_seekable_stream_class->seek = stream_seek; -} - -static void -camel_stream_mem_init (CamelObject *object) -{ - CamelStreamMem *stream_mem = CAMEL_STREAM_MEM (object); - - stream_mem->owner = FALSE; - stream_mem->buffer = 0; -} - -CamelType -camel_stream_mem_get_type (void) -{ - static CamelType camel_stream_mem_type = CAMEL_INVALID_TYPE; - - if (camel_stream_mem_type == CAMEL_INVALID_TYPE) { - camel_stream_mem_type = camel_type_register( CAMEL_SEEKABLE_STREAM_TYPE, - "CamelStreamMem", - sizeof( CamelStreamMem ), - sizeof( CamelStreamMemClass ), - (CamelObjectClassInitFunc) camel_stream_mem_class_init, - NULL, - (CamelObjectInitFunc) camel_stream_mem_init, - (CamelObjectFinalizeFunc) camel_stream_mem_finalize ); - } - - return camel_stream_mem_type; -} - - -CamelStream * -camel_stream_mem_new (void) -{ - return camel_stream_mem_new_with_byte_array (g_byte_array_new ()); -} - -CamelStream * -camel_stream_mem_new_with_buffer (const char *buffer, size_t len) -{ - GByteArray *ba; - - ba = g_byte_array_new (); - g_byte_array_append (ba, (const guint8 *)buffer, len); - return camel_stream_mem_new_with_byte_array (ba); -} - -CamelStream * -camel_stream_mem_new_with_byte_array (GByteArray *byte_array) -{ - CamelStreamMem *stream_mem; - - stream_mem = CAMEL_STREAM_MEM( camel_object_new (CAMEL_STREAM_MEM_TYPE) ); - stream_mem->buffer = byte_array; - stream_mem->owner = TRUE; - - return CAMEL_STREAM (stream_mem); -} - -/* note: with these functions the caller is the 'owner' of the buffer */ -void camel_stream_mem_set_byte_array (CamelStreamMem *s, GByteArray *buffer) -{ - if (s->buffer && s->owner) - g_byte_array_free(s->buffer, TRUE); - s->owner = FALSE; - s->buffer = buffer; -} - -void camel_stream_mem_set_buffer (CamelStreamMem *s, const char *buffer, - size_t len) -{ - GByteArray *ba; - - ba = g_byte_array_new (); - g_byte_array_append (ba, (const guint8 *)buffer, len); - camel_stream_mem_set_byte_array(s, ba); -} - -static void -camel_stream_mem_finalize (CamelObject *object) -{ - CamelStreamMem *stream_mem = CAMEL_STREAM_MEM (object); - - if (stream_mem->buffer && stream_mem->owner) - g_byte_array_free (stream_mem->buffer, TRUE); - - /* Will be called automagically in the Camel Type System! - * Wheeee! - * G_TK_OBJECT_CLASS (parent_class)->finalize (object); - */ -} - -static ssize_t -stream_read (CamelStream *stream, char *buffer, size_t n) -{ - CamelStreamMem *camel_stream_mem = CAMEL_STREAM_MEM (stream); - CamelSeekableStream *seekable = CAMEL_SEEKABLE_STREAM (stream); - ssize_t nread; - - if (seekable->bound_end != CAMEL_STREAM_UNBOUND) - n = MIN(seekable->bound_end - seekable->position, n); - - nread = MIN (n, camel_stream_mem->buffer->len - seekable->position); - if (nread > 0) { - memcpy (buffer, camel_stream_mem->buffer->data + - seekable->position, nread); - seekable->position += nread; - } else - nread = -1; - - return nread; -} - -static ssize_t -stream_write (CamelStream *stream, const char *buffer, size_t n) -{ - CamelStreamMem *stream_mem = CAMEL_STREAM_MEM (stream); - CamelSeekableStream *seekable = CAMEL_SEEKABLE_STREAM (stream); - ssize_t nwrite = n; - - if (seekable->bound_end != CAMEL_STREAM_UNBOUND) - nwrite = MIN(seekable->bound_end - seekable->position, n); - -#ifndef NO_WARNINGS -#warning "g_byte_arrays use g_malloc and so are totally unsuitable for this object" -#endif - if (seekable->position == stream_mem->buffer->len) { - stream_mem->buffer = - g_byte_array_append (stream_mem->buffer, (const guint8 *)buffer, nwrite); - } else { - g_byte_array_set_size (stream_mem->buffer, - nwrite + stream_mem->buffer->len); - memcpy (stream_mem->buffer->data + seekable->position, buffer, nwrite); - } - seekable->position += nwrite; - - return nwrite; -} - -static gboolean -stream_eos (CamelStream *stream) -{ - CamelStreamMem *stream_mem = CAMEL_STREAM_MEM (stream); - CamelSeekableStream *seekable_stream = CAMEL_SEEKABLE_STREAM (stream); - - return stream_mem->buffer->len <= seekable_stream->position; -} - -static off_t -stream_seek (CamelSeekableStream *stream, off_t offset, - CamelStreamSeekPolicy policy) -{ - off_t position; - CamelStreamMem *stream_mem = CAMEL_STREAM_MEM (stream); - - switch (policy) { - case CAMEL_STREAM_SET: - position = offset; - break; - case CAMEL_STREAM_CUR: - position = stream->position + offset; - break; - case CAMEL_STREAM_END: - position = (stream_mem->buffer)->len + offset; - break; - default: - position = offset; - break; - } - - if (stream->bound_end != CAMEL_STREAM_UNBOUND) - position = MIN (position, stream->bound_end); - if (stream->bound_start != CAMEL_STREAM_UNBOUND) - position = MAX (position, 0); - else - position = MAX (position, stream->bound_start); - - if (position > stream_mem->buffer->len) { - int oldlen = stream_mem->buffer->len; - g_byte_array_set_size (stream_mem->buffer, position); - memset (stream_mem->buffer->data + oldlen, 0, - position - oldlen); - } - - stream->position = position; - - return position; -} diff --git a/camel/camel-stream-mem.h b/camel/camel-stream-mem.h deleted file mode 100644 index 422d05426c..0000000000 --- a/camel/camel-stream-mem.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-stream-mem.h: stream based on memory buffer */ - -/* - * Authors: Bertrand Guiheneuf <bertrand@helixcode.com> - * Michael Zucchi <notzed@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_STREAM_MEM_H -#define CAMEL_STREAM_MEM_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-seekable-stream.h> -#include <sys/types.h> - -#define CAMEL_STREAM_MEM_TYPE (camel_stream_mem_get_type ()) -#define CAMEL_STREAM_MEM(obj) (CAMEL_CHECK_CAST((obj), CAMEL_STREAM_MEM_TYPE, CamelStreamMem)) -#define CAMEL_STREAM_MEM_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_STREAM_MEM_TYPE, CamelStreamMemClass)) -#define CAMEL_IS_STREAM_MEM(o) (CAMEL_CHECK_TYPE((o), CAMEL_STREAM_MEM_TYPE)) - -typedef struct _CamelStreamMemClass CamelStreamMemClass; - -struct _CamelStreamMem { - CamelSeekableStream parent_object; - - gboolean owner; /* do we own the buffer? */ - GByteArray *buffer; -}; - -struct _CamelStreamMemClass { - CamelSeekableStreamClass parent_class; - - /* Virtual methods */ -}; - -/* Standard Camel function */ -CamelType camel_stream_mem_get_type (void); - -/* public methods */ -CamelStream *camel_stream_mem_new(void); -CamelStream *camel_stream_mem_new_with_byte_array(GByteArray *buffer); -CamelStream *camel_stream_mem_new_with_buffer(const char *buffer, size_t len); - -/* these are really only here for implementing classes */ -void camel_stream_mem_set_byte_array(CamelStreamMem *, GByteArray *buffer); -void camel_stream_mem_set_buffer(CamelStreamMem *, const char *buffer, size_t len); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_STREAM_MEM_H */ diff --git a/camel/camel-stream.c b/camel/camel-stream.c deleted file mode 100644 index f649494b2d..0000000000 --- a/camel/camel-stream.c +++ /dev/null @@ -1,289 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */ -/* camel-stream.c : abstract class for a stream */ - -/* - * Author: - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> -#include "camel-stream.h" - -static CamelObjectClass *parent_class = NULL; - -/* Returns the class for a CamelStream */ -#define CS_CLASS(so) CAMEL_STREAM_CLASS(CAMEL_OBJECT_GET_CLASS(so)) - -static int stream_flush (CamelStream *stream); -static int stream_close (CamelStream *stream); -static gboolean stream_eos (CamelStream *stream); - - -static void -camel_stream_class_init (CamelStreamClass *camel_stream_class) -{ - parent_class = camel_type_get_global_classfuncs( CAMEL_OBJECT_TYPE ); - - /* virtual method definition */ - camel_stream_class->flush = stream_flush; - camel_stream_class->close = stream_close; - camel_stream_class->eos = stream_eos; -} - -CamelType -camel_stream_get_type (void) -{ - static CamelType camel_stream_type = CAMEL_INVALID_TYPE; - - if (camel_stream_type == CAMEL_INVALID_TYPE) { - camel_stream_type = camel_type_register( CAMEL_OBJECT_TYPE, - "CamelStream", - sizeof( CamelStream ), - sizeof( CamelStreamClass ), - (CamelObjectClassInitFunc) camel_stream_class_init, - NULL, - NULL, - NULL ); - } - - return camel_stream_type; -} - -/** - * camel_stream_read: - * @stream: a CamelStream. - * @buffer: buffer where bytes pulled from the stream are stored. - * @n: max number of bytes to read. - * - * Read at most @n bytes from the @stream object and stores them - * in the buffer pointed at by @buffer. - * - * Return value: number of bytes actually read, or -1 on error and - * set errno. - **/ -ssize_t -camel_stream_read (CamelStream *stream, char *buffer, size_t n) -{ - g_return_val_if_fail (CAMEL_IS_STREAM (stream), -1); - g_return_val_if_fail (n == 0 || buffer, -1); - - return CS_CLASS (stream)->read (stream, buffer, n); -} - -/** - * camel_stream_write: - * @stream: a CamelStream object. - * @buffer: buffer to write. - * @n: number of bytes to write - * - * Write @n bytes from the buffer pointed at by @buffer into @stream. - * - * Return value: the number of bytes actually written to the stream, - * or -1 on error. - **/ -ssize_t -camel_stream_write (CamelStream *stream, const char *buffer, size_t n) -{ - g_return_val_if_fail (CAMEL_IS_STREAM (stream), -1); - g_return_val_if_fail (n == 0 || buffer, -1); - - return CS_CLASS (stream)->write (stream, buffer, n); -} - - -static int -stream_flush (CamelStream *stream) -{ - /* nothing */ - return 0; -} - -/** - * camel_stream_flush: - * @stream: a CamelStream object - * - * Flushes the contents of the stream to its backing store. Only meaningful - * on writable streams. - * - * Return value: -1 on error. - **/ -int -camel_stream_flush (CamelStream *stream) -{ - g_return_val_if_fail (CAMEL_IS_STREAM (stream), -1); - - return CS_CLASS (stream)->flush (stream); -} - - -static int -stream_close (CamelStream *stream) -{ - /* nothing */ - return 0; -} - -/** - * camel_stream_close: - * @stream: - * - * Close a stream. - * - * Return value: -1 on error. - **/ -int -camel_stream_close (CamelStream *stream) -{ - g_return_val_if_fail (CAMEL_IS_STREAM (stream), -1); - - return CS_CLASS (stream)->close (stream); -} - - -static gboolean -stream_eos (CamelStream *stream) -{ - return stream->eos; -} - -/** - * camel_stream_eos: - * @stream: a CamelStream object - * - * Test if there are bytes left to read on the @stream object. - * - * Return value: %TRUE if all the contents on the stream has been read, or - * %FALSE if information is still available. - **/ -gboolean -camel_stream_eos (CamelStream *stream) -{ - g_return_val_if_fail (CAMEL_IS_STREAM (stream), TRUE); - - return CS_CLASS (stream)->eos (stream); -} - - -/** - * camel_stream_reset: reset a stream - * @stream: the stream object - * - * Reset a stream. That is, put it in a state where it can be read - * from the beginning again. Not all streams in Camel are seekable, - * but they must all be resettable. - * - * Return value: -1 on error. - **/ -int -camel_stream_reset (CamelStream *stream) -{ - g_return_val_if_fail (CAMEL_IS_STREAM (stream), -1); - - return CS_CLASS (stream)->reset (stream); -} - -/***************** Utility functions ********************/ - -/** - * camel_stream_write_string: - * @stream: a stream object - * @string: a string - * - * Writes the string to the stream. - * - * Return value: the number of characters output, -1 on error. - **/ -ssize_t -camel_stream_write_string (CamelStream *stream, const char *string) -{ - return camel_stream_write (stream, string, strlen (string)); -} - -/** - * camel_stream_printf: - * @stream: a stream object - * @fmt: a printf-style format string - * - * This printfs the given data to @stream. - * - * Return value: the number of characters output, -1 on error. - **/ -ssize_t -camel_stream_printf (CamelStream *stream, const char *fmt, ... ) -{ - va_list args; - char *string; - int ret; - - g_return_val_if_fail (CAMEL_IS_STREAM (stream), -1); - - va_start (args, fmt); - string = g_strdup_vprintf (fmt, args); - va_end (args); - - if (!string) - return -1; - - ret = camel_stream_write (stream, string, strlen (string)); - g_free (string); - return ret; -} - -/** - * camel_stream_write_to_stream: - * @stream: Source CamelStream. - * @output_stream: Destination CamelStream. - * - * Write all of a stream (until eos) into another stream, in a blocking - * fashion. - * - * Return value: Returns -1 on error, or the number of bytes succesfully - * copied across streams. - **/ -ssize_t -camel_stream_write_to_stream (CamelStream *stream, CamelStream *output_stream) -{ - char tmp_buf[4096]; - ssize_t total = 0; - ssize_t nb_read; - ssize_t nb_written; - - g_return_val_if_fail (CAMEL_IS_STREAM (stream), -1); - g_return_val_if_fail (CAMEL_IS_STREAM (output_stream), -1); - - while (!camel_stream_eos (stream)) { - nb_read = camel_stream_read (stream, tmp_buf, sizeof (tmp_buf)); - if (nb_read < 0) - return -1; - else if (nb_read > 0) { - nb_written = 0; - - while (nb_written < nb_read) { - ssize_t len = camel_stream_write (output_stream, tmp_buf + nb_written, - nb_read - nb_written); - if (len < 0) - return -1; - nb_written += len; - } - total += nb_written; - } - } - return total; -} diff --git a/camel/camel-stream.h b/camel/camel-stream.h deleted file mode 100644 index dec4e638e1..0000000000 --- a/camel/camel-stream.h +++ /dev/null @@ -1,91 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */ -/* camel-stream.h : class for an abstract stream */ - -/* - * Author: - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_STREAM_H -#define CAMEL_STREAM_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-object.h> -#include <stdarg.h> -#include <unistd.h> - -#define CAMEL_STREAM_TYPE (camel_stream_get_type ()) -#define CAMEL_STREAM(obj) (CAMEL_CHECK_CAST((obj), CAMEL_STREAM_TYPE, CamelStream)) -#define CAMEL_STREAM_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_STREAM_TYPE, CamelStreamClass)) -#define CAMEL_IS_STREAM(o) (CAMEL_CHECK_TYPE((o), CAMEL_STREAM_TYPE)) - -struct _CamelStream -{ - CamelObject parent_object; - - gboolean eos; -}; - -typedef struct { - CamelObjectClass parent_class; - - /* Virtual methods */ - - ssize_t (*read) (CamelStream *stream, char *buffer, size_t n); - ssize_t (*write) (CamelStream *stream, const char *buffer, size_t n); - int (*close) (CamelStream *stream); - int (*flush) (CamelStream *stream); - gboolean (*eos) (CamelStream *stream); - int (*reset) (CamelStream *stream); - -} CamelStreamClass; - -/* Standard Camel function */ -CamelType camel_stream_get_type (void); - -/* public methods */ -ssize_t camel_stream_read (CamelStream *stream, char *buffer, size_t n); -ssize_t camel_stream_write (CamelStream *stream, const char *buffer, size_t n); -int camel_stream_flush (CamelStream *stream); -int camel_stream_close (CamelStream *stream); -gboolean camel_stream_eos (CamelStream *stream); -int camel_stream_reset (CamelStream *stream); - -/* utility macros and funcs */ -ssize_t camel_stream_write_string (CamelStream *stream, const char *string); -ssize_t camel_stream_printf (CamelStream *stream, const char *fmt, ... ) G_GNUC_PRINTF (2, 3); -ssize_t camel_stream_vprintf (CamelStream *stream, const char *fmt, va_list ap); - -/* Write a whole stream to another stream, until eof or error on - * either stream. - */ -ssize_t camel_stream_write_to_stream (CamelStream *stream, CamelStream *output_stream); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_STREAM_H */ diff --git a/camel/camel-transport.c b/camel/camel-transport.c deleted file mode 100644 index ff07728f5f..0000000000 --- a/camel/camel-transport.c +++ /dev/null @@ -1,104 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-transport.c : Abstract class for an email transport */ - -/* - * - * Author : - * Dan Winship <danw@helixcode.com> - * - * Copyright 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ -#include <config.h> -#include "camel-transport.h" -#include "camel-exception.h" - -/* Returns the class for a CamelTransport */ -#define CT_CLASS(so) CAMEL_TRANSPORT_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - -CamelType -camel_transport_get_type (void) -{ - static CamelType camel_transport_type = CAMEL_INVALID_TYPE; - - if (camel_transport_type == CAMEL_INVALID_TYPE) { - camel_transport_type = camel_type_register (CAMEL_SERVICE_TYPE, "CamelTransport", - sizeof (CamelTransport), - sizeof (CamelTransportClass), - NULL, - NULL, - NULL, - NULL); - } - - return camel_transport_type; -} - - -/** - * camel_transport_can_send: Determine if a message is send-able on a transport - * @transport: the transport - * @message: the message - * - * Determines if a CamelMedium is of an appropriate subclass to send - * via the given @transport. (Mail transports are not able to send - * netnews articles, and vice versa.) - * - * Return value: TRUE or FALSE - **/ -gboolean -camel_transport_can_send (CamelTransport *transport, CamelMedium *message) -{ - return CT_CLASS (transport)->can_send (transport, message); -} - -/** - * camel_transport_send: Send a message via a transport - * @transport: the transport - * @message: the message - * @ex: a CamelException - * - * Sends the message to the recipients indicated in the message. - * - * Return value: success or failure. - **/ -gboolean -camel_transport_send (CamelTransport *transport, CamelMedium *message, - CamelException *ex) -{ - return CT_CLASS (transport)->send (transport, message, ex); -} - -/** - * camel_transport_send_to: Send a message non-standard recipients - * @transport: the transport - * @message: the message - * @recipients: the recipients - * @ex: a CamelException - * - * Sends the message to the given recipients, rather than to the - * recipients indicated in the message. - * - * Return value: success or failure. - **/ -gboolean -camel_transport_send_to (CamelTransport *transport, CamelMedium *message, - GList *recipients, CamelException *ex) -{ - return CT_CLASS (transport)->send_to (transport, message, - recipients, ex); -} diff --git a/camel/camel-transport.h b/camel/camel-transport.h deleted file mode 100644 index 48ab0ea1ff..0000000000 --- a/camel/camel-transport.h +++ /dev/null @@ -1,86 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-transport.h : Abstract class for an email transport */ - -/* - * - * Author : - * Dan Winship <danw@helixcode.com> - * - * Copyright 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_TRANSPORT_H -#define CAMEL_TRANSPORT_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-service.h> - -#define CAMEL_TRANSPORT_TYPE (camel_transport_get_type ()) -#define CAMEL_TRANSPORT(obj) (CAMEL_CHECK_CAST((obj), CAMEL_TRANSPORT_TYPE, CamelTransport)) -#define CAMEL_TRANSPORT_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_TRANSPORT_TYPE, CamelTransportClass)) -#define CAMEL_IS_TRANSPORT(o) (CAMEL_CHECK_TYPE((o), CAMEL_TRANSPORT_TYPE)) - - -struct _CamelTransport -{ - CamelService parent_object; - - gboolean supports_8bit; -}; - - - -typedef struct { - CamelServiceClass parent_class; - - gboolean (*can_send) (CamelTransport *transport, CamelMedium *message); - gboolean (*send) (CamelTransport *transport, CamelMedium *message, - CamelException *ex); - gboolean (*send_to) (CamelTransport *transport, - CamelMedium *message, GList *recipients, - CamelException *ex); -} CamelTransportClass; - - -/* public methods */ -gboolean camel_transport_can_send (CamelTransport *transport, - CamelMedium *message); - -gboolean camel_transport_send (CamelTransport *transport, - CamelMedium *message, - CamelException *ex); - -gboolean camel_transport_send_to (CamelTransport *transport, - CamelMedium *message, - GList *recipients, - CamelException *ex); - -/* Standard Camel function */ -CamelType camel_transport_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_TRANSPORT_H */ diff --git a/camel/camel-types.h b/camel/camel-types.h deleted file mode 100644 index 79abc26a7d..0000000000 --- a/camel/camel-types.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * Copyright 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef CAMEL_TYPES_H -#define CAMEL_TYPES_H 1 - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -typedef struct _CamelAddress CamelAddress; -typedef struct _CamelDataWrapper CamelDataWrapper; -typedef struct _CamelException CamelException; -typedef struct _CamelFolder CamelFolder; -typedef struct _CamelFolderSearch CamelFolderSearch; -typedef struct _CamelFolderSummary CamelFolderSummary; -typedef struct _CamelInternetAddress CamelInternetAddress; -typedef struct _CamelMedium CamelMedium; -typedef struct _CamelMimeFilter CamelMimeFilter; -typedef struct _CamelMimeFilterBasic CamelMimeFilterBasic; -typedef struct _CamelMimeFilterCharset CamelMimeFilterCharset; -typedef struct _CamelMimeFilterIndex CamelMimeFilterIndex; -typedef struct _CamelMimeFilterLinewrap CamelMimeFilterLinewrap; -typedef struct _CamelMimeFilterSave CamelMimeFilterSave; -typedef struct _CamelMimeFilterCRLF CamelMimeFilterCRLF; -typedef struct _CamelMimeMessage CamelMimeMessage; -typedef struct _CamelMimeParser CamelMimeParser; -typedef struct _CamelMimePart CamelMimePart; -typedef struct _CamelMultipart CamelMultipart; -typedef struct _CamelNewsAddress CamelNewsAddress; -typedef struct _CamelSeekableStream CamelSeekableStream; -typedef struct _CamelSeekableSubstream CamelSeekableSubstream; -typedef struct _CamelService CamelService; -typedef struct _CamelSession CamelSession; -typedef struct _CamelSimpleDataWrapper CamelSimpleDataWrapper; -typedef struct _CamelStore CamelStore; -typedef struct _CamelStream CamelStream; -typedef struct _CamelStreamBuffer CamelStreamBuffer; -typedef struct _CamelStreamDataWrapper CamelStreamDataWrapper; -typedef struct _CamelStreamFilter CamelStreamFilter; -typedef struct _CamelStreamFs CamelStreamFs; -typedef struct _CamelStreamMem CamelStreamMem; -typedef struct _CamelTransport CamelTransport; - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_TYPES_H */ - - - diff --git a/camel/camel-uid-cache.c b/camel/camel-uid-cache.c deleted file mode 100644 index 2b5faddb91..0000000000 --- a/camel/camel-uid-cache.c +++ /dev/null @@ -1,186 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-uid-cache.c: UID caching code. */ - -/* - * Authors: - * Dan Winship <danw@helixcode.com> - * - * Copyright 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "config.h" -#include "camel-uid-cache.h" - -#include <errno.h> -#include <fcntl.h> -#include <string.h> -#include <sys/stat.h> -#include <unistd.h> - -static void free_uid (gpointer key, gpointer value, gpointer data); -static void maybe_write_uid (gpointer key, gpointer value, gpointer data); - -/** - * camel_uid_cache_new: - * @filename: path to load the cache from - * - * Creates a new UID cache, initialized from @filename. If @filename - * doesn't already exist, the UID cache will be empty. Otherwise, if - * it does exist but can't be read, the function will return %NULL. - * - * Return value: a new UID cache, or %NULL - **/ -CamelUIDCache * -camel_uid_cache_new (const char *filename) -{ - CamelUIDCache *cache; - struct stat st; - char *buf, **uids; - int fd, i; - - fd = open (filename, O_RDWR | O_CREAT, 0700); - if (fd == -1) - return NULL; - - if (fstat (fd, &st) != 0) { - close (fd); - return NULL; - } - buf = g_malloc (st.st_size + 1); - - if (read (fd, buf, st.st_size) == -1) { - close (fd); - g_free (buf); - return NULL; - } - buf[st.st_size] = '\0'; - - cache = g_new (CamelUIDCache, 1); - cache->fd = fd; - cache->level = 1; - cache->uids = g_hash_table_new (g_str_hash, g_str_equal); - - uids = g_strsplit (buf, "\n", 0); - g_free (buf); - for (i = 0; uids[i]; i++) { - g_hash_table_insert (cache->uids, uids[i], - GINT_TO_POINTER (cache->level)); - } - g_free (uids); - - return cache; -} - -/** - * camel_uid_cache_save: - * @cache: a CamelUIDCache - * - * Attempts to save @cache back to disk. - * - * Return value: success or failure - **/ -gboolean -camel_uid_cache_save (CamelUIDCache *cache) -{ - if (lseek (cache->fd, 0, SEEK_SET) != 0) - return FALSE; - g_hash_table_foreach (cache->uids, maybe_write_uid, cache); - return ftruncate (cache->fd, lseek (cache->fd, 0, SEEK_CUR)) == 0; -} - -static void -maybe_write_uid (gpointer key, gpointer value, gpointer data) -{ - CamelUIDCache *cache = data; - - if (GPOINTER_TO_INT (value) == cache->level) { - write (cache->fd, key, strlen (key)); - write (cache->fd, "\n", 1); - } -} - -/** - * camel_uid_cache_destroy: - * @cache: a CamelUIDCache - * - * Destroys @cache and frees its data. - **/ -void -camel_uid_cache_destroy (CamelUIDCache *cache) -{ - g_hash_table_foreach (cache->uids, free_uid, NULL); - g_hash_table_destroy (cache->uids); - close (cache->fd); - g_free (cache); -} - -static void -free_uid (gpointer key, gpointer value, gpointer data) -{ - g_free (key); -} - -/** - * camel_uid_cache_get_new_uids: - * @cache: a CamelUIDCache - * @uids: an array of UIDs - * - * Returns an array of UIDs from @uids that are not in @cache, and - * removes UIDs from @cache that aren't in @uids. - * - * Return value: an array of new UIDs, which must be freed with - * camel_uid_cache_free_uids(). - **/ -GPtrArray * -camel_uid_cache_get_new_uids (CamelUIDCache *cache, GPtrArray *uids) -{ - GPtrArray *new_uids; - char *uid; - int i; - - new_uids = g_ptr_array_new (); - cache->level++; - - for (i = 0; i < uids->len; i++) { - uid = uids->pdata[i]; - if (g_hash_table_lookup (cache->uids, uid)) - g_hash_table_remove (cache->uids, uid); - else - g_ptr_array_add (new_uids, g_strdup (uid)); - g_hash_table_insert (cache->uids, g_strdup (uid), - GINT_TO_POINTER (cache->level)); - } - - return new_uids; -} - -/** - * camel_uid_cache_free_uids: - * @uids: an array returned from camel_uid_cache_get_new_uids() - * - * Frees the array of UIDs. - **/ -void -camel_uid_cache_free_uids (GPtrArray *uids) -{ - int i; - - for (i = 0; i < uids->len; i++) - g_free (uids->pdata[i]); - g_ptr_array_free (uids, TRUE); -} diff --git a/camel/camel-uid-cache.h b/camel/camel-uid-cache.h deleted file mode 100644 index 92226a3afd..0000000000 --- a/camel/camel-uid-cache.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-uid-cache.h: UID caching code. */ - -/* - * Authors: - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef CAMEL_UID_CACHE_H -#define CAMEL_UID_CACHE_H 1 - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#include <glib.h> -#include <stdio.h> - -typedef struct { - int fd, level; - GHashTable *uids; -} CamelUIDCache; - -CamelUIDCache *camel_uid_cache_new (const char *filename); -gboolean camel_uid_cache_save (CamelUIDCache *cache); -void camel_uid_cache_destroy (CamelUIDCache *cache); - -GPtrArray *camel_uid_cache_get_new_uids (CamelUIDCache *cache, - GPtrArray *uids); -void camel_uid_cache_free_uids (GPtrArray *uids); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* CAMEL_UID_CACHE_H */ diff --git a/camel/camel-url.c b/camel/camel-url.c deleted file mode 100644 index 18575782dc..0000000000 --- a/camel/camel-url.c +++ /dev/null @@ -1,375 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-url.c : utility functions to parse URLs */ - - -/* - * Authors: - * Bertrand Guiheneuf <bertrand@helixcode.com> - * Dan Winship <danw@helixcode.com> - * Tiago Antào <tiagoantao@bigfoot.com> - * Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> - -#include <ctype.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "camel-url.h" -#include "camel-mime-utils.h" -#include "camel-exception.h" -#include "camel-object.h" - -/** - * camel_url_new: create a CamelURL object from a string - * @url_string: The string containing the URL to scan - * - * This routine takes a string and parses it as a URL of the form: - * - * protocol://user;AUTH=mech:password@host:port/path - * - * The protocol, followed by a ":" is required. If it is followed by * "//", - * there must be an "authority" containing at least a host, - * which ends at the end of the string or at the next "/". If there - * is an "@" in the authority, there must be a username before it, - * and the host comes after it. The authmech, password, and port are - * optional, and the punctuation that preceeds them is omitted if - * they are. Everything after the authority (or everything after the - * protocol if there was no authority) is the path. We consider the - * "/" between the authority and the path to be part of the path, - * although this is incorrect according to RFC 1738. - * - * The port, if present, must be numeric. - * - * If nothing but the protocol (and the ":") is present, the "empty" - * flag will be set on the returned URL. - * - * Return value: a CamelURL structure containing the URL items. - **/ -CamelURL * -camel_url_new (const char *url_string, CamelException *ex) -{ - CamelURL *url; - char *semi, *colon, *at, *slash; - char *p; - - /* Find protocol: initial substring until ":" */ - colon = strchr (url_string, ':'); - if (!colon) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID, - _("URL string `%s' contains no protocol"), - url_string); - return NULL; - } - - url = g_new0 (CamelURL, 1); - url->protocol = g_strndup (url_string, colon - url_string); - g_strdown (url->protocol); - - /* Check protocol */ - p = url->protocol; - while (*p) { - if (!((*p >= 'a' && *p <= 'z') || - (*p == '-') || (*p == '+') || (*p == '.'))) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID, - _("URL string `%s' contains an invalid protocol"), - url_string); - return NULL; - } - p++; - } - - if (strncmp (colon, "://", 3) != 0) { - if (*(colon + 1)) { - url->path = g_strdup (colon + 1); - camel_url_decode (url->path); - } else - url->empty = TRUE; - return url; - } - - url_string = colon + 3; - - /* If there is an @ sign in the authority, look for user, - * authmech, and password before it. - */ - slash = strchr (url_string, '/'); - at = strchr (url_string, '@'); - if (at && (!slash || at < slash)) { - colon = strchr (url_string, ':'); - if (colon && colon < at) { - url->passwd = g_strndup (colon + 1, at - colon - 1); - camel_url_decode (url->passwd); - } else { - url->passwd = NULL; - colon = at; - } - - semi = strchr(url_string, ';'); - if (semi && (semi < colon || (!colon && semi < at)) && - !strncasecmp (semi, ";auth=", 6)) { - url->authmech = g_strndup (semi + 6, - colon - semi - 6); - camel_url_decode (url->authmech); - } else { - url->authmech = NULL; - semi = colon; - } - - url->user = g_strndup (url_string, semi - url_string); - camel_url_decode (url->user); - url_string = at + 1; - } else - url->user = url->passwd = url->authmech = NULL; - - /* Find host and port. */ - slash = strchr (url_string, '/'); - colon = strchr (url_string, ':'); - if (slash && colon > slash) - colon = NULL; - - if (colon) { - url->host = g_strndup (url_string, colon - url_string); - url->port = strtoul (colon + 1, &colon, 10); - if (*colon && colon != slash) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID, - _("Port number in URL `%s' is non-" - "numeric"), url_string); - camel_url_free (url); - return NULL; - } - } else if (slash) { - url->host = g_strndup (url_string, slash - url_string); - camel_url_decode (url->host); - url->port = 0; - } else { - url->host = g_strdup (url_string); - camel_url_decode (url->host); - url->port = 0; - } - - if (!slash) - slash = "/"; - url->path = g_strdup (slash); - camel_url_decode (url->path); - - return url; -} - -char * -camel_url_to_string (CamelURL *url, gboolean show_passwd) -{ - char *return_result; - char *user = NULL, *authmech = NULL, *passwd = NULL; - char *host = NULL, *path = NULL; - char port[20]; - - if (url->user) - user = camel_url_encode (url->user, TRUE, ":;@/"); - - if (url->authmech) - authmech = camel_url_encode (url->authmech, TRUE, ":@/"); - - if (show_passwd && url->passwd) - passwd = camel_url_encode (url->passwd, TRUE, "@/"); - - if (url->host) - host = camel_url_encode (url->host, TRUE, ":/"); - - if (url->port) - g_snprintf (port, sizeof (port), "%d", url->port); - else - *port = '\0'; - - if (url->path) - path = camel_url_encode (url->path, FALSE, NULL); - - return_result = g_strdup_printf ("%s:%s%s%s%s%s%s%s%s%s%s%s%s", - url->protocol, - host ? "//" : "", - user ? user : "", - authmech ? ";auth=" : "", - authmech ? authmech : "", - passwd ? ":" : "", - passwd ? passwd : "", - user ? "@" : "", - host ? host : "", - *port ? ":" : "", - port, - path && host && *path != '/' ? "/" : "", - path ? path : ""); - g_free (user); - g_free (authmech); - g_free (passwd); - g_free (host); - g_free (path); - - return return_result; -} - -void -camel_url_free (CamelURL *url) -{ - g_assert (url); - - g_free (url->protocol); - g_free (url->user); - g_free (url->authmech); - g_free (url->passwd); - g_free (url->host); - g_free (url->path); - - g_free (url); -} - -void camel_url_set_protocol(CamelURL *url, const char *p) -{ - g_free(url->protocol); - url->protocol = g_strdup(p); -} - -void camel_url_set_host(CamelURL *url, const char *h) -{ - g_free(url->host); - url->host = g_strdup(h); -} - -void camel_url_set_port(CamelURL *url, int port) -{ - url->port = port; -} -void camel_url_set_path(CamelURL *url, const char *p) -{ - g_free(url->path); - url->path = g_strdup(p); -} - - -/** - * camel_url_encode: - * @part: a URL part - * @escape_unsafe: whether or not to %-escape "unsafe" characters. - * ("%#<>{}|\^~[]`) - * @escape_extra: additional characters to escape. - * - * This %-encodes the given URL part and returns the escaped version - * in allocated memory, which the caller must free when it is done. - **/ -char * -camel_url_encode (char *part, gboolean escape_unsafe, char *escape_extra) -{ - char *work, *p; - - /* worst case scenario = 3 times the initial */ - p = work = g_malloc (3 * strlen (part) + 1); - - while (*part) { - if (((guchar) *part >= 127) || ((guchar) *part <= ' ') || - (escape_unsafe && strchr ("\"%#<>{}|\\^~[]`", *part)) || - (escape_extra && strchr (escape_extra, *part))) { - sprintf (p, "%%%.02hX", (guchar) *part++); - p += 3; - } else - *p++ = *part++; - } - *p = '\0'; - - return work; -} - -#define HEXVAL(c) (isdigit (c) ? (c) - '0' : tolower (c) - 'a' + 10) - -/** - * camel_url_decode: - * @part: a URL part - * - * %-decodes the passed-in URL *in place*. The decoded version is - * never longer than the encoded version, so there does not need to - * be any additional space at the end of the string. - */ -void -camel_url_decode (char *part) -{ - guchar *s, *d; - - s = d = (guchar *)part; - while (*s) { - if (*s == '%') { - if (isxdigit (s[1]) && isxdigit (s[2])) { - *d++ = HEXVAL (s[1]) * 16 + HEXVAL (s[2]); - s += 3; - } else - *d++ = *s++; - } else - *d++ = *s++; - } - *d = '\0'; -} - -static void -add_hash (guint *hash, char *s) -{ - if (s) - *hash ^= g_str_hash(s); -} - -guint camel_url_hash (const void *v) -{ - const CamelURL *u = v; - guint hash = 0; - - add_hash (&hash, u->protocol); - add_hash (&hash, u->user); - add_hash (&hash, u->authmech); - add_hash (&hash, u->host); - add_hash (&hash, u->path); - hash ^= u->port; - - return hash; -} - -static int -check_equal (char *s1, char *s2) -{ - if (s1 == NULL) { - if (s2 == NULL) - return TRUE; - else - return FALSE; - } - - if (s2 == NULL) - return FALSE; - - return strcmp (s1, s2) == 0; -} - -int camel_url_equal(const void *v, const void *v2) -{ - const CamelURL *u1 = v, *u2 = v2; - - return check_equal(u1->protocol, u2->protocol) - && check_equal(u1->user, u2->user) - && check_equal(u1->authmech, u2->authmech) - && check_equal(u1->host, u2->host) - && check_equal(u1->path, u2->path) - && u1->port == u2->port; -} diff --git a/camel/camel-url.h b/camel/camel-url.h deleted file mode 100644 index aba903c08b..0000000000 --- a/camel/camel-url.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-url.h : utility functions to parse URLs */ - -/* - * Authors: - * Bertrand Guiheneuf <bertrand@helixcode.com> - * Dan Winship <danw@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_URL_H -#define CAMEL_URL_H 1 - -#include <glib.h> -#include <camel/camel-types.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -typedef struct { - char *protocol; - char *user; - char *authmech; - char *passwd; - char *host; - int port; - char *path; - - /* This is set if the URL contained only a protocol. */ - gboolean empty; -} CamelURL; - -CamelURL *camel_url_new (const char *url_string, CamelException *ex); -char *camel_url_to_string (CamelURL *url, gboolean show_password); -void camel_url_free (CamelURL *url); - -char *camel_url_encode (char *part, gboolean escape_unsafe, char *escape_extra); -void camel_url_decode (char *part); - -/* for editing url's */ -void camel_url_set_protocol(CamelURL *url, const char *); -void camel_url_set_host(CamelURL *url, const char *); -void camel_url_set_port(CamelURL *url, int port); -void camel_url_set_path(CamelURL *url, const char *); - -/* for putting url's into hash tables */ -guint camel_url_hash (const void *v); -int camel_url_equal(const void *v, const void *v2); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* URL_UTIL_H */ diff --git a/camel/camel.c b/camel/camel.c deleted file mode 100644 index 846d946b9a..0000000000 --- a/camel/camel.c +++ /dev/null @@ -1,49 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> -#include "camel.h" -#include <unicode.h> - -gboolean camel_verbose_debug = FALSE; - -gint -camel_init(void) -{ -#ifdef ENABLE_THREADS -#ifdef G_THREADS_ENABLED - g_thread_init (NULL); -#else /* G_THREADS_ENABLED */ - printf ("Threads are not supported by your version of glib\n"); -#endif /* G_THREADS_ENABLED */ -#endif /* ENABLE_THREADS */ - - if (getenv ("CAMEL_VERBOSE_DEBUG")) - camel_verbose_debug = TRUE; - - unicode_init (); - - return 0; -} diff --git a/camel/camel.h b/camel/camel.h deleted file mode 100644 index fefadafb18..0000000000 --- a/camel/camel.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_H -#define CAMEL_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-data-wrapper.h> -#include <camel/camel-exception.h> -#include <camel/camel-folder.h> -#include <camel/camel-medium.h> -#include <camel/camel-mime-filter-basic.h> -#include <camel/camel-mime-filter-charset.h> -#include <camel/camel-mime-filter-index.h> -#include <camel/camel-mime-filter-save.h> -#include <camel/camel-mime-filter-crlf.h> -#include <camel/camel-mime-filter.h> -#include <camel/camel-mime-message.h> -#include <camel/camel-mime-parser.h> -#include <camel/camel-mime-part-utils.h> -#include <camel/camel-mime-part.h> -#include <camel/camel-mime-utils.h> -#include <camel/camel-movemail.h> -#include <camel/camel-multipart.h> -#include <camel/camel-provider.h> -#include <camel/camel-seekable-stream.h> -#include <camel/camel-seekable-substream.h> -#include <camel/camel-service.h> -#include <camel/camel-session.h> -#include <camel/camel-store.h> -#include <camel/camel-stream-buffer.h> -#include <camel/camel-stream-filter.h> -#include <camel/camel-stream-fs.h> -#include <camel/camel-stream-mem.h> -#include <camel/camel-stream.h> -#include <camel/camel-transport.h> -#include <camel/camel-uid-cache.h> -#include <camel/camel-url.h> -#include <camel/gmime-content-field.h> -#include <camel/gstring-util.h> -#include <camel/hash-table-utils.h> -#include <camel/string-utils.h> - -gint camel_init (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_H */ diff --git a/camel/devel-docs/camel_data_wrapper.dia b/camel/devel-docs/camel_data_wrapper.dia Binary files differdeleted file mode 100644 index 301563d1ee..0000000000 --- a/camel/devel-docs/camel_data_wrapper.dia +++ /dev/null diff --git a/camel/devel-docs/camel_parser_states.dia b/camel/devel-docs/camel_parser_states.dia Binary files differdeleted file mode 100644 index 556a5b1c49..0000000000 --- a/camel/devel-docs/camel_parser_states.dia +++ /dev/null diff --git a/camel/devel-docs/camel_stream.dia b/camel/devel-docs/camel_stream.dia Binary files differdeleted file mode 100644 index d91d1bb153..0000000000 --- a/camel/devel-docs/camel_stream.dia +++ /dev/null diff --git a/camel/gmime-content-field.c b/camel/gmime-content-field.c deleted file mode 100644 index 4d38314873..0000000000 --- a/camel/gmime-content-field.c +++ /dev/null @@ -1,237 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* mime-content_field.c : mime content type field utilities */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> -#include "gmime-content-field.h" -#include "string-utils.h" -#include <string.h> -#include "camel-mime-utils.h" - -/** - * gmime_content_field_new: Creates a new GMimeContentField object - * @type: mime type - * @subtype: mime subtype - * - * Creates a GMimeContentField object and initialize it with - * a mime type and a mime subtype. For example, - * gmime_content_field_new ("application", "postcript"); - * will create a content field with complete mime type - * "application/postscript" - * - * Return value: The newly created GMimeContentField object - **/ -GMimeContentField * -gmime_content_field_new (const gchar *type, const gchar *subtype) -{ - GMimeContentField *ctf; - - ctf = g_new (GMimeContentField, 1); - ctf->content_type = header_content_type_new(type, subtype); - ctf->type = ctf->content_type->type; - ctf->subtype = ctf->content_type->subtype; - ctf->ref = 1; - return ctf; -} - -/** - * gmime_content_field_ref: add a reference to a GMimeContentField object - * @content_field: GMimeContentField object - * - * Tell a GMimeContentField object that something holds a reference - * on him. This, coupled with the corresponding - * gmime_content_field_unref() method allow several - * objects to use the same GMimeContentField object. - **/ -void -gmime_content_field_ref (GMimeContentField *content_field) -{ - content_field->ref += 1; - header_content_type_ref (content_field->content_type); -} - -/** - * gmime_content_field_unref: remove a reference to a GMimeContentField object - * @content_field: GMimeContentField object - * - * Tell a GMimeContentField object that something which - * was holding a reference to him does not need it anymore. - * When no more reference exist, the GMimeContentField object - * is freed using gmime_content_field_free(). - * - **/ -void -gmime_content_field_unref (GMimeContentField *content_field) -{ - if (!content_field) return; - - content_field->ref -= 1; - header_content_type_unref (content_field->content_type); - if (content_field->ref <= 0) - g_free (content_field); -} - - - -/** - * gmime_content_field_set_parameter: set a parameter for a GMimeContentField object - * @content_field: content field - * @attribute: parameter name - * @value: paramteter value - * - * set a parameter (called attribute in RFC 2045) of a content field. Meaningfull - * or valid parameters name depend on the content type object. For example, - * gmime_content_field_set_parameter (cf, "charset", "us-ascii"); - * will make sense for a "text/plain" content field but not for a - * "image/gif". This routine does not check parameter validity. - **/ -void -gmime_content_field_set_parameter (GMimeContentField *content_field, const gchar *attribute, const gchar *value) -{ - header_content_type_set_param(content_field->content_type, attribute, value); -} - -/** - * gmime_content_field_write_to_stream: write a mime content type to a stream - * @content_field: content type object - * @stream: the stream - * - * - **/ -void -gmime_content_field_write_to_stream (GMimeContentField *content_field, CamelStream *stream) -{ - char *txt; - - if (!content_field) - return; - - txt = header_content_type_format(content_field->content_type); - if (txt) { - camel_stream_printf (stream, "Content-Type: %s\n", txt); - g_free(txt); - } -} - -/** - * gmime_content_field_get_mime_type: return the mime type of the content field object - * @content_field: content field object - * - * A RFC 2045 content type field contains the mime type in the - * form "type/subtype" (example : "application/postscript") and some - * parameters (attribute/value pairs). This routine returns the mime type - * in a gchar object. THIS OBJECT MUST BE FREED BY THE CALLER. - * - * Return value: the mime type in the form "type/subtype" or NULL if not defined. - **/ -gchar * -gmime_content_field_get_mime_type (GMimeContentField *content_field) -{ - gchar *mime_type; - - if (!content_field->content_type->type) return NULL; - - if (content_field->content_type->subtype) - mime_type = g_strdup_printf ("%s/%s", content_field->content_type->type, content_field->content_type->subtype); - else - mime_type = g_strdup (content_field->content_type->type); - return mime_type; -} - -/** - * gmime_content_field_get_parameter: return the value of a mime type parameter - * @content_field: content field object - * @name: name of the parameter - * - * Returns the value of a parameter contained in the content field - * object. The content type is formed of a mime type, a mime subtype, - * and a parameter list. Each parameter is a name/value pair. This - * routine returns the value assiciated to a given name. - * When the parameter does not exist, NULL is returned. - * - * Return value: parameter value, or NULL if not found. - **/ -const gchar * -gmime_content_field_get_parameter (GMimeContentField *content_field, const gchar *name) -{ - g_assert (content_field); - - g_assert (name); - return header_content_type_param(content_field->content_type, name); -} - - - - -/** - * gmime_content_field_construct_from_string: construct a ContentType object by parsing a string. - * - * @content_field: content type object to construct - * @string: string containing the content type field - * - * Parse a string containing a content type field as defined in - * RFC 2045, and construct the corresponding ContentType object. - * The string is not modified and not used in the ContentType - * object. It can and must be freed by the calling part. - **/ -void -gmime_content_field_construct_from_string (GMimeContentField *content_field, const gchar *string) -{ - struct _header_content_type *new; - - g_assert (string); - g_assert (content_field); - - new = header_content_type_decode(string); - if (content_field->content_type) - header_content_type_unref(content_field->content_type); - - if (new == NULL) { - new = header_content_type_new(NULL, NULL); - g_warning("Cannot parse content-type string: %s", string); - } - content_field->content_type = new; - content_field->type = new->type; - content_field->subtype = new->subtype; -} - -/** - * gmime_content_field_is_type: - * @content_field: An initialised GMimeContentField. - * @type: MIME Major type name. - * @subtype: MIME subtype. - * - * Returns true if the content_field is of the type @type and subtype @subtype. - * If @subtype is the special wildcard "*", then it will match any type. - * - * If the @content_field is empty, then it will match "text/plain", or "text/ *". - * - * Return value: - **/ -int -gmime_content_field_is_type (GMimeContentField *content_field, const char *type, const char *subtype) -{ - return header_content_type_is(content_field->content_type, type, subtype); -} diff --git a/camel/gmime-content-field.h b/camel/gmime-content-field.h deleted file mode 100644 index 5a28d0fedb..0000000000 --- a/camel/gmime-content-field.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* mime-content_field.h : mime content type field utilities */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef GMIME_CONTENT_FIELD_H -#define GMIME_CONTENT_FIELD_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <glib.h> -#include <stdio.h> -#include <camel/camel-stream.h> -#include <camel/camel-mime-utils.h> - -typedef struct { - struct _header_content_type *content_type; - - /* these should be deprecated (use the accessors) */ - char *type; /* these are only copies of the ones in content_type */ - char *subtype; - - gint ref; - -} GMimeContentField; - -GMimeContentField *gmime_content_field_new (const gchar *type, const gchar *subtype); -void gmime_content_field_ref (GMimeContentField *content_field); -void gmime_content_field_unref (GMimeContentField *content_field); - -void gmime_content_field_set_parameter (GMimeContentField *content_field, const gchar *attribute, const gchar *value); -void gmime_content_field_write_to_stream (GMimeContentField *content_field, CamelStream *stream); -void gmime_content_field_construct_from_string (GMimeContentField *content_field, const gchar *string); -void gmime_content_field_free (GMimeContentField *content_field); -gchar * gmime_content_field_get_mime_type (GMimeContentField *content_field); -const gchar *gmime_content_field_get_parameter (GMimeContentField *content_field, const gchar *name); - -int gmime_content_field_is_type (GMimeContentField *content_field, const char *type, const char *subtype); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* GMIME_CONTENT_FIELD_H */ diff --git a/camel/gstring-util.c b/camel/gstring-util.c deleted file mode 100644 index a0c1345b71..0000000000 --- a/camel/gstring-util.c +++ /dev/null @@ -1,216 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* gstring-util : utilities for gstring object */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - - -#include <config.h> -#include "gstring-util.h" -#include <string.h> - -/** - * g_string_equals : test if two string are equal - * - * @string1 : first string - * @string2 : second string - * - * @Return Value : true if the strings equal, false otherwise - **/ -gboolean -g_string_equals (GString *string1, GString *string2) -{ - g_assert (string1); - g_assert (string2); - return !strcmp (string1->str, string2->str); -} - - - - -/** - * g_string_clone : clone a GString - * - * @string : the string to clone - * - * @Return Value : the clone ... - **/ -GString * -g_string_clone (GString *string) -{ - return g_string_new (string->str); -} - -/** - * g_string_append_g_string : append a GString to another GString - * - * @dest_string : string which will be appended - * @other_string : string to append - * - **/ -void -g_string_append_g_string(GString *dest_string, GString *other_string) -{ - g_assert(other_string); - g_assert(dest_string); - - if (other_string->len) - g_string_append(dest_string, other_string->str); -} - -/** - * g_string_equal_for_hash: test equality of two GStrings for hash tables - * @v: string 1 - * @v2: string 2 - * - * - * - * Return value: - **/ -gint -g_string_equal_for_hash (gconstpointer v, gconstpointer v2) -{ - return strcmp ( ((const GString*)v)->str, ((const GString*)v2)->str) == 0; -} - -gint -g_string_equal_for_glist (gconstpointer v, gconstpointer v2) -{ - return !strcmp ( ((const GString*)v)->str, ((const GString*)v2)->str) == 0; -} - - -/** - * g_string_hash: computes a hash value for a Gstring - * @v: Gstring object - * - * - * - * Return value: - **/ -guint -g_string_hash (gconstpointer v) -{ - return g_str_hash(((const GString*)v)->str); -} - - - - -/* utility func : frees a GString element in a GList */ -static void -__g_string_list_free_string (gpointer data, gpointer user_data) -{ - GString *string = (GString *)data; - g_string_free(string, TRUE); -} - - -void -g_string_list_free (GList *string_list) -{ - g_list_foreach(string_list, __g_string_list_free_string, NULL); - g_list_free(string_list); -} - - - - - - -GList * -g_string_split (GString *string, char sep, gchar *trim_chars, GStringTrimOption trim_options) -{ - GList *result = NULL; - gint first, last, pos; - gchar *str; - gchar *new_str; - GString *new_gstring; - - g_assert (string); - str = string->str; - if (!str) return NULL; - - first = 0; - last = strlen(str) - 1; - - /* strip leading and trailing separators */ - while ( (first<=last) && (str[first]==sep) ) - first++; - while ( (first<=last) && (str[last]==sep) ) - last--; - - - while (first<=last) { - pos = first; - /* find next separator */ - while ((pos<=last) && (str[pos]!=sep)) pos++; - if (first != pos) { - new_str = g_strndup (str+first, pos-first); - new_gstring = g_string_new (new_str); - g_free (new_str); - /* could do trimming in line to speed up this code */ - if (trim_chars) g_string_trim (new_gstring, trim_chars, trim_options); - result = g_list_append (result, new_gstring); - } - first = pos + 1; - } - - return result; -} - - -void -g_string_trim (GString *string, gchar *chars, GStringTrimOption options) -{ - gint first_ok; - gint last_ok; - guint length; - gchar *str; - - if ((!string) || (!string->str)) - return; - str = string->str; - length = strlen (str); - if (!length) - return; - - first_ok = 0; - last_ok = length - 1; - - if (options & GSTRING_TRIM_STRIP_LEADING) - while ( (first_ok <= last_ok) && (strchr (chars, str[first_ok])) ) - first_ok++; - - if (options & GSTRING_TRIM_STRIP_TRAILING) - while ( (first_ok <= last_ok) && (strchr (chars, str[last_ok])) ) - last_ok++; - - if (first_ok > 0) - g_string_erase (string, 0, first_ok); - - if (last_ok < length-1) - g_string_truncate (string, last_ok - first_ok +1); - -} diff --git a/camel/gstring-util.h b/camel/gstring-util.h deleted file mode 100644 index 487bbc8a3b..0000000000 --- a/camel/gstring-util.h +++ /dev/null @@ -1,66 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* gstring-util : utilities for gstring object */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - - -#ifndef GSTRING_UTIL_H -#define GSTRING_UTIL_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <glib.h> - -typedef enum { - GSTRING_TRIM_NONE = 0, - GSTRING_TRIM_STRIP_TRAILING = 1, - GSTRING_TRIM_STRIP_LEADING = 2 -} GStringTrimOption; - - -gboolean g_string_equals (GString *string1, GString *string2); -GString *g_string_clone (GString *string); -void g_string_append_g_string (GString *dest_string, - GString *other_string); - -gboolean g_string_equal_for_hash (gconstpointer v, gconstpointer v2); -gboolean g_string_equal_for_glist (gconstpointer v, gconstpointer v2); -guint g_string_hash (gconstpointer v); -void g_string_list_free (GList *string_list); - -GList *g_string_split (GString *string, char sep, - gchar *trim_chars, GStringTrimOption trim_options); -void g_string_trim (GString *string, gchar *chars, - GStringTrimOption options); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* GSTRING_UTIL_H */ diff --git a/camel/hash-table-utils.c b/camel/hash-table-utils.c deleted file mode 100644 index b04eaa3ce7..0000000000 --- a/camel/hash-table-utils.c +++ /dev/null @@ -1,80 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* generic utilities for hash tables */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <ctype.h> -#include "glib.h" -#include "hash-table-utils.h" - - -/* - * free a (key/value) hash table pair. - * to be called in a g_hash_table_foreach() - * before g_hash_table_destroy(). - */ -void -g_hash_table_generic_free (gpointer key, gpointer value, gpointer user_data) -{ - g_free (key); - g_free (value); -} - - - -/***/ -/* use these two funcs for case insensitive hash table */ - -gint -g_strcase_equal (gconstpointer a, gconstpointer b) -{ - return (g_strcasecmp ((gchar *)a, (gchar *)b) == 0); -} - - -/* modified g_str_hash from glib/gstring.c - because it would have been too slow to - us g_strdown() on the string */ -/* a char* hash function from ASU */ -guint -g_strcase_hash (gconstpointer v) -{ - const char *s = (char*)v; - const char *p; - guint h=0, g; - - for(p = s; *p != '\0'; p += 1) { - h = ( h << 4 ) + toupper(*p); - if ( ( g = h & 0xf0000000 ) ) { - h = h ^ (g >> 24); - h = h ^ g; - } - } - - return h /* % M */; -} - - - -/***/ diff --git a/camel/hash-table-utils.h b/camel/hash-table-utils.h deleted file mode 100644 index 2904991848..0000000000 --- a/camel/hash-table-utils.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* generic utilities for hash tables */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef HASH_TABLE_UTILS_H -#define HASH_TABLE_UTILS_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -void g_hash_table_generic_free (gpointer key, gpointer value, gpointer user_data); - -gint g_strcase_equal (gconstpointer a, gconstpointer b); -guint g_strcase_hash (gconstpointer v); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* HASH_TABLE_UTILS_H */ diff --git a/camel/providers/.cvsignore b/camel/providers/.cvsignore deleted file mode 100644 index 3dda72986f..0000000000 --- a/camel/providers/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in -Makefile diff --git a/camel/providers/Makefile.am b/camel/providers/Makefile.am deleted file mode 100644 index dedeaa0b3b..0000000000 --- a/camel/providers/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ -## Process this file with automake to produce Makefile.in - -# SUBDIRS = mbox pop3 sendmail smtp vee -SUBDIRS = mbox pop3 sendmail smtp vee imap mh nntp - -# these ones are disabled for the moment. -# maildir diff --git a/camel/providers/cache/.cvsignore b/camel/providers/cache/.cvsignore deleted file mode 100644 index fd6b811c68..0000000000 --- a/camel/providers/cache/.cvsignore +++ /dev/null @@ -1,7 +0,0 @@ -.deps -Makefile -Makefile.in -.libs -.deps -*.lo -*.la diff --git a/camel/providers/cache/Makefile.am b/camel/providers/cache/Makefile.am deleted file mode 100644 index 7f9f6a9df5..0000000000 --- a/camel/providers/cache/Makefile.am +++ /dev/null @@ -1,35 +0,0 @@ -## Process this file with automake to produce Makefile.in - -SUBDIRS = - -libcamelcacheincludedir = $(includedir)/camel - -providerdir = $(pkglibdir)/camel-providers/$(VERSION) - -provider_LTLIBRARIES = libcamelcache.la -provider_DATA = libcamelcache.urls - -INCLUDES = \ - -I.. \ - -I$(srcdir)/.. \ - -I$(srcdir)/../../.. \ - -I$(includedir) \ - -I$(top_srcdir)/intl \ - $(GTK_INCLUDEDIR) \ - -I$(top_srcdir)/camel \ - -DG_LOG_DOMAIN=\"camel-cache-provider\" - -libcamelcache_la_SOURCES = \ - camel-cache-folder.c \ - camel-cache-provider.c \ - camel-cache-store.c \ - camel-cache-map.c - -libcamelcacheinclude_HEADERS = \ - camel-cache-folder.h \ - camel-cache-store.h - - -libcamelcache_la_LDFLAGS = -version-info 0:0:0 - -EXTRA_DIST = libcamelcache.urls diff --git a/camel/providers/cache/camel-cache-folder.c b/camel/providers/cache/camel-cache-folder.c deleted file mode 100644 index c4379f8135..0000000000 --- a/camel/providers/cache/camel-cache-folder.c +++ /dev/null @@ -1,810 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-cache-folder.c : class for a cache folder */ - -/* - * Authors: - * Dan Winship <danw@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -/* - * Notes on the cache provider: - * - * We require that the remote folder have persistent UIDs, and nothing - * else. We require that the local store folder have persistent UIDs - * and summary capability. - * - * If the remote folder does not have summary capability, we will need - * to sync any new messages over to the local folder when the folder - * is opened or when it changes. If the remote folder does have - * summary capability, we can be more relaxed about doing this. - * - * If the remote folder has search capability, we will use it, at - * least when the folder isn't synced. Otherwise if the local folder - * has search capability, we will use that (but it will require - * syncing the remote folder locally to use). Otherwise the cache - * folder won't have search capability. - * - * CamelCacheFolder UIDs are remote UIDs, because we need to be able - * to return a complete list of them at get_uids time, and the - * messages might not all be present in the local folder, and we can't - * predict what UIDs will be assigned to them when they are cached - * there. We keep hash tables mapping remote to local UIDs and vice - * versa, and a map file to cache this information between sessions. - * The maps must always be 100% accurate. - * - * The messages in the local folder may not be in the same order as - * the messages in the remote folder. - * - * - * Many operations on the local folder are done with a NULL - * CamelException, because having them fail only results in efficiency - * problems, not actual permanent failures. (Eg, get_message will - * try to append the message to the local folder, but doesn't check - * for failure, because it already has the message to pass back to the - * user.) - */ - -#include "camel-cache-folder.h" -#include "camel-cache-store.h" -#include <camel/camel-exception.h> -#include <camel/camel-medium.h> - -#define CF_CLASS(so) CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so)) -static CamelFolderClass *folder_class = NULL; - -static void init (CamelFolder *folder, CamelStore *parent_store, - CamelFolder *parent_folder, const gchar *name, - gchar *separator, gboolean path_begins_with_sep, - CamelException *ex); - -static void refresh_info (CamelFolder *folder, CamelException *ex); - -static void cache_sync (CamelFolder *folder, gboolean expunge, - CamelException *ex); - -static void expunge (CamelFolder *folder, CamelException *ex); - -static gint get_message_count (CamelFolder *folder); - -static void append_message (CamelFolder *folder, CamelMimeMessage *message, - const CamelMessageInfo *info, CamelException *ex); - -static guint32 get_message_flags (CamelFolder *folder, const char *uid); -static void set_message_flags (CamelFolder *folder, const char *uid, - guint32 flags, guint32 set); -static gboolean get_message_user_flag (CamelFolder *folder, const char *uid, - const char *name); -static void set_message_user_flag (CamelFolder *folder, const char *uid, - const char *name, gboolean value); -static const char *get_message_user_tag (CamelFolder *folder, const char *uid, - const char *name); -static void set_message_user_tag (CamelFolder *folder, const char *uid, - const char *name, const char *value); - -static CamelMimeMessage *get_message (CamelFolder *folder, - const gchar *uid, - CamelException *ex); - -static GPtrArray *get_uids (CamelFolder *folder); -static GPtrArray *get_summary (CamelFolder *folder); -static GPtrArray *get_subfolder_names (CamelFolder *folder); -static void free_subfolder_names (CamelFolder *folder, GPtrArray *subfolders); - -static GPtrArray *search_by_expression (CamelFolder *folder, - const char *expression, - CamelException *ex); - -static const CamelMessageInfo *get_message_info (CamelFolder *folder, - const char *uid); - -static void copy_message_to (CamelFolder *source, const char *uid, - CamelFolder *destination, CamelException *ex); - -static void move_message_to (CamelFolder *source, const char *uid, - CamelFolder *destination, CamelException *ex); - -static void finalize (CamelObject *object); - -static void -camel_cache_folder_class_init (CamelCacheFolderClass *camel_cache_folder_class) -{ - CamelFolderClass *camel_folder_class = - CAMEL_FOLDER_CLASS (camel_cache_folder_class); - - folder_class = CAMEL_FOLDER_CLASS (camel_type_get_global_classfuncs (camel_folder_get_type ())); - - /* virtual method overload */ - camel_folder_class->init = init; - camel_folder_class->refresh_info = refresh_info; - camel_folder_class->sync = cache_sync; - camel_folder_class->expunge = expunge; - camel_folder_class->get_message_count = get_message_count; - camel_folder_class->append_message = append_message; - camel_folder_class->get_message_flags = get_message_flags; - camel_folder_class->set_message_flags = set_message_flags; - camel_folder_class->get_message_user_flag = get_message_user_flag; - camel_folder_class->set_message_user_flag = set_message_user_flag; - camel_folder_class->get_message_user_tag = get_message_user_tag; - camel_folder_class->set_message_user_tag = set_message_user_tag; - camel_folder_class->get_message = get_message; - camel_folder_class->get_uids = get_uids; - camel_folder_class->free_uids = camel_folder_free_nop; - camel_folder_class->get_summary = get_summary; - camel_folder_class->free_summary = camel_folder_free_nop; - camel_folder_class->get_subfolder_names = get_subfolder_names; - camel_folder_class->free_subfolder_names = free_subfolder_names; - camel_folder_class->search_by_expression = search_by_expression; - camel_folder_class->get_message_info = get_message_info; - camel_folder_class->copy_message_to = copy_message_to; - camel_folder_class->move_message_to = move_message_to; -} - -CamelType -camel_cache_folder_get_type (void) -{ - static CamelType camel_cache_folder_type = CAMEL_INVALID_TYPE; - - if (camel_cache_folder_type == CAMEL_INVALID_TYPE) { - camel_cache_folder_type = camel_type_register ( - CAMEL_FOLDER_TYPE, "CamelCacheFolder", - sizeof (CamelCacheFolder), - sizeof (CamelCacheFolderClass), - (CamelObjectClassInitFunc) camel_cache_folder_class_init, - NULL, - NULL, - (CamelObjectFinalizeFunc) finalize); - } - - return camel_cache_folder_type; -} - - -static void -cache_free_summary (CamelCacheFolder *cache_folder) -{ - if (cache_folder->remote_summary) { - camel_folder_free_summary (cache_folder->remote, - cache_folder->summary); - } else { - int i; - - for (i = 0; i < cache_folder->summary->len; i++) { - camel_message_info_free ( - cache_folder->summary->pdata[i]); - } - g_ptr_array_free (cache_folder->summary, TRUE); - g_hash_table_destroy (cache_folder->summary_uids); - } -} - -static void -finalize (CamelObject *object) -{ - CamelCacheFolder *cache_folder = CAMEL_CACHE_FOLDER (object); - - if (cache_folder->uids) { - camel_folder_free_uids (cache_folder->remote, - cache_folder->uids); - } - if (cache_folder->summary) - cache_free_summary (cache_folder); - - if (cache_folder->uidmap) - camel_cache_map_destroy (cache_folder->uidmap); - - camel_object_unref (CAMEL_OBJECT (cache_folder->local)); - camel_object_unref (CAMEL_OBJECT (cache_folder->remote)); - - g_free (cache_folder->mapfile); -} - - -static void -update (CamelCacheFolder *cache_folder, CamelException *ex) -{ - if (cache_folder->uids) { - camel_folder_free_uids (cache_folder->remote, - cache_folder->uids); - } - cache_folder->uids = camel_folder_get_uids (cache_folder->remote); - - if (cache_folder->summary) - cache_free_summary (cache_folder); - - if (cache_folder->remote_summary) { - cache_folder->summary = - camel_folder_get_summary (cache_folder->remote); - } else { - CamelMessageInfo *mi; - GPtrArray *lsummary; - const char *ruid; - int i; - - if (!cache_folder->is_synced) { - camel_cache_folder_sync (cache_folder, ex); - if (camel_exception_is_set (ex)) - return; - } - - cache_folder->summary = g_ptr_array_new (); - cache_folder->summary_uids = g_hash_table_new (g_str_hash, - g_str_equal); - - lsummary = camel_folder_get_summary (cache_folder->local); - - /* For each local message, duplicate its info, replace - * the uid with the remote one, and add it to the - * uid->info cache. - */ - for (i = 0; i < lsummary->len; i++) { - mi = lsummary->pdata[i]; - ruid = camel_cache_map_get_remote (cache_folder->uidmap, mi->uid); - if (!ruid) { - /* Stale message. Delete it from cache. */ - camel_folder_delete_message ( - cache_folder->local, mi->uid); - continue; - } - - mi = g_new (CamelMessageInfo, 1); - camel_message_info_dup_to (lsummary->pdata[i], mi); - g_free (mi->uid); - mi->uid = g_strdup (ruid); - g_hash_table_insert (cache_folder->summary_uids, - mi->uid, mi); - } - camel_folder_free_summary (cache_folder->local, lsummary); - - /* Now build the summary array in remote UID order. */ - for (i = 0; i < cache_folder->uids->len; i++) { - mi = g_hash_table_lookup (cache_folder->summary_uids, - cache_folder->uids->pdata[i]); - g_ptr_array_add (cache_folder->summary, mi); - } - } - -} - -static void -init (CamelFolder *folder, CamelStore *parent_store, - CamelFolder *parent_folder, const gchar *name, gchar *separator, - gboolean path_begins_with_sep, CamelException *ex) -{ - CamelCacheFolder *cache_folder = (CamelCacheFolder *)folder; - char *path; - - CF_CLASS (folder)->init (folder, parent_store, parent_folder, - name, separator, path_begins_with_sep, ex); - if (camel_exception_is_set (ex)) - return; - - folder->permanent_flags = - camel_folder_get_permanent_flags (cache_folder->local); - folder->can_hold_folders = cache_folder->remote->can_hold_folders; - folder->can_hold_messages = cache_folder->remote->can_hold_messages; - folder->has_summary_capability = TRUE; - folder->has_search_capability = - camel_folder_has_search_capability (cache_folder->local) || - camel_folder_has_search_capability (cache_folder->remote); - - cache_folder->remote_summary = - camel_folder_has_summary_capability (cache_folder->remote); - - /* Load UIDs, summary, etc. */ - path = CAMEL_SERVICE (cache_folder->local->parent_store)->url->path; - cache_folder->mapfile = g_strdup_printf ("%s/%s.map", path, name); - cache_folder->uidmap = camel_cache_map_new (); - camel_cache_map_read (cache_folder->uidmap, cache_folder->mapfile, ex); - if (camel_exception_is_set (ex)) - return; - update (cache_folder, ex); - - return; -} - -/* If the remote folder changes, cache the new messages if necessary, - * update the summary, and propagate the signal. - */ -static void -remote_folder_changed (CamelObject *remote_folder, gpointer type, - gpointer user_data) -{ - CamelCacheFolder *cache_folder = user_data; - - update (cache_folder, NULL); - camel_object_trigger_event (CAMEL_OBJECT (cache_folder), - "folder_changed", type); -} - -/* If the local folder changes, it's because we just cached a message - * or expunged messages. Look for new messages and update the UID maps. - */ -static void -local_folder_changed (CamelObject *local, gpointer type, gpointer data) -{ - CamelFolder *local_folder = CAMEL_FOLDER (local); - CamelCacheFolder *cache_folder = data; - CamelMimeMessage *msg; - GPtrArray *new_luids; - char *luid; - const char *ruid; - int i; - - /* Get the updated list of local UIDs. For any that we didn't - * already know about, figure out the corresponding remote - * UID. - */ - new_luids = camel_folder_get_uids (local_folder); - for (i = 0; i < new_luids->len; i++) { - luid = new_luids->pdata[i]; - if (!camel_cache_map_get_remote (cache_folder->uidmap, luid)) { - msg = camel_folder_get_message (local_folder, - luid, NULL); - if (!msg) - continue; /* Hrmph. */ - ruid = camel_medium_get_header (CAMEL_MEDIUM (msg), - "X-Evolution-Remote-UID"); - if (!ruid) { - /* How'd that get here? */ - camel_folder_delete_message (local_folder, - luid); - continue; - } - - camel_cache_map_update (cache_folder->uidmap, - luid, ruid); - } - } - camel_folder_free_uids (local_folder, new_luids); - - /* FIXME: the uidmaps contain bad data now. */ -} - -/* DONE */ -static void -refresh_info (CamelFolder *folder, CamelException *ex) -{ - CamelCacheFolder *cache_folder = (CamelCacheFolder *)folder; - - camel_folder_refresh_info (cache_folder->remote, ex); -} - -/* DONE */ -static void -cache_sync (CamelFolder *folder, gboolean expunge, CamelException *ex) -{ - CamelCacheFolder *cache_folder = (CamelCacheFolder *)folder; - - camel_folder_sync (cache_folder->remote, expunge, ex); - if (!camel_exception_is_set (ex)) { - camel_folder_sync (cache_folder->local, expunge, NULL); - camel_cache_map_write (cache_folder->uidmap, - cache_folder->mapfile, ex); - } -} - -/* DONE */ -static void -expunge (CamelFolder *folder, CamelException *ex) -{ - CamelCacheFolder *cache_folder = (CamelCacheFolder *)folder; - - camel_folder_expunge (cache_folder->remote, ex); - if (!camel_exception_is_set (ex)) - camel_folder_expunge (cache_folder->local, NULL); -} - -/* DONE */ -static gint -get_message_count (CamelFolder *folder) -{ - CamelCacheFolder *cache_folder = (CamelCacheFolder *)folder; - - return cache_folder->summary->len; -} - -/* DONE */ -static void -append_message (CamelFolder *folder, CamelMimeMessage *message, - const CamelMessageInfo *info, CamelException *ex) -{ - CamelCacheFolder *cache_folder = (CamelCacheFolder *)folder; - - /* We'd like to cache this locally as well, but we have no - * 100% reliable way to determine the UID assigned to the - * remote message, so we can't. - */ - camel_folder_append_message (cache_folder->remote, message, info, ex); -} - -/* DONE */ -static guint32 -get_message_flags (CamelFolder *folder, const char *uid) -{ - const CamelMessageInfo *mi; - - mi = get_message_info (folder, uid); - g_return_val_if_fail (mi != NULL, 0); - return mi->flags; -} - -/* DONE */ -static void -set_message_flags (CamelFolder *folder, const char *uid, - guint32 flags, guint32 set) -{ - CamelCacheFolder *cache_folder = (CamelCacheFolder *)folder; - const char *luid; - - luid = camel_cache_map_get_local (cache_folder->uidmap, uid); - if (luid) { - camel_folder_set_message_flags (cache_folder->local, luid, - flags, set); - } - camel_folder_set_message_flags (cache_folder->remote, uid, flags, set); -} - -/* DONE */ -static gboolean -get_message_user_flag (CamelFolder *folder, const char *uid, const char *name) -{ - const CamelMessageInfo *mi; - - mi = get_message_info (folder, uid); - g_return_val_if_fail (mi != NULL, 0); - return camel_flag_get ((CamelFlag **)&mi->user_flags, name); -} - -/* DONE */ -static void -set_message_user_flag (CamelFolder *folder, const char *uid, - const char *name, gboolean value) -{ - CamelCacheFolder *cache_folder = (CamelCacheFolder *)folder; - const char *luid; - - luid = camel_cache_map_get_local (cache_folder->uidmap, uid); - if (luid) { - camel_folder_set_message_user_flag (cache_folder->local, luid, - name, value); - } - camel_folder_set_message_user_flag (cache_folder->remote, uid, - name, value); -} - - -/* DONE */ -static const char * -get_message_user_tag (CamelFolder *folder, const char *uid, const char *name) -{ - const CamelMessageInfo *mi; - - mi = get_message_info (folder, uid); - g_return_val_if_fail (mi != NULL, NULL); - return camel_tag_get ((CamelTag **)&mi->user_tags, name); -} - -/* DONE */ -static void -set_message_user_tag (CamelFolder *folder, const char *uid, - const char *name, const char *value) -{ - CamelCacheFolder *cache_folder = (CamelCacheFolder *)folder; - const char *luid; - - luid = camel_cache_map_get_local (cache_folder->uidmap, uid); - if (luid) { - camel_folder_set_message_user_tag (cache_folder->local, luid, - name, value); - } - camel_folder_set_message_user_tag (cache_folder->remote, uid, - name, value); -} - - -/* DONE */ -static CamelMimeMessage * -get_message (CamelFolder *folder, const gchar *uid, CamelException *ex) -{ - CamelCacheFolder *cache_folder = (CamelCacheFolder *)folder; - CamelMimeMessage *msg; - const CamelMessageInfo *info; - const char *luid; - - /* Check if we have it cached first. */ - luid = camel_cache_map_get_local (cache_folder->uidmap, uid); - if (luid) { - msg = camel_folder_get_message (cache_folder->local, - luid, NULL); - if (msg) - return msg; - - /* Hm... Oh well. Update the map and try for real. */ - camel_cache_map_remove (cache_folder->uidmap, NULL, uid); - } - - /* OK. It's not cached. Get the remote message. */ - msg = camel_folder_get_message (cache_folder->remote, uid, ex); - if (!msg) - return NULL; - info = camel_folder_get_message_info (cache_folder->remote, uid); - - /* Add a header giving the remote UID and append it to the - * local folder. (This should eventually invoke - * local_folder_changed(), which will take care of updating - * the uidmaps.) - */ - camel_medium_add_header (CAMEL_MEDIUM (msg), "X-Evolution-Remote-UID", - uid); - camel_folder_append_message (cache_folder->local, msg, info, NULL); - - return msg; -} - -/* DONE */ -static GPtrArray * -get_uids (CamelFolder *folder) -{ - CamelCacheFolder *cache_folder = (CamelCacheFolder *)folder; - - return cache_folder->uids; -} - -/* DONE */ -static GPtrArray * -get_summary (CamelFolder *folder) -{ - CamelCacheFolder *cache_folder = (CamelCacheFolder *)folder; - - return cache_folder->summary; -} - -/* DONE */ -static GPtrArray * -get_subfolder_names (CamelFolder *folder) -{ - CamelCacheFolder *cache_folder = (CamelCacheFolder *)folder; - - return camel_folder_get_subfolder_names (cache_folder->remote); -} - -/* DONE */ -static void -free_subfolder_names (CamelFolder *folder, GPtrArray *subfolders) -{ - CamelCacheFolder *cache_folder = (CamelCacheFolder *)folder; - - camel_folder_free_subfolder_names (cache_folder->remote, subfolders); -} - -/* DONE */ -static GPtrArray * -search_by_expression (CamelFolder *folder, const char *expression, - CamelException *ex) -{ - CamelCacheFolder *cache_folder = (CamelCacheFolder *)folder; - - /* Search on the remote folder if we're not synced. */ - if (!cache_folder->is_synced && - camel_folder_has_search_capability (cache_folder->remote)) { - return camel_folder_search_by_expression (cache_folder->remote, - expression, ex); - } else { - GPtrArray *matches; - const char *ruid; - int i; - - if (!cache_folder->is_synced) - camel_cache_folder_sync (cache_folder, ex); - if (camel_exception_is_set (ex)) - return NULL; - matches = search_by_expression (cache_folder->local, - expression, ex); - if (camel_exception_is_set (ex)) - return NULL; - - /* Convert local uids to remote. */ - for (i = 0; i < matches->len; i++) { - ruid = camel_cache_map_get_remote (cache_folder->uidmap, - matches->pdata[i]); - g_free (matches->pdata[i]); - matches->pdata[i] = g_strdup (ruid); - } - - return matches; - } -} - -/* DONE */ -static const CamelMessageInfo * -get_message_info (CamelFolder *folder, const char *uid) -{ - CamelCacheFolder *cache_folder = (CamelCacheFolder *)folder; - - if (cache_folder->remote_summary) { - return camel_folder_get_message_info (cache_folder->remote, - uid); - } else - return g_hash_table_lookup (cache_folder->summary_uids, uid); -} - -/* DONE */ -static void -copy_message_to (CamelFolder *source, const char *uid, - CamelFolder *destination, CamelException *ex) -{ - CamelCacheFolder *source_cache_folder = (CamelCacheFolder *)source; - CamelCacheFolder *dest_cache_folder = (CamelCacheFolder *)destination; - - /* If we are here, we know that the folders have the same parent - * store, which implies their remote and local folders have the - * same parent store as well. - */ - - if (CF_CLASS (source_cache_folder->remote)->copy_message_to != - folder_class->copy_message_to) { - /* The remote store has a non-default copy method, so - * use it to avoid unnecessary network traffic. - */ - CF_CLASS (source_cache_folder->remote)->copy_message_to ( - source_cache_folder->remote, uid, - dest_cache_folder->remote, ex); - } else { - /* The remote store uses the default copy method, - * meaning if we proxy the copy_message_to over to it, - * it will suck the message over the network. We may - * already have a local copy, and if we don't, we want - * to, and if we're going to have the message in - * memory, then we should get it into the destination - * cache too. So do this by hand. - */ - CamelMimeMessage *msg; - const CamelMessageInfo *info; - - msg = get_message (source, uid, ex); - if (camel_exception_is_set (ex)) - return; - info = camel_folder_get_message_info (source, uid); - - camel_medium_remove_header (CAMEL_MEDIUM (msg), - "X-Evolution-Remote-UID"); - append_message (destination, msg, info, ex); - } -} - -/* DONE */ -static void -move_message_to (CamelFolder *source, const char *uid, - CamelFolder *destination, CamelException *ex) -{ - CamelCacheFolder *source_cache_folder = (CamelCacheFolder *)source; - CamelCacheFolder *dest_cache_folder = (CamelCacheFolder *)destination; - - /* See comments in copy_message_to. */ - - if (CF_CLASS (source_cache_folder)->move_message_to != - folder_class->move_message_to) { - CF_CLASS (source_cache_folder)->move_message_to ( - source_cache_folder->remote, uid, - dest_cache_folder->remote, ex); - } else { - CamelMimeMessage *msg; - const CamelMessageInfo *info; - - msg = get_message (source, uid, ex); - if (camel_exception_is_set (ex)) - return; - info = camel_folder_get_message_info (source, uid); - - camel_medium_remove_header (CAMEL_MEDIUM (msg), - "X-Evolution-Remote-UID"); - append_message (destination, msg, info, ex); - if (!camel_exception_is_set (ex)) - camel_folder_delete_message (source, uid); - } -} - - -CamelFolder * -camel_cache_folder_new (CamelStore *store, CamelFolder *parent, - CamelFolder *remote, CamelFolder *local, - CamelException *ex) -{ - CamelCacheFolder *cache_folder; - CamelFolder *folder; - - cache_folder = CAMEL_CACHE_FOLDER (camel_object_new (CAMEL_CACHE_FOLDER_TYPE)); - folder = (CamelFolder *)cache_folder; - - cache_folder->local = local; - camel_object_ref (CAMEL_OBJECT (local)); - camel_object_hook_event (CAMEL_OBJECT (local), "folder_changed", - local_folder_changed, cache_folder); - - cache_folder->remote = remote; - camel_object_ref (CAMEL_OBJECT (remote)); - camel_object_hook_event (CAMEL_OBJECT (remote), "folder_changed", - remote_folder_changed, cache_folder); - - /* XXX */ - - return folder; -} - -void -camel_cache_folder_sync (CamelCacheFolder *cache_folder, CamelException *ex) -{ - CamelMimeMessage *msg; - const char *ruid, *luid; - int lsize, i; - const CamelMessageInfo *info; - - lsize = camel_folder_get_message_count (cache_folder->local); - - camel_folder_freeze (cache_folder->local); - for (i = 0; i < cache_folder->uids->len; i++) { - ruid = cache_folder->uids->pdata[i]; - luid = camel_cache_map_get_local (cache_folder->uidmap, ruid); - - /* Don't re-copy messages we already have. */ - if (luid && - camel_folder_get_message_info (cache_folder->local, luid)) - continue; - - msg = camel_folder_get_message (cache_folder->remote, - ruid, ex); - if (camel_exception_is_set (ex)) - return; - info = camel_folder_get_message_info (cache_folder->remote, - ruid); - - camel_medium_add_header (CAMEL_MEDIUM (msg), - "X-Evolution-Remote-UID", ruid); - camel_folder_append_message (cache_folder->local, msg, - info, ex); - if (camel_exception_is_set (ex)) - return; - } - camel_folder_thaw (cache_folder->local); -} - -static void -get_mappings (CamelCacheFolder *cache_folder, int first, CamelException *ex) -{ - GPtrArray *uids; - CamelMimeMessage *msg; - const char *ruid; - int i; - - uids = camel_folder_get_uids (cache_folder->local); - for (i = first; i < uids->len; i++) { - msg = camel_folder_get_message (cache_folder->local, - uids->pdata[i], ex); - if (!msg) - break; - ruid = camel_medium_get_header (CAMEL_MEDIUM (msg), - "X-Evolution-Remote-UID"); - - camel_cache_map_add (cache_folder->uidmap, - uids->pdata[i], ruid); - } - camel_folder_free_uids (cache_folder->local, uids); -} diff --git a/camel/providers/cache/camel-cache-folder.h b/camel/providers/cache/camel-cache-folder.h deleted file mode 100644 index 3609de4d67..0000000000 --- a/camel/providers/cache/camel-cache-folder.h +++ /dev/null @@ -1,88 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-cache-folder.h: Class for a cache folder */ - -/* - * Author: - * Dan Winship <danw@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef CAMEL_CACHE_FOLDER_H -#define CAMEL_CACHE_FOLDER_H 1 - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-folder.h> -#include "camel-cache-map.h" - -#define CAMEL_CACHE_FOLDER_TYPE (camel_cache_folder_get_type ()) -#define CAMEL_CACHE_FOLDER(obj) (CAMEL_CHECK_CAST((obj), CAMEL_CACHE_FOLDER_TYPE, CamelCacheFolder)) -#define CAMEL_CACHE_FOLDER_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_CACHE_FOLDER_TYPE, CamelCacheFolderClass)) -#define IS_CAMEL_CACHE_FOLDER(o) (CAMEL_CHECK_TYPE((o), CAMEL_CACHE_FOLDER_TYPE)) - - -typedef struct { - CamelFolder parent_object; - - /* Remote and local folders */ - CamelFolder *remote, *local; - - /* Remote UIDs, in order, summary, and uid->info map if - * summary is from local info. - */ - GPtrArray *uids, *summary; - GHashTable *summary_uids; - - /* UID map */ - CamelCacheMap *uidmap; - char *mapfile; - - /* Is the summary remote? Is the folder known to be synced? */ - gboolean remote_summary, is_synced; - -} CamelCacheFolder; - - - -typedef struct { - CamelFolderClass parent_class; - - /* Virtual methods */ - -} CamelCacheFolderClass; - - -CamelFolder *camel_cache_folder_new (CamelStore *store, CamelFolder *parent, - CamelFolder *remote, CamelFolder *local, - CamelException *ex); - -void camel_cache_folder_sync (CamelCacheFolder *cache_folder, - CamelException *ex); - -/* Standard Camel function */ -CamelType camel_cache_folder_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_CACHE_FOLDER_H */ diff --git a/camel/providers/cache/camel-cache-map.c b/camel/providers/cache/camel-cache-map.c deleted file mode 100644 index d3cece6f60..0000000000 --- a/camel/providers/cache/camel-cache-map.c +++ /dev/null @@ -1,255 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-cache-map.c : functions for a local<->remote uid map */ - -/* - * Authors: - * Dan Winship <danw@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "camel-cache-map.h" -#include <camel/camel-exception.h> - -#include <errno.h> -#include <fcntl.h> -#include <stdio.h> -#include <string.h> -#include <sys/stat.h> -#include <unistd.h> - -/** - * camel_cache_map_new: - * - * Return value: a new CamelCacheMap - **/ -CamelCacheMap * -camel_cache_map_new (void) -{ - CamelCacheMap *map = g_new (CamelCacheMap, 1); - - map->l2r = g_hash_table_new (g_str_hash, g_str_equal); - map->r2l = g_hash_table_new (g_str_hash, g_str_equal); - - return map; -} - -static void -free_mapping (gpointer key, gpointer value, gpointer data) -{ - g_free (key); - g_free (data); -} - -/** - * camel_cache_map_destroy: - * @map: a CamelCacheMap - * - * Frees @map and all of the data stored in it. - **/ -void -camel_cache_map_destroy (CamelCacheMap *map) -{ - g_hash_table_foreach (map->l2r, free_mapping, NULL); - g_hash_table_destroy (map->l2r); - g_hash_table_destroy (map->r2l); - g_free (map); -} - -/** - * camel_cache_map_add: - * @map: a CamelCacheMap - * @luid: the local uid - * @ruid: the remote uid - * - * Adds a mapping between @luid and @ruid. If either already exists - * in the map, this may leak memory and result in incorrect map entries. - * Use camel_cache_map_update() in that case instead. - **/ -void -camel_cache_map_add (CamelCacheMap *map, const char *luid, const char *ruid) -{ - char *map_luid = g_strdup (luid); - char *map_ruid = g_strdup (ruid); - - g_hash_table_insert (map->l2r, map_luid, map_ruid); - g_hash_table_insert (map->r2l, map_ruid, map_luid); -} - -/** - * camel_cache_map_remove: - * @map: a CamelCacheMap - * @luid: the local uid - * @ruid: the remote uid - * - * Removes the mapping between @luid and @ruid. Either (but not both) - * of the uids can be %NULL if they are not both known. - **/ -void -camel_cache_map_remove (CamelCacheMap *map, const char *luid, const char *ruid) -{ - gpointer map_luid, map_ruid; - - if ((luid && g_hash_table_lookup_extended (map->l2r, luid, - &map_luid, &map_ruid)) || - (ruid && g_hash_table_lookup_extended (map->r2l, ruid, - &map_luid, &map_ruid))) { - g_hash_table_remove (map->l2r, map_luid); - g_hash_table_remove (map->r2l, map_ruid); - g_free (map_luid); - g_free (map_ruid); - } -} - -/** - * camel_cache_map_update: - * @map: a CamelCacheMap - * @luid: the local uid - * @ruid: the remote uid - * - * Updates the mappings to associate @luid with @ruid, clearing any - * previous mappings for both of them. - **/ -void -camel_cache_map_update (CamelCacheMap *map, const char *luid, const char *ruid) -{ - camel_cache_map_remove (map, luid, ruid); - camel_cache_map_add (map, luid, ruid); -} - -/** - * camel_cache_map_get_local - * @map: a CamelCacheMap - * @ruid: the remote uid - * - * Return value: the corresponding local uid, or %NULL - **/ -const char * -camel_cache_map_get_local (CamelCacheMap *map, const char *ruid) -{ - return g_hash_table_lookup (map->r2l, ruid); -} - -/** - * camel_cache_map_get_remote - * @map: a CamelCacheMap - * @luid: the local uid - * - * Return value: the corresponding remote uid, or %NULL - **/ -const char * -camel_cache_map_get_remote (CamelCacheMap *map, const char *luid) -{ - return g_hash_table_lookup (map->l2r, luid); -} - - - -static void -write_mapping (gpointer key, gpointer value, gpointer user_data) -{ - int fd = *(int *)user_data; - - /* FIXME: We assume the local UID has no ':'s in it. */ - write (fd, key, strlen (key)); - write (fd, ":", 1); - write (fd, value, strlen (value)); - write (fd, "\n", 1); -} - -/** - * camel_cache_map_write: - * @map: a CamelCacheMap - * @file: the filename to write the map to - * @ex: a CamelException - * - * Writes @map out to @file, setting @ex if something goes wrong. - **/ -void -camel_cache_map_write (CamelCacheMap *map, const char *file, - CamelException *ex) -{ - int fd; - char *tmpfile; - - tmpfile = g_strdup_printf ("%s~", file); - fd = open (tmpfile, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); - if (fd == -1) { - g_free (tmpfile); - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "Could not create cache map file: %s", - g_strerror (errno)); - return; - } - - g_hash_table_foreach (map->l2r, write_mapping, &fd); - - if (close (fd) == -1 || - rename (tmpfile, file) == -1) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "Could not save cache map file: %s", - g_strerror (errno)); - unlink (tmpfile); - } - g_free (tmpfile); -} - -/** - * camel_cache_map_read: - * @map: a CamelCacheMap - * @file: the filename to read the map from - * @ex: a CamelException - * - * Reads @map from @file, setting @ex if something goes wrong. @map - * should be a freshly-created CamelCacheMap. - **/ -void -camel_cache_map_read (CamelCacheMap *map, const char *file, CamelException *ex) -{ - FILE *f; - char buf[1024], *p, *q; - - /* FIXME: lazy implementation. We could make this work with - * lines longer than 1024 chars. :) - */ - - f = fopen (file, "r"); - if (!f) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "Could not open cache map file: %s", - g_strerror (errno)); - return; - } - - while (fgets (buf, sizeof (buf), f)) { - p = strchr (buf, ':'); - if (p) - q = strchr (buf, '\n'); - if (!p || !q) { - camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM, - "Bad cache file."); - return; - } - *p++ = *q = '\0'; - - /* Local uid at buf, remote at p. */ - camel_cache_map_add (map, buf, p); - } - - fclose (f); -} diff --git a/camel/providers/cache/camel-cache-map.h b/camel/providers/cache/camel-cache-map.h deleted file mode 100644 index a15c9afe1a..0000000000 --- a/camel/providers/cache/camel-cache-map.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-cache-map.h: functions for dealing with UID maps */ - -/* - * Author: - * Dan Winship <danw@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef CAMEL_CACHE_MAP_H -#define CAMEL_CACHE_MAP_H 1 - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <glib.h> -#include <camel/camel-types.h> - -typedef struct { - GHashTable *l2r, *r2l; -} CamelCacheMap; - -CamelCacheMap *camel_cache_map_new (void); -void camel_cache_map_destroy (CamelCacheMap *map); - -void camel_cache_map_add (CamelCacheMap *map, const char *luid, - const char *ruid); -void camel_cache_map_remove (CamelCacheMap *map, const char *luid, - const char *ruid); -void camel_cache_map_update (CamelCacheMap *map, const char *luid, - const char *ruid); - -const char *camel_cache_map_get_local (CamelCacheMap *map, const char *ruid); -const char *camel_cache_map_get_remote (CamelCacheMap *map, const char *luid); - -void camel_cache_map_write (CamelCacheMap *map, const char *file, - CamelException *ex); -void camel_cache_map_read (CamelCacheMap *map, const char *file, - CamelException *ex); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_CACHE_MAP_H */ diff --git a/camel/providers/cache/camel-cache-provider.c b/camel/providers/cache/camel-cache-provider.c deleted file mode 100644 index 217f06816a..0000000000 --- a/camel/providers/cache/camel-cache-provider.c +++ /dev/null @@ -1,51 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-cache-provider.c: cache provider registration code */ - -/* - * Authors : - * Dan Winship <danw@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "config.h" -#include "camel-cache-store.h" -#include "camel-provider.h" -#include "camel-session.h" - -static CamelProvider cache_provider = { - "cache", - "Cache", - - "For caching remote mail into a local store.", - - "cache", - - 0, - - { 0, 0 } -}; - -void -camel_provider_module_init (CamelSession *session) -{ - cache_provider.object_types[CAMEL_PROVIDER_STORE] = - camel_cache_store_get_type(); - - camel_session_register_provider (session, &cache_provider); -} diff --git a/camel/providers/cache/camel-cache-store.c b/camel/providers/cache/camel-cache-store.c deleted file mode 100644 index 544cca69a1..0000000000 --- a/camel/providers/cache/camel-cache-store.c +++ /dev/null @@ -1,297 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-cache-store.c : class for a cache store */ - -/* - * Authors: - * Dan Winship <danw@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "config.h" - -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> - -#include "camel-cache-store.h" -#include "camel-cache-folder.h" -#include "camel-stream-buffer.h" -#include "camel-stream-fs.h" -#include "camel-session.h" -#include "camel-exception.h" -#include "camel-url.h" -#include "md5-utils.h" - -static CamelServiceClass *service_class = NULL; -#define CS_CLASS(so) CAMEL_STORE_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - -static void finalize (CamelObject *object); - -static gboolean cache_connect (CamelService *service, CamelException *ex); -static gboolean cache_disconnect (CamelService *service, CamelException *ex); -static char *get_path (CamelService *service); -static char *get_name (CamelService *service, gboolean brief); - -static CamelFolder *get_folder (CamelStore *store, const char *folder_name, - gboolean create, CamelException *ex); -static void delete_folder (CamelStore *store, const char *folder_name, - CamelException *ex); -static void rename_folder (CamelStore *store, const char *old_name, - const char *new_name, CamelException *ex); -static char *get_folder_name (CamelStore *store, const char *folder_name, - CamelException *ex); -static char *get_root_folder_name (CamelStore *store, CamelException *ex); -static char *get_default_folder_name (CamelStore *store, CamelException *ex); - - -static void -camel_cache_store_class_init (CamelCacheStoreClass *camel_cache_store_class) -{ - CamelServiceClass *camel_service_class = - CAMEL_SERVICE_CLASS (camel_cache_store_class); - CamelStoreClass *camel_store_class = - CAMEL_STORE_CLASS (camel_cache_store_class); - - service_class = CAMEL_SERVICE_CLASS (camel_type_get_global_classfuncs (camel_service_get_type ())); - - /* virtual method overload */ - camel_service_class->connect = cache_connect; - camel_service_class->disconnect = cache_disconnect; - camel_service_class->get_path = get_path; - camel_service_class->get_name = get_name; - - camel_store_class->get_folder = get_folder; - camel_store_class->delete_folder = delete_folder; - camel_store_class->rename_folder = rename_folder; - camel_store_class->get_folder_name = get_folder_name; - camel_store_class->get_root_folder_name = get_root_folder_name; - camel_store_class->get_default_folder_name = get_default_folder_name; -} - - -CamelType -camel_cache_store_get_type (void) -{ - static CamelType camel_cache_store_type = CAMEL_INVALID_TYPE; - - if (camel_cache_store_type == CAMEL_INVALID_TYPE) { - camel_cache_store_type = camel_type_register ( - CAMEL_STORE_TYPE, "CamelCacheStore", - sizeof (CamelCacheStore), - sizeof (CamelCacheStoreClass), - (CamelObjectClassInitFunc) camel_cache_store_class_init, - NULL, - NULL, - (CamelObjectFinalizeFunc) finalize); - } - - return camel_cache_store_type; -} - -static void -finalize (CamelObject *object) -{ - CamelCacheStore *cache_store = CAMEL_CACHE_STORE (object); - - camel_object_unref (CAMEL_OBJECT (cache_store->local)); - camel_object_unref (CAMEL_OBJECT (cache_store->remote)); - g_free (cache_store->local_base); -} - - -static gboolean -cache_connect (CamelService *service, CamelException *ex) -{ - CamelCacheStore *cache_store = CAMEL_CACHE_STORE (service); - - return camel_service_connect (CAMEL_SERVICE (cache_store->remote), ex) && - camel_service_connect (CAMEL_SERVICE (cache_store->local), ex); -} - -static gboolean -cache_disconnect (CamelService *service, CamelException *ex) -{ - CamelCacheStore *cache_store = CAMEL_CACHE_STORE (service); - - return camel_service_disconnect (CAMEL_SERVICE (cache_store->local), ex) && - camel_service_disconnect (CAMEL_SERVICE (cache_store->remote), ex); -} - -static char * -get_path (CamelService *service) -{ - CamelCacheStore *cache_store = CAMEL_CACHE_STORE (service); - char *path, *subpath; - - subpath = camel_service_get_path (CAMEL_SERVICE (cache_store->remote)); - path = g_strdup_printf ("cache/%s", subpath); - g_free (subpath); - return path; -} - -static char * -get_name (CamelService *service, gboolean brief) -{ - CamelCacheStore *cache_store = CAMEL_CACHE_STORE (service); - - return camel_service_get_name (CAMEL_SERVICE (cache_store->remote), - brief); -} - -static CamelFolder * -get_folder (CamelStore *store, const char *folder_name, - gboolean create, CamelException *ex) -{ - CamelCacheStore *cache_store = CAMEL_CACHE_STORE (store); - CamelFolder *parent, *rf, *lf; - - rf = camel_store_get_folder (cache_store->remote, folder_name, - create, ex); - if (!rf) - return NULL; - - lf = camel_store_get_folder (cache_store->local, folder_name, - TRUE, ex); - if (!lf) { - camel_object_unref (CAMEL_OBJECT (rf)); - camel_exception_setv (ex, camel_exception_get_id (ex), - "Could not create cache folder:\n%s", - camel_exception_get_description (ex)); - return NULL; - } - - return camel_cache_folder_new (store, parent, rf, lf, ex); -} - -/* XXX these two need to be better about failure recovery. */ -static void -delete_folder (CamelStore *store, const char *folder_name, - CamelException *ex) -{ - CamelCacheStore *cache_store = CAMEL_CACHE_STORE (store); - - camel_store_delete_folder (cache_store->remote, folder_name, ex); - if (camel_exception_is_set (ex)) - return; - camel_store_delete_folder (cache_store->local, folder_name, NULL); -} - -static void -rename_folder (CamelStore *store, const char *old_name, - const char *new_name, CamelException *ex) -{ - CamelCacheStore *cache_store = CAMEL_CACHE_STORE (store); - - camel_store_rename_folder (cache_store->remote, old_name, - new_name, ex); - if (camel_exception_is_set (ex)) - return; - camel_store_rename_folder (cache_store->local, old_name, - new_name, NULL); -} - -static char * -get_folder_name (CamelStore *store, const char *folder_name, - CamelException *ex) -{ - CamelCacheStore *cache_store = CAMEL_CACHE_STORE (store); - - return CS_CLASS (cache_store->remote)->get_folder_name ( - cache_store->remote, folder_name, ex); -} - -static char * -get_root_folder_name (CamelStore *store, CamelException *ex) -{ - CamelCacheStore *cache_store = CAMEL_CACHE_STORE (store); - - return CS_CLASS (cache_store->remote)->get_root_folder_name ( - cache_store->remote, ex); -} - -static char * -get_default_folder_name (CamelStore *store, CamelException *ex) -{ - CamelCacheStore *cache_store = CAMEL_CACHE_STORE (store); - - return CS_CLASS (cache_store->remote)->get_default_folder_name ( - cache_store->remote, ex); -} - - -/** - * camel_cache_store_new: - * @remote: a remote store - * @ex: a CamelException - * - * Return value: a CamelCacheStore for the given remote store. - **/ -CamelStore * -camel_cache_store_new (CamelStore *remote, CamelException *ex) -{ - CamelCacheStore *cache_store; - CamelService *remote_service = (CamelService *)remote; - CamelSession *session; - char *url_string; - CamelURL *url; - - session = camel_service_get_session (remote_service); - - url_string = camel_service_get_url (remote_service); - url = camel_url_new (url_string, ex); - g_free (url_string); - - if (!url) - return NULL; - - cache_store = (CamelCacheStore *) - camel_service_new (CAMEL_CACHE_STORE_TYPE, session, - camel_service_get_provider (remote_service), - url, ex); - if (camel_exception_is_set (ex)) { - camel_url_free (url); - return NULL; - } - - cache_store->remote = remote; - camel_object_ref (CAMEL_OBJECT (remote)); - - cache_store->local_base = camel_session_get_storage_path ( - session, (CamelService *)cache_store, ex); - if (camel_exception_is_set (ex)) { - camel_object_unref (CAMEL_OBJECT (cache_store)); - return NULL; - } - - url_string = g_strdup_printf ("mbox:%s", cache_store->local_base); - cache_store->local = camel_session_get_store (session, url_string, ex); - g_free (url_string); - if (camel_exception_is_set (ex)) { - camel_object_unref (CAMEL_OBJECT (cache_store)); - return NULL; - } - - return (CamelStore *)cache_store; -} diff --git a/camel/providers/cache/camel-cache-store.h b/camel/providers/cache/camel-cache-store.h deleted file mode 100644 index 7339d8a9f3..0000000000 --- a/camel/providers/cache/camel-cache-store.h +++ /dev/null @@ -1,68 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-cache-store.h: class for a cache store */ - -/* - * Authors: - * Dan Winship <danw@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef CAMEL_CACHE_STORE_H -#define CAMEL_CACHE_STORE_H 1 - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-store.h> - -#define CAMEL_CACHE_STORE_TYPE (camel_cache_store_get_type ()) -#define CAMEL_CACHE_STORE(obj) (CAMEL_CHECK_CAST((obj), CAMEL_CACHE_STORE_TYPE, CamelCacheStore)) -#define CAMEL_CACHE_STORE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_CACHE_STORE_TYPE, CamelCacheStoreClass)) -#define IS_CAMEL_CACHE_STORE(o) (CAMEL_CHECK_TYPE((o), CAMEL_CACHE_STORE_TYPE)) - -typedef struct { - CamelStore parent_object; - - char *local_base; - CamelStore *remote, *local; - -} CamelCacheStore; - - -typedef struct { - CamelStoreClass parent_class; - -} CamelCacheStoreClass; - - -/* support functions */ -CamelStore *camel_cache_store_new (CamelStore *remote, CamelException *ex); - -/* Standard Camel function */ -CamelType camel_cache_store_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_CACHE_STORE_H */ - - diff --git a/camel/providers/cache/libcamelcache.urls b/camel/providers/cache/libcamelcache.urls deleted file mode 100644 index 06cf65390f..0000000000 --- a/camel/providers/cache/libcamelcache.urls +++ /dev/null @@ -1 +0,0 @@ -cache diff --git a/camel/providers/imap/.cvsignore b/camel/providers/imap/.cvsignore deleted file mode 100644 index fd6b811c68..0000000000 --- a/camel/providers/imap/.cvsignore +++ /dev/null @@ -1,7 +0,0 @@ -.deps -Makefile -Makefile.in -.libs -.deps -*.lo -*.la diff --git a/camel/providers/imap/Makefile.am b/camel/providers/imap/Makefile.am deleted file mode 100644 index 19646f1960..0000000000 --- a/camel/providers/imap/Makefile.am +++ /dev/null @@ -1,48 +0,0 @@ -## Process this file with automake to produce Makefile.in - -libcamelimapincludedir = $(includedir)/camel - - -providerdir = $(pkglibdir)/camel-providers/$(VERSION) - -provider_LTLIBRARIES = libcamelimap.la -provider_DATA = libcamelimap.urls - -INCLUDES = -I.. \ - -I$(srcdir)/.. \ - -I$(top_srcdir)/camel \ - -I$(top_srcdir)/intl \ - -I$(top_srcdir)/libibex \ - -I$(top_srcdir)/e-util \ - -I$(top_srcdir) \ - -I$(includedir) \ - $(GTK_INCLUDEDIR) \ - $(KRB4_CFLAGS) \ - -DG_LOG_DOMAIN=\"camel-imap-provider\" - -libcamelimap_la_SOURCES = \ - camel-imap-auth.c \ - camel-imap-command.c \ - camel-imap-folder.c \ - camel-imap-provider.c \ - camel-imap-store.c \ - camel-imap-summary.c \ - camel-imap-utils.c - -libcamelimapinclude_HEADERS = \ - camel-imap-auth.h \ - camel-imap-command.h \ - camel-imap-folder.h \ - camel-imap-store.h \ - camel-imap-stream.h \ - camel-imap-summary.h \ - camel-imap-utils.h - -libcamelimap_la_LDFLAGS = $(KRB4_LDFLAGS) -version-info 0:0:0 - -EXTRA_DIST = libcamelimap.urls - - - - - diff --git a/camel/providers/imap/camel-imap-auth.c b/camel/providers/imap/camel-imap-auth.c deleted file mode 100644 index 3bf1af6535..0000000000 --- a/camel/providers/imap/camel-imap-auth.c +++ /dev/null @@ -1,195 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-imap-auth.c: IMAP AUTHENTICATE implementations */ - -/* - * Authors: Dan Winship <danw@helixcode.com> - * - * Copyright 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#include <config.h> - -#include <string.h> - -#ifdef HAVE_KRB4 -#include <krb.h> -/* MIT krb4 des.h #defines _. Sigh. We don't need it. */ -#undef _ -#endif - -#include "camel-exception.h" -#include "camel-mime-utils.h" - -#include "camel-imap-auth.h" -#include "camel-imap-command.h" -#include "camel-imap-utils.h" - -static char * -base64_encode_simple (const char *data, int len) -{ - unsigned char *out; - int state = 0, outlen; - unsigned int save = 0; - - out = g_malloc (len * 4 / 3 + 5); - outlen = base64_encode_close ((unsigned char *)data, len, FALSE, - out, &state, &save); - out[outlen] = '\0'; - return (char *)out; -} - -static int -base64_decode_simple (char *data, int len) -{ - int state = 0; - unsigned int save = 0; - - return base64_decode_step ((unsigned char *)data, len, - (unsigned char *)data, &state, &save); -} - -#ifdef HAVE_KRB4 -#define IMAP_KERBEROS_V4_PROTECTION_NONE 1 -#define IMAP_KERBEROS_V4_PROTECTION_INTEGRITY 2 -#define IMAP_KERBEROS_V4_PROTECTION_PRIVACY 4 - -gboolean -imap_try_kerberos_v4_auth (CamelImapStore *store, CamelException *ex) -{ - CamelImapResponse *response; - char *resp, *data; - int status, len; - char *inst, *realm, *buf, *username; - guint32 nonce_n, nonce_h, plus1; - struct hostent *h; - KTEXT_ST authenticator; - CREDENTIALS credentials; - des_cblock session; - des_key_schedule schedule; - - /* The kickoff. */ - response = camel_imap_command (store, NULL, ex, - "AUTHENTICATE KERBEROS_V4"); - if (!response) - return FALSE; - resp = camel_imap_response_extract_continuation (response, ex); - if (!resp) - return FALSE; - data = imap_next_word (resp); - - /* First server response is a base64-encoded 32-bit random number - * ("nonce") in network byte order. - */ - if (strlen (data) != 8 || base64_decode_simple (data, 8) != 4) { - g_free (resp); - goto lose; - } - memcpy (&nonce_n, data, 4); - g_free (resp); - nonce_h = ntohl (nonce_n); - - /* Our response is an authenticator including that number. */ - h = camel_service_gethost (CAMEL_SERVICE (store), ex); - if (!h) - goto lose; - inst = g_strndup (h->h_name, strcspn (h->h_name, ".")); - g_strdown (inst); - realm = g_strdup (krb_realmofhost (h->h_name)); - status = krb_mk_req (&authenticator, "imap", inst, realm, nonce_h); - if (status == KSUCCESS) { - status = krb_get_cred ("imap", inst, realm, &credentials); - memcpy (session, credentials.session, sizeof (session)); - memset (&credentials, 0, sizeof (credentials)); - } - g_free (inst); - g_free (realm); - - if (status != KSUCCESS) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, - _("Could not get Kerberos ticket:\n%s"), - krb_err_txt[status]); - goto lose; - } - des_key_sched (&session, schedule); - - buf = base64_encode_simple (authenticator.dat, authenticator.length); - response = camel_imap_command_continuation (store, ex, buf); - g_free (buf); - if (!response) - goto lose; - resp = camel_imap_response_extract_continuation (response, ex); - if (!resp) - goto lose; - data = imap_next_word (resp); - - len = strlen (data); - base64_decode_simple (data, strlen (data)); - - /* This one is encrypted. */ - des_ecb_encrypt ((des_cblock *)data, (des_cblock *)data, schedule, 0); - - /* Check that the returned value is the original nonce plus one. */ - memcpy (&plus1, data, 4); - if (ntohl (plus1) != nonce_h + 1) { - g_free (resp); - goto lose; - } - - /* "the fifth octet contain[s] a bit-mask specifying the - * protection mechanisms supported by the server" - */ - if (!(data[4] & IMAP_KERBEROS_V4_PROTECTION_NONE)) { - g_warning ("Server does not support `no protection' :-("); - g_free (resp); - goto lose; - } - g_free (resp); - - username = CAMEL_SERVICE (store)->url->user; - len = strlen (username) + 9; - len += 8 - len % 8; - data = g_malloc0 (len); - memcpy (data, &nonce_n, 4); - data[4] = IMAP_KERBEROS_V4_PROTECTION_NONE; - data[5] = data[6] = data[7] = 0; - strcpy (data + 8, username); - - des_pcbc_encrypt ((des_cblock *)data, (des_cblock *)data, len, - schedule, &session, 1); - memset (&session, 0, sizeof (session)); - buf = base64_encode_simple (data, len); - g_free (data); - - response = camel_imap_command_continuation (store, ex, buf); - if (!response) - goto lose; - camel_imap_response_free (response); - return TRUE; - - lose: - memset (&session, 0, sizeof (session)); - - /* Get the server out of "waiting for continuation data" mode. - */ - response = camel_imap_command_continuation (store, NULL, "*"); - if (response) - camel_imap_response_free (response); - - return FALSE; -} -#endif /* HAVE_KRB4 */ diff --git a/camel/providers/imap/camel-imap-auth.h b/camel/providers/imap/camel-imap-auth.h deleted file mode 100644 index fbbc5ef709..0000000000 --- a/camel/providers/imap/camel-imap-auth.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-imap-auth.h: IMAP AUTHENTICATE implementations */ - -/* - * Authors: - * Dan Winship <danw@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef CAMEL_IMAP_AUTH_H -#define CAMEL_IMAP_AUTH_H 1 - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include "camel-imap-store.h" - -gboolean imap_try_kerberos_v4_auth (CamelImapStore *store, CamelException *ex); -gboolean imap_try_gssapi_auth (CamelImapStore *store, CamelException *ex); - -#endif /* CAMEL_IMAP_AUTH_H */ diff --git a/camel/providers/imap/camel-imap-command.c b/camel/providers/imap/camel-imap-command.c deleted file mode 100644 index e9808d5a1f..0000000000 --- a/camel/providers/imap/camel-imap-command.c +++ /dev/null @@ -1,406 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-imap-command.c: IMAP command sending/parsing routines */ - -/* - * Authors: - * Dan Winship <danw@helixcode.com> - * Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - - -#include <config.h> - -#include <stdio.h> -#include <string.h> - -#include "camel-imap-command.h" -#include "camel-imap-utils.h" -#include "camel-imap-folder.h" -#include <camel/camel-exception.h> - -static char *imap_read_untagged (CamelImapStore *store, char *line, - CamelException *ex); -static CamelImapResponse *imap_read_response (CamelImapStore *store, - CamelException *ex); - -/** - * camel_imap_command: Send a command to a IMAP server and get a response - * @store: the IMAP store - * @folder: The folder to perform the operation in (or %NULL if not - * relevant). - * @ex: a CamelException - * @fmt: a printf-style format string, followed by arguments - * - * This function makes sure that @folder (if non-%NULL) is the - * currently-selected folder on @store and then sends the IMAP command - * specified by @fmt and the following arguments. It then reads the - * server's response(s) and parses the final result. - * - * As a special case, if @fmt is %NULL, it will just select @folder - * and return the response from doing so. - * - * Return value: %NULL if an error occurred (in which case @ex will - * be set). Otherwise, a CamelImapResponse describing the server's - * response, which the caller must free with camel_imap_response_free(). - **/ -CamelImapResponse * -camel_imap_command (CamelImapStore *store, CamelFolder *folder, - CamelException *ex, const char *fmt, ...) -{ - gchar *cmdbuf; - va_list ap; - - /* Check for current folder */ - if (folder && (!fmt || folder != store->current_folder)) { - CamelImapResponse *response; - - store->current_folder = NULL; - response = camel_imap_command (store, NULL, ex, - "SELECT \"%s\"", - folder->full_name); - if (!response) - return NULL; - store->current_folder = folder; - - if (!fmt) - return response; - - camel_imap_response_free (response); - } - - /* Send the command */ - va_start (ap, fmt); - cmdbuf = g_strdup_vprintf (fmt, ap); - va_end (ap); - - camel_remote_store_send_string (CAMEL_REMOTE_STORE (store), ex, - "A%.5d %s\r\n", store->command++, - cmdbuf); - g_free (cmdbuf); - if (camel_exception_is_set (ex)) - return NULL; - - /* Read the response. */ - return imap_read_response (store, ex); -} - -/** - * camel_imap_command_continuation: Send more command data to the IMAP server - * @store: the IMAP store - * @ex: a CamelException - * @cmdbuf: buffer containing the response/request data - * - * This method is for sending continuing responses to the IMAP server - * after camel_imap_command returns a CAMEL_IMAP_PLUS response. - * - * Return value: as for camel_imap_command() - **/ -CamelImapResponse * -camel_imap_command_continuation (CamelImapStore *store, CamelException *ex, - const char *cmdbuf) -{ - if (camel_remote_store_send_string (CAMEL_REMOTE_STORE (store), ex, - "%s\r\n", cmdbuf) < 0) - return NULL; - - return imap_read_response (store, ex); -} - -/* Read the response to an IMAP command. */ -static CamelImapResponse * -imap_read_response (CamelImapStore *store, CamelException *ex) -{ - CamelImapResponse *response; - int number, exists = 0; - GArray *expunged = NULL; - char *respbuf, *retcode, *word, *p; - - /* Read first line */ - if (camel_remote_store_recv_line (CAMEL_REMOTE_STORE (store), - &respbuf, ex) < 0) - return NULL; - - response = g_new0 (CamelImapResponse, 1); - response->untagged = g_ptr_array_new (); - - /* Check for untagged data */ - while (!strncmp (respbuf, "* ", 2)) { - /* Read the rest of the response if it is multi-line. */ - respbuf = imap_read_untagged (store, respbuf, ex); - if (camel_exception_is_set (ex)) - break; - - /* If it starts with a number, we might deal with - * it ourselves. - */ - word = imap_next_word (respbuf); - number = strtoul (word, &p, 10); - if (p != word && store->current_folder) { - word = imap_next_word (p); - if (!g_strcasecmp (word, "EXISTS")) { - exists = number; - g_free (respbuf); - goto next; - } else if (!g_strcasecmp (word, "EXPUNGE")) { - if (!expunged) { - expunged = g_array_new (FALSE, FALSE, - sizeof (int)); - } - g_array_append_val (expunged, number); - g_free (respbuf); - goto next; - } - } else { - if (!g_strncasecmp (word, "BYE", 3)) { - /* connection was lost, no more data to fetch */ - store->connected = FALSE; - g_free (respbuf); - respbuf = NULL; - break; - } - } - - g_ptr_array_add (response->untagged, respbuf); - next: - if (camel_remote_store_recv_line ( - CAMEL_REMOTE_STORE (store), &respbuf, ex) < 0) - break; - } - - /* Update the summary */ - if (store->current_folder && (exists > 0 || expunged)) { - camel_imap_folder_changed (store->current_folder, exists, - expunged, NULL); - } - if (expunged) - g_array_free (expunged, TRUE); - - if (!respbuf || camel_exception_is_set (ex)) { - camel_imap_response_free (response); - return NULL; - } - - response->status = respbuf; - - /* Check for OK or continuation response. */ - if (!strncmp (respbuf, "+ ", 2)) - return response; - retcode = imap_next_word (respbuf); - if (!strncmp (retcode, "OK", 2)) - return response; - - /* We should never get BAD, or anything else but +, OK, or NO - * for that matter. - */ - if (strncmp (retcode, "NO", 2) != 0) { - g_warning ("Unexpected response from IMAP server: %s", - respbuf); - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - _("Unexpected response from IMAP " - "server: %s"), respbuf); - camel_imap_response_free (response); - return NULL; - } - - retcode = imap_next_word (retcode); - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - _("IMAP command failed: %s"), - retcode ? retcode : _("Unknown error")); - camel_imap_response_free (response); - return NULL; -} - -/* Given a line that is the start of an untagged response, read and - * return the complete response. (This will be a no-op if the line - * in question doesn't end with a literal.) - * - * FIXME: this won't deal with multiple literals in a single response. - */ -static char * -imap_read_untagged (CamelImapStore *store, char *line, CamelException *ex) -{ - int fulllen, length, left, i; - GPtrArray *data; - char *end, *p; - - p = strrchr (line, '{'); - if (!p) - return line; - - length = strtoul (p + 1, &end, 10); - if (*end != '}' || *(end + 1) || end == p + 1) - return line; - - fulllen = length + strlen (line) + 1; - - /* OK. We have a literal. @length is the length including CRLF - * pairs, which camel_remote_store_recv_line won't return. - */ - data = g_ptr_array_new (); - g_ptr_array_add (data, line); - left = length; - while (1) { - if (camel_remote_store_recv_line (CAMEL_REMOTE_STORE (store), - &line, ex) < 0) { - for (i = 0; i < data->len; i++) - g_free (data->pdata[i]); - g_ptr_array_free (data, TRUE); - return NULL; - } - g_ptr_array_add (data, line); - - if (left <= 0) - break; - - left -= strlen (line) + 2; - - /* The output string will have only LF, not CRLF, so - * decrement the length by one. - */ - length--; - } - - /* Add the length of the post-literal line. */ - fulllen += strlen (line); - - /* p points to the "{" in the line that starts the literal. - * The length of the CR-less response must be less than or - * equal to the length of the response with CRs, therefore - * overwriting the old value with the new value cannot cause - * an overrun. - */ - sprintf (p, "{%d}", length); - - /* Now reassemble the data. */ - p = line = g_malloc (fulllen + 1); - for (i = 0; i < data->len; i++) { - length = strlen (data->pdata[i]); - memcpy (p, data->pdata[i], length); - g_free (data->pdata[i]); - p += length; - *p++ = '\n'; - } - *p = '\0'; - g_ptr_array_free (data, TRUE); - return line; -} - - -/** - * camel_imap_response_free: - * response: a CamelImapResponse: - * - * Frees all of the data in @response. - **/ -void -camel_imap_response_free (CamelImapResponse *response) -{ - int i; - - if (!response) - return; - for (i = 0; i < response->untagged->len; i++) - g_free (response->untagged->pdata[i]); - g_ptr_array_free (response->untagged, TRUE); - g_free (response->status); - g_free (response); -} - -/** - * camel_imap_response_extract: - * @response: the response data returned from camel_imap_command - * @type: the response type to extract - * @ex: a CamelException - * - * This checks that @response contains a single untagged response of - * type @type and returns just that response data. If @response - * doesn't contain the right information, the function will set @ex and - * return %NULL. Either way, @response will be freed. - * - * Return value: the desired response string, which the caller must free. - **/ -char * -camel_imap_response_extract (CamelImapResponse *response, const char *type, - CamelException *ex) -{ - int len = strlen (type), i; - char *resp; - - for (i = 0; i < response->untagged->len; i++) { - resp = response->untagged->pdata[i]; - /* Skip "* ", and initial sequence number, if present */ - strtoul (resp + 2, &resp, 10); - if (*resp == ' ') - resp = imap_next_word (resp); - - if (!g_strncasecmp (resp, type, len)) - break; - - g_free (response->untagged->pdata[i]); - } - - if (i < response->untagged->len) { - resp = response->untagged->pdata[i]; - for (i++; i < response->untagged->len; i++) - g_free (response->untagged->pdata[i]); - } else { - resp = NULL; - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - _("IMAP server response did not contain " - "%s information"), type); - } - - g_ptr_array_free (response->untagged, TRUE); - g_free (response->status); - g_free (response); - return resp; -} - -/** - * camel_imap_response_extract_continuation: - * @response: the response data returned from camel_imap_command - * @ex: a CamelException - * - * This checks that @response contains a continuation response, and - * returns just that data. If @response doesn't contain a continuation - * response, the function will set @ex and return %NULL. Either way, - * @response will be freed. - * - * Return value: the desired response string, which the caller must free. - **/ -char * -camel_imap_response_extract_continuation (CamelImapResponse *response, - CamelException *ex) -{ - char *status; - - if (response->status && !strncmp (response->status, "+ ", 2)) { - status = response->status; - response->status = NULL; - camel_imap_response_free (response); - return status; - } - - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - _("Unexpected OK response from IMAP server: %s"), - response->status); - camel_imap_response_free (response); - return NULL; -} diff --git a/camel/providers/imap/camel-imap-command.h b/camel/providers/imap/camel-imap-command.h deleted file mode 100644 index 38e290c379..0000000000 --- a/camel/providers/imap/camel-imap-command.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-imap-command.h: IMAP command sending/parsing routines */ - -/* - * Authors: - * Dan Winship <danw@helixcode.com> - * Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_IMAP_COMMAND_H -#define CAMEL_IMAP_COMMAND_H 1 - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include "camel-imap-store.h" - -typedef struct { - GPtrArray *untagged; - char *status; -} CamelImapResponse; - -CamelImapResponse *camel_imap_command (CamelImapStore *store, - CamelFolder *folder, - CamelException *ex, - const char *fmt, ...); -CamelImapResponse *camel_imap_command_continuation (CamelImapStore *store, - CamelException *ex, - const char *cmdbuf); - -void camel_imap_response_free (CamelImapResponse *response); -char *camel_imap_response_extract (CamelImapResponse *response, - const char *type, - CamelException *ex); -char *camel_imap_response_extract_continuation (CamelImapResponse *response, - CamelException *ex); - -#endif /* CAMEL_IMAP_COMMAND_H */ diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c deleted file mode 100644 index a4b8b459de..0000000000 --- a/camel/providers/imap/camel-imap-folder.c +++ /dev/null @@ -1,850 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-imap-folder.c: Abstract class for an imap folder */ - -/* - * Authors: Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#include <config.h> - -#include <stdlib.h> -#include <sys/types.h> -#include <dirent.h> -#include <sys/stat.h> -#include <unistd.h> -#include <errno.h> -#include <string.h> -#include <fcntl.h> -#include <ctype.h> - -#include <gal/util/e-util.h> - -#include "camel-imap-folder.h" -#include "camel-imap-command.h" -#include "camel-imap-store.h" -#include "camel-imap-stream.h" -#include "camel-imap-summary.h" -#include "camel-imap-utils.h" -#include "string-utils.h" -#include "camel-stream.h" -#include "camel-stream-fs.h" -#include "camel-stream-mem.h" -#include "camel-stream-buffer.h" -#include "camel-data-wrapper.h" -#include "camel-mime-message.h" -#include "camel-stream-filter.h" -#include "camel-mime-filter-from.h" -#include "camel-mime-filter-crlf.h" -#include "camel-exception.h" -#include "camel-mime-utils.h" - -#define d(x) x - -#define CF_CLASS(o) (CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(o))) - -static CamelFolderClass *parent_class = NULL; - -static void imap_finalize (CamelObject *object); -static void imap_refresh_info (CamelFolder *folder, CamelException *ex); -static void imap_sync (CamelFolder *folder, gboolean expunge, CamelException *ex); -static const char *imap_get_full_name (CamelFolder *folder); -static void imap_expunge (CamelFolder *folder, CamelException *ex); - -/* message counts */ -static gint imap_get_message_count (CamelFolder *folder); -static gint imap_get_unread_message_count (CamelFolder *folder); - -/* message manipulation */ -static CamelMimeMessage *imap_get_message (CamelFolder *folder, const gchar *uid, - CamelException *ex); -static void imap_append_message (CamelFolder *folder, CamelMimeMessage *message, - const CamelMessageInfo *info, CamelException *ex); -static void imap_copy_message_to (CamelFolder *source, const char *uid, - CamelFolder *destination, CamelException *ex); -static void imap_move_message_to (CamelFolder *source, const char *uid, - CamelFolder *destination, CamelException *ex); - -/* summary info */ -static GPtrArray *imap_get_uids (CamelFolder *folder); -static GPtrArray *imap_get_summary (CamelFolder *folder); -static const CamelMessageInfo *imap_get_message_info (CamelFolder *folder, const char *uid); - -static void imap_update_summary (CamelFolder *folder, int first, int last, - CamelException *ex); - -/* searching */ -static GPtrArray *imap_search_by_expression (CamelFolder *folder, const char *expression, CamelException *ex); - -/* flag methods */ -static guint32 imap_get_message_flags (CamelFolder *folder, const char *uid); -static void imap_set_message_flags (CamelFolder *folder, const char *uid, guint32 flags, guint32 set); -static gboolean imap_get_message_user_flag (CamelFolder *folder, const char *uid, const char *name); -static void imap_set_message_user_flag (CamelFolder *folder, const char *uid, const char *name, - gboolean value); - - -static void -camel_imap_folder_class_init (CamelImapFolderClass *camel_imap_folder_class) -{ - CamelFolderClass *camel_folder_class = CAMEL_FOLDER_CLASS (camel_imap_folder_class); - - parent_class = CAMEL_FOLDER_CLASS(camel_type_get_global_classfuncs (camel_folder_get_type ())); - - /* virtual method definition */ - - /* virtual method overload */ - camel_folder_class->refresh_info = imap_refresh_info; - camel_folder_class->sync = imap_sync; - camel_folder_class->expunge = imap_expunge; - camel_folder_class->get_full_name = imap_get_full_name; - - camel_folder_class->get_uids = imap_get_uids; - camel_folder_class->free_uids = camel_folder_free_nop; - - camel_folder_class->get_message_count = imap_get_message_count; - camel_folder_class->get_unread_message_count = imap_get_unread_message_count; - camel_folder_class->get_message = imap_get_message; - camel_folder_class->append_message = imap_append_message; - camel_folder_class->copy_message_to = imap_copy_message_to; - camel_folder_class->move_message_to = imap_move_message_to; - - camel_folder_class->get_summary = imap_get_summary; - camel_folder_class->get_message_info = imap_get_message_info; - camel_folder_class->free_summary = camel_folder_free_nop; - - camel_folder_class->search_by_expression = imap_search_by_expression; - - camel_folder_class->get_message_flags = imap_get_message_flags; - camel_folder_class->set_message_flags = imap_set_message_flags; - camel_folder_class->get_message_user_flag = imap_get_message_user_flag; - camel_folder_class->set_message_user_flag = imap_set_message_user_flag; -} - -static void -camel_imap_folder_init (gpointer object, gpointer klass) -{ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (object); - CamelFolder *folder = CAMEL_FOLDER (object); - - folder->has_summary_capability = TRUE; - folder->has_search_capability = TRUE; - - imap_folder->summary = NULL; -} - -CamelType -camel_imap_folder_get_type (void) -{ - static CamelType camel_imap_folder_type = CAMEL_INVALID_TYPE; - - if (camel_imap_folder_type == CAMEL_INVALID_TYPE) { - camel_imap_folder_type = - camel_type_register (CAMEL_FOLDER_TYPE, "CamelImapFolder", - sizeof (CamelImapFolder), - sizeof (CamelImapFolderClass), - (CamelObjectClassInitFunc) camel_imap_folder_class_init, - NULL, - (CamelObjectInitFunc) camel_imap_folder_init, - (CamelObjectFinalizeFunc) imap_finalize); - } - - return camel_imap_folder_type; -} - -CamelFolder * -camel_imap_folder_new (CamelStore *parent, const char *folder_name, - const char *short_name, const char *summary_file, - CamelException *ex) -{ - CamelImapStore *imap_store = CAMEL_IMAP_STORE (parent); - CamelFolder *folder = CAMEL_FOLDER (camel_object_new (camel_imap_folder_get_type ())); - CamelImapFolder *imap_folder = (CamelImapFolder *)folder; - CamelImapResponse *response; - const char *resp; - guint32 validity = 0; - int i; - - camel_folder_construct (folder, parent, folder_name, short_name); - - response = camel_imap_command (imap_store, folder, ex, NULL); - if (!response) { - camel_object_unref ((CamelObject *)folder); - return NULL; - } - - for (i = 0; i < response->untagged->len; i++) { - resp = response->untagged->pdata[i] + 2; - if (!g_strncasecmp (resp, "FLAGS ", 6)) { - folder->permanent_flags = - imap_parse_flag_list (resp + 6); - } else if (!g_strncasecmp (resp, "OK [PERMANENTFLAGS ", 19)) { - folder->permanent_flags = - imap_parse_flag_list (resp + 19); - } else if (!g_strncasecmp (resp, "OK [UIDVALIDITY ", 16)) { - validity = strtoul (resp + 16, NULL, 10); - } else if (isdigit ((unsigned char)*resp)) { - unsigned long num = strtoul (resp, (char **)&resp, 10); - - if (!g_strncasecmp (resp, " EXISTS", 7)) - imap_folder->exists = num; - } - } - camel_imap_response_free (response); - - imap_folder->summary = camel_imap_summary_new (summary_file, validity); - if (!imap_folder->summary) { - camel_object_unref (CAMEL_OBJECT (folder)); - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not load summary for %s"), - folder_name); - return NULL; - } - - imap_refresh_info (folder, ex); - if (camel_exception_is_set (ex)) { - camel_object_unref (CAMEL_OBJECT (folder)); - return NULL; - } - - return folder; -} - -static void -imap_finalize (CamelObject *object) -{ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (object); - - camel_object_unref ((CamelObject *)imap_folder->summary); -} - -static void -imap_refresh_info (CamelFolder *folder, CamelException *ex) -{ - CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store); - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - CamelImapResponse *response; - struct { - char *uid; - guint32 flags; - } *new; - char *resp, *uid, *p, *flags; - int i, seq, summary_len; - CamelMessageInfo *info; - gboolean folder_changed = FALSE; - - if (imap_folder->exists == 0) { - if (camel_folder_summary_count != 0) { - camel_folder_summary_clear (imap_folder->summary); - camel_object_trigger_event (CAMEL_OBJECT (folder), - "folder_changed", NULL); - } - return; - } - - /* Get UIDs and flags of all messages. */ - response = camel_imap_command (store, folder, ex, - "FETCH 1:%d (UID FLAGS)", - imap_folder->exists); - if (!response) - return; - - new = g_malloc0 (imap_folder->exists * sizeof (*new)); - for (i = 0; i < response->untagged->len; i++) { - resp = response->untagged->pdata[i]; - - seq = strtoul (resp + 2, &resp, 10); - if (g_strncasecmp (resp, " FETCH ", 7) != 0) - continue; - - uid = e_strstrcase (resp, "UID "); - if (uid) { - uid += 4; - strtoul (uid, &p, 10); - new[seq - 1].uid = g_strndup (uid, p - uid); - } - - flags = e_strstrcase (resp, "FLAGS "); - if (flags) { - flags += 6; - new[seq - 1].flags = imap_parse_flag_list (flags); - } - } - - /* If we find a UID in the summary that doesn't correspond to - * the UID in the folder, that it means the message was - * deleted on the server, so we remove it from the summary. - */ - summary_len = camel_folder_summary_count (imap_folder->summary); - for (i = 0; i < summary_len && i < imap_folder->exists; i++) { - info = camel_folder_summary_index (imap_folder->summary, i); - - /* Shouldn't happen, but... */ - if (!new[i].uid) - continue; - - if (strcmp (info->uid, new[i].uid) != 0) { - camel_folder_summary_remove (imap_folder->summary, - info); - folder_changed = TRUE; - i--; - summary_len--; - continue; - } - - /* Update summary flags */ - if (info->flags != new[i].flags) { - info->flags = new[i].flags; - camel_object_trigger_event (CAMEL_OBJECT (folder), - "message_changed", - info->uid); - } - - g_free (new[i].uid); - } - - /* Remove any leftover cached summary messages. */ - while (summary_len > i + 1) { - camel_folder_summary_remove_index (imap_folder->summary, - --summary_len); - folder_changed = TRUE; - } - - /* Add any new folder messages. */ - if (i < imap_folder->exists) { - /* Fetch full summary for the remaining messages. */ - imap_update_summary (folder, i + 1, imap_folder->exists, ex); - folder_changed = TRUE; - - while (i < imap_folder->exists) - g_free (new[i++].uid); - } - g_free (new); - - if (folder_changed) { - camel_object_trigger_event (CAMEL_OBJECT (folder), - "folder_changed", NULL); - } -} - -static void -imap_sync (CamelFolder *folder, gboolean expunge, CamelException *ex) -{ - CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store); - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - CamelImapResponse *response; - int i, max; - - /* Set the flags on any messages that have changed this session */ - max = camel_folder_summary_count (imap_folder->summary); - for (i = 0; i < max; i++) { - CamelMessageInfo *info; - - info = camel_folder_summary_index (imap_folder->summary, i); - if (info->flags & CAMEL_MESSAGE_FOLDER_FLAGGED) { - char *flags; - - flags = imap_create_flag_list (info->flags); - if (flags) { - response = camel_imap_command ( - store, folder, ex, - "UID STORE %s FLAGS.SILENT %s", - info->uid, flags); - g_free (flags); - if (!response) - return; - camel_imap_response_free (response); - } - info->flags &= ~CAMEL_MESSAGE_FOLDER_FLAGGED; - } - } - - if (expunge) { - response = camel_imap_command (store, folder, ex, "EXPUNGE"); - camel_imap_response_free (response); - } - - camel_folder_summary_save (imap_folder->summary); -} - -static void -imap_expunge (CamelFolder *folder, CamelException *ex) -{ - imap_sync (folder, TRUE, ex); -} - -static const char * -imap_get_full_name (CamelFolder *folder) -{ - CamelURL *url = ((CamelService *)folder->parent_store)->url; - int len; - - if (!url->path || !*url->path || !strcmp (url->path, "/")) - return folder->full_name; - len = strlen (url->path + 1); - if (!strncmp (url->path + 1, folder->full_name, len) && - strlen (folder->full_name) > len + 1) - return folder->full_name + len + 1; - return folder->full_name; -} - -static gint -imap_get_message_count (CamelFolder *folder) -{ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - - return camel_folder_summary_count (imap_folder->summary); -} - -static gint -imap_get_unread_message_count (CamelFolder *folder) -{ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - CamelMessageInfo *info; - int i, max, count = 0; - - max = camel_folder_summary_count (imap_folder->summary); - for (i = 0; i < max; i++) { - info = camel_folder_summary_index (imap_folder->summary, i); - if (!(info->flags & CAMEL_MESSAGE_SEEN)) - count++; - } - - return count; -} - -static void -imap_append_message (CamelFolder *folder, CamelMimeMessage *message, - const CamelMessageInfo *info, CamelException *ex) -{ - CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store); - CamelImapResponse *response; - CamelStream *memstream; - CamelMimeFilter *crlf_filter; - CamelStreamFilter *streamfilter; - GByteArray *ba; - char *flagstr, *result; - - /* create flag string param */ - if (info && info->flags) - flagstr = imap_create_flag_list (info->flags); - else - flagstr = NULL; - - /* FIXME: We could avoid this if we knew how big the message was. */ - memstream = camel_stream_mem_new (); - ba = g_byte_array_new (); - camel_stream_mem_set_byte_array (CAMEL_STREAM_MEM (memstream), ba); - - streamfilter = camel_stream_filter_new_with_stream (memstream); - crlf_filter = camel_mime_filter_crlf_new ( - CAMEL_MIME_FILTER_CRLF_ENCODE, - CAMEL_MIME_FILTER_CRLF_MODE_CRLF_ONLY); - camel_stream_filter_add (streamfilter, crlf_filter); - camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (message), - CAMEL_STREAM (streamfilter)); - camel_object_unref (CAMEL_OBJECT (streamfilter)); - camel_object_unref (CAMEL_OBJECT (crlf_filter)); - camel_object_unref (CAMEL_OBJECT (memstream)); - - response = camel_imap_command (store, NULL, ex, "APPEND %s%s%s {%d}", - folder->full_name, flagstr ? " " : "", - flagstr ? flagstr : "", ba->len); - g_free (flagstr); - - if (!response) { - g_byte_array_free (ba, TRUE); - return; - } - result = camel_imap_response_extract_continuation (response, ex); - if (!result) { - g_byte_array_free (ba, TRUE); - return; - } - g_free (result); - - /* send the rest of our data - the mime message */ - g_byte_array_append (ba, "\0", 3); - response = camel_imap_command_continuation (store, ex, ba->data); - g_byte_array_free (ba, TRUE); - if (!response) - return; - camel_imap_response_free (response); -} - -static void -imap_copy_message_to (CamelFolder *source, const char *uid, - CamelFolder *destination, CamelException *ex) -{ - CamelImapStore *store = CAMEL_IMAP_STORE (source->parent_store); - CamelImapResponse *response; - - response = camel_imap_command (store, source, ex, "UID COPY %s \"%s\"", - uid, destination->full_name); - camel_imap_response_free (response); - - /* FIXME: This should go away once folder_changed is being - * emitted by camel_imap_folder_changed on appends again. - */ - if (!camel_exception_is_set (ex)) { - camel_object_trigger_event (CAMEL_OBJECT (destination), - "folder_changed", NULL); - } -} - -static void -imap_move_message_to (CamelFolder *source, const char *uid, - CamelFolder *destination, CamelException *ex) -{ - CamelImapStore *store = CAMEL_IMAP_STORE (source->parent_store); - CamelImapResponse *response; - - response = camel_imap_command (store, source, ex, "UID COPY %s \"%s\"", - uid, destination->full_name); - camel_imap_response_free (response); - - if (camel_exception_is_set (ex)) - return; - - /* FIXME: This should go away once folder_changed is being - * emitted by camel_imap_folder_changed on appends again. - */ - camel_object_trigger_event (CAMEL_OBJECT (destination), - "folder_changed", NULL); - - camel_folder_delete_message (source, uid); -} - -static GPtrArray * -imap_get_uids (CamelFolder *folder) -{ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - const CamelMessageInfo *info; - GPtrArray *array; - int i, count; - - count = camel_folder_summary_count (imap_folder->summary); - - array = g_ptr_array_new (); - g_ptr_array_set_size (array, count); - - for (i = 0; i < count; i++) { - info = camel_folder_summary_index (imap_folder->summary, i); - array->pdata[i] = g_strdup (info->uid); - } - - return array; -} - -static CamelMimeMessage * -imap_get_message (CamelFolder *folder, const gchar *uid, CamelException *ex) -{ - CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store); - CamelImapResponse *response; - CamelStream *msgstream; - CamelMimeMessage *msg; - char *result, *mesg, *p; - int len; - - response = camel_imap_command (store, folder, ex, - "UID FETCH %s RFC822", uid); - if (!response) - return NULL; - result = camel_imap_response_extract (response, "FETCH", ex); - if (!result) - return NULL; - - p = strstr (result, "RFC822"); - if (p) { - p += 7; - mesg = imap_parse_nstring (&p, &len); - } - if (!p) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - _("Could not find message body in FETCH " - "response.")); - g_free (result); - return NULL; - } - g_free (result); - - msgstream = camel_stream_mem_new_with_buffer (mesg, len); - msg = camel_mime_message_new (); - camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (msg), - msgstream); - camel_object_unref (CAMEL_OBJECT (msgstream)); - g_free (mesg); - - return msg; -} - -/** - * imap_protocol_get_summary_specifier - * - * Make a data item specifier for the header lines we need, - * appropriate to the server level. - * - * IMAP4rev1: UID FLAGS BODY.PEEK[HEADER.FIELDS (SUBJECT FROM .. IN-REPLY-TO)] - * IMAP4: UID FLAGS RFC822.HEADER.LINES (SUBJECT FROM .. IN-REPLY-TO) - **/ -static char * -imap_protocol_get_summary_specifier (CamelImapStore *store) -{ - char *sect_begin, *sect_end; - char *headers_wanted = "SUBJECT FROM TO CC DATE MESSAGE-ID REFERENCES IN-REPLY-TO"; - - if (store->server_level >= IMAP_LEVEL_IMAP4REV1) { - sect_begin = "BODY.PEEK[HEADER.FIELDS"; - sect_end = "]"; - } else { - sect_begin = "RFC822.HEADER.LINES"; - sect_end = ""; - } - - return g_strdup_printf ("UID FLAGS %s (%s)%s", sect_begin, - headers_wanted, sect_end); -} - -static void -imap_update_summary (CamelFolder *folder, int first, int last, - CamelException *ex) -{ - CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store); - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - CamelImapResponse *response; - GPtrArray *headers = NULL; - char *q, *summary_specifier; - struct _header_raw *h = NULL; - int i; - - /* If the range we're updating overlaps with the range we already - * know about, then fetch just flags + uids first. If uids - * aren't "right", reorder them. Update flags appropriately. - * If that returned unknown UIDs, or we're updating unknown - * sequence numbers, do the full fetch for those. - */ - - summary_specifier = imap_protocol_get_summary_specifier (store); - if (first == last) { - response = camel_imap_command (store, folder, ex, - "FETCH %d (%s)", first, - summary_specifier); - } else { - response = camel_imap_command (store, folder, ex, - "FETCH %d:%d (%s)", first, - last, summary_specifier); - } - g_free (summary_specifier); - - if (!response) - return; - - headers = response->untagged; - for (i = 0; i < headers->len; i++) { - CamelMessageInfo *info; - char *uid, *flags, *header; - - /* Grab the UID... */ - if (!(uid = strstr (headers->pdata[i], "UID "))) { - d(fprintf (stderr, "Cannot get a uid for %d\n\n%s\n\n", i+1, (char *) headers->pdata[i])); - break; - } - - for (uid += 4; *uid && (*uid < '0' || *uid > '9'); uid++) - ; - for (q = uid; *q && *q >= '0' && *q <= '9'; q++) - ; - - /* construct the header list */ - /* fast-forward to beginning of header info... */ - header = strchr (headers->pdata[i], '\n') + 1; - h = NULL; - do { - char *line; - int len; - - len = strcspn (header, "\n"); - while (header[len + 1] == ' ' || - header[len + 1] == '\t') - len += 1 + strcspn (header + len + 1, "\n"); - line = g_strndup (header, len); - header_raw_append_parse (&h, line, -1); - g_free (line); - - header += len; - } while (*header++ == '\n' && *header != '\n'); - - /* We can't just call camel_folder_summary_add_from_parser - * because it will assign the wrong UID, and thus get the - * uid hash table wrong and all that. FIXME some day. - */ - info = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(imap_folder->summary)))->message_info_new(imap_folder->summary, h); - header_raw_clear (&h); - info->uid = g_strndup (uid, q - uid); - - /* now lets grab the FLAGS */ - if (!(flags = strstr (headers->pdata[i], "FLAGS "))) { - d(fprintf (stderr, "We didn't seem to get any flags for %d...\n", i)); - } else { - for (flags += 6; *flags && *flags != '('; flags++) - ; - info->flags = imap_parse_flag_list (flags); - } - - camel_folder_summary_add (imap_folder->summary, info); - } - camel_imap_response_free (response); -} - -static GPtrArray * -imap_get_summary (CamelFolder *folder) -{ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - - return imap_folder->summary->messages; -} - -/* get a single message info, by uid */ -static const CamelMessageInfo * -imap_get_message_info (CamelFolder *folder, const char *uid) -{ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - - return camel_folder_summary_uid (imap_folder->summary, uid); -} - -static GPtrArray * -imap_search_by_expression (CamelFolder *folder, const char *expression, CamelException *ex) -{ - CamelImapResponse *response; - GPtrArray *uids = NULL; - char *result, *sexp, *p; - - d(fprintf (stderr, "camel sexp: '%s'\n", expression)); - sexp = imap_translate_sexp (expression); - d(fprintf (stderr, "imap sexp: '%s'\n", sexp)); - - uids = g_ptr_array_new (); - - if (!folder->has_search_capability) { - g_free (sexp); - return uids; - } - - response = camel_imap_command (CAMEL_IMAP_STORE (folder->parent_store), - folder, NULL, "UID SEARCH %s", sexp); - g_free (sexp); - if (!response) - return uids; - - result = camel_imap_response_extract (response, "SEARCH", NULL); - if (!result) - return uids; - - if ((p = strstr (result, "* SEARCH"))) { - char *word; - - word = imap_next_word (p); /* word now points to SEARCH */ - - for (word = imap_next_word (word); *word && *word != '*'; word = imap_next_word (word)) { - gboolean word_is_numeric = TRUE; - char *ep; - - /* find the end of this word and make sure it's a numeric uid */ - for (ep = word; *ep && *ep != ' ' && *ep != '\n'; ep++) - if (*ep < '0' || *ep > '9') - word_is_numeric = FALSE; - - if (word_is_numeric) - g_ptr_array_add (uids, g_strndup (word, (gint)(ep - word))); - } - } - - g_free (result); - - return uids; -} - -static guint32 -imap_get_message_flags (CamelFolder *folder, const char *uid) -{ - const CamelMessageInfo *info; - - info = imap_get_message_info (folder, uid); - g_return_val_if_fail (info != NULL, 0); - - return info->flags; -} - -static void -imap_set_message_flags (CamelFolder *folder, const char *uid, guint32 flags, guint32 set) -{ - CamelImapFolder *imap_folder = (CamelImapFolder *)folder; - CamelMessageInfo *info; - - info = camel_folder_summary_uid (imap_folder->summary, uid); - g_return_if_fail (info != NULL); - - if ((info->flags & set) == flags) - return; - - info->flags = (info->flags & ~flags) | (set & flags) | CAMEL_MESSAGE_FOLDER_FLAGGED; - camel_folder_summary_touch (imap_folder->summary); - - camel_object_trigger_event (CAMEL_OBJECT (folder), "message_changed", - (gpointer)uid); -} - -static gboolean -imap_get_message_user_flag (CamelFolder *folder, const char *uid, const char *name) -{ - /* FIXME */ - return FALSE; -} - -static void -imap_set_message_user_flag (CamelFolder *folder, const char *uid, const char *name, gboolean value) -{ - /* FIXME */ - camel_object_trigger_event (CAMEL_OBJECT (folder), "message_changed", - (gpointer)uid); -} - -void -camel_imap_folder_changed (CamelFolder *folder, int exists, - GArray *expunged, CamelException *ex) -{ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - - if (expunged) { - int i, id; - - for (i = 0; i < expunged->len; i++) { - id = g_array_index (expunged, int, i); - camel_folder_summary_remove_index ( - imap_folder->summary, id - 1); - } - camel_object_trigger_event (CAMEL_OBJECT (folder), - "folder_changed", NULL); - } - - if (exists != 0) - imap_folder->exists = exists; -} diff --git a/camel/providers/imap/camel-imap-folder.h b/camel/providers/imap/camel-imap-folder.h deleted file mode 100644 index 109cc76506..0000000000 --- a/camel/providers/imap/camel-imap-folder.h +++ /dev/null @@ -1,77 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-imap-folder.h : Abstract class for an imap folder */ - -/* - * Author: - * Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_IMAP_FOLDER_H -#define CAMEL_IMAP_FOLDER_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include "camel-folder.h" -#include <camel/camel-folder-search.h> - -#define CAMEL_IMAP_FOLDER_TYPE (camel_imap_folder_get_type ()) -#define CAMEL_IMAP_FOLDER(obj) (CAMEL_CHECK_CAST((obj), CAMEL_IMAP_FOLDER_TYPE, CamelImapFolder)) -#define CAMEL_IMAP_FOLDER_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_IMAP_FOLDER_TYPE, CamelImapFolderClass)) -#define IS_CAMEL_IMAP_FOLDER(o) (CAMEL_CHECK_TYPE((o), CAMEL_IMAP_FOLDER_TYPE)) - -typedef struct { - CamelFolder parent_object; - - CamelFolderSummary *summary; - int exists; -} CamelImapFolder; - - -typedef struct { - CamelFolderClass parent_class; - - /* Virtual methods */ - -} CamelImapFolderClass; - - -/* public methods */ -CamelFolder *camel_imap_folder_new (CamelStore *parent, - const char *folder_name, - const char *short_name, - const char *summary_file, - CamelException *ex); - -void camel_imap_folder_changed (CamelFolder *folder, int exists, - GArray *expunged, CamelException *ex); - -/* Standard Camel function */ -CamelType camel_imap_folder_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_IMAP_FOLDER_H */ diff --git a/camel/providers/imap/camel-imap-provider.c b/camel/providers/imap/camel-imap-provider.c deleted file mode 100644 index 9b962df5f4..0000000000 --- a/camel/providers/imap/camel-imap-provider.c +++ /dev/null @@ -1,113 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-imap-provider.c: imap provider registration code */ - -/* - * Authors: Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - - -#include "config.h" -#include "camel-imap-store.h" -#include "camel-provider.h" -#include "camel-session.h" -#include "camel-url.h" - -static void add_hash (guint *hash, char *s); -static guint imap_url_hash (gconstpointer key); -static gint check_equal (char *s1, char *s2); -static gint imap_url_equal (gconstpointer a, gconstpointer b); - -static CamelProvider imap_provider = { - "imap", - N_("IMAPv4"), - - N_("For reading and storing mail on IMAP servers."), - - "mail", - - CAMEL_PROVIDER_IS_REMOTE | CAMEL_PROVIDER_IS_SOURCE | - CAMEL_PROVIDER_IS_STORAGE, - - CAMEL_URL_NEED_USER | CAMEL_URL_NEED_HOST | - CAMEL_URL_ALLOW_PATH | CAMEL_URL_ALLOW_AUTH, - - { 0, 0 }, - - NULL -}; - -void -camel_provider_module_init (CamelSession *session) -{ - imap_provider.object_types[CAMEL_PROVIDER_STORE] = - camel_imap_store_get_type(); - - imap_provider.service_cache = g_hash_table_new (imap_url_hash, imap_url_equal); - - camel_session_register_provider (session, &imap_provider); -} - -static void -add_hash (guint *hash, char *s) -{ - if (s) - *hash ^= g_str_hash(s); -} - -static guint -imap_url_hash (gconstpointer key) -{ - const CamelURL *u = (CamelURL *)key; - guint hash = 0; - - add_hash (&hash, u->user); - add_hash (&hash, u->authmech); - add_hash (&hash, u->host); - hash ^= u->port; - - return hash; -} - -static gint -check_equal (char *s1, char *s2) -{ - if (s1 == NULL) { - if (s2 == NULL) - return TRUE; - else - return FALSE; - } - - if (s2 == NULL) - return FALSE; - - return strcmp (s1, s2) == 0; -} - -static gint -imap_url_equal (gconstpointer a, gconstpointer b) -{ - const CamelURL *u1 = a, *u2 = b; - - return check_equal (u1->user, u2->user) - && check_equal (u1->authmech, u2->authmech) - && check_equal (u1->host, u2->host) - && u1->port == u2->port; -} diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c deleted file mode 100644 index 0a8618ff90..0000000000 --- a/camel/providers/imap/camel-imap-store.c +++ /dev/null @@ -1,788 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-imap-store.c : class for an imap store */ - -/* - * Authors: Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - - -#include <config.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> - -#include <gal/util/e-util.h> - -#include "camel-imap-store.h" -#include "camel-imap-auth.h" -#include "camel-imap-folder.h" -#include "camel-imap-utils.h" -#include "camel-imap-command.h" -#include "camel-folder.h" -#include "camel-exception.h" -#include "camel-session.h" -#include "camel-stream.h" -#include "camel-stream-buffer.h" -#include "camel-stream-fs.h" -#include "camel-url.h" -#include "string-utils.h" - -#define d(x) x - -/* Specified in RFC 2060 */ -#define IMAP_PORT 143 - -static CamelRemoteStoreClass *remote_store_class = NULL; - -static gboolean imap_connect (CamelService *service, CamelException *ex); -static gboolean imap_disconnect (CamelService *service, gboolean clean, CamelException *ex); -static GList *query_auth_types_generic (CamelService *service, CamelException *ex); -static GList *query_auth_types_connected (CamelService *service, CamelException *ex); -static CamelFolder *get_folder (CamelStore *store, const char *folder_name, guint32 flags, CamelException *ex); -static char *get_folder_name (CamelStore *store, const char *folder_name, - CamelException *ex); -static char *get_root_folder_name (CamelStore *store, CamelException *ex); -static CamelFolderInfo *get_folder_info (CamelStore *store, const char *top, - gboolean fast, gboolean recursive, - gboolean subscribed_only, - CamelException *ex); -static gboolean folder_subscribed (CamelStore *store, const char *folder_name); -static void subscribe_folder (CamelStore *store, const char *folder_name, - CamelException *ex); -static void unsubscribe_folder (CamelStore *store, const char *folder_name, - CamelException *ex); -static void imap_keepalive (CamelRemoteStore *store); - -static void -camel_imap_store_class_init (CamelImapStoreClass *camel_imap_store_class) -{ - /* virtual method overload */ - CamelServiceClass *camel_service_class = - CAMEL_SERVICE_CLASS (camel_imap_store_class); - CamelStoreClass *camel_store_class = - CAMEL_STORE_CLASS (camel_imap_store_class); - CamelRemoteStoreClass *camel_remote_store_class = - CAMEL_REMOTE_STORE_CLASS (camel_imap_store_class); - - remote_store_class = CAMEL_REMOTE_STORE_CLASS(camel_type_get_global_classfuncs - (camel_remote_store_get_type ())); - - /* virtual method overload */ - camel_service_class->query_auth_types_generic = query_auth_types_generic; - camel_service_class->query_auth_types_connected = query_auth_types_connected; - camel_service_class->connect = imap_connect; - camel_service_class->disconnect = imap_disconnect; - - camel_store_class->get_folder = get_folder; - camel_store_class->get_folder_name = get_folder_name; - camel_store_class->get_root_folder_name = get_root_folder_name; - camel_store_class->get_folder_info = get_folder_info; - camel_store_class->free_folder_info = camel_store_free_folder_info_full; - - camel_store_class->folder_subscribed = folder_subscribed; - camel_store_class->subscribe_folder = subscribe_folder; - camel_store_class->unsubscribe_folder = unsubscribe_folder; - - camel_remote_store_class->keepalive = imap_keepalive; -} - -static gboolean -free_sub (gpointer key, gpointer value, gpointer user_data) -{ - g_free (key); - return TRUE; -} - -static void -camel_imap_store_finalize (CamelObject *object) -{ - CamelImapStore *imap_store = CAMEL_IMAP_STORE (object); - - g_hash_table_foreach_remove (imap_store->subscribed_folders, - free_sub, NULL); - g_hash_table_destroy (imap_store->subscribed_folders); -} - -static void -camel_imap_store_init (gpointer object, gpointer klass) -{ - CamelRemoteStore *remote_store = CAMEL_REMOTE_STORE (object); - CamelImapStore *imap_store = CAMEL_IMAP_STORE (object); - CamelStore *store = CAMEL_STORE (object); - - remote_store->default_port = 143; - - imap_store->dir_sep = '\0'; - imap_store->current_folder = NULL; - - store->flags = CAMEL_STORE_SUBSCRIPTIONS; - - imap_store->connected = FALSE; - imap_store->subscribed_folders = g_hash_table_new (g_str_hash, g_str_equal); -} - -CamelType -camel_imap_store_get_type (void) -{ - static CamelType camel_imap_store_type = CAMEL_INVALID_TYPE; - - if (camel_imap_store_type == CAMEL_INVALID_TYPE) { - camel_imap_store_type = - camel_type_register (CAMEL_REMOTE_STORE_TYPE, "CamelImapStore", - sizeof (CamelImapStore), - sizeof (CamelImapStoreClass), - (CamelObjectClassInitFunc) camel_imap_store_class_init, - NULL, - (CamelObjectInitFunc) camel_imap_store_init, - (CamelObjectFinalizeFunc) camel_imap_store_finalize); - } - - return camel_imap_store_type; -} - -static struct { - const char *name; - guint32 flag; -} capabilities[] = { - { "IMAP4", IMAP_CAPABILITY_IMAP4 }, - { "IMAP4REV1", IMAP_CAPABILITY_IMAP4REV1 }, - { "STATUS", IMAP_CAPABILITY_STATUS }, - { "NAMESPACE", IMAP_CAPABILITY_NAMESPACE }, - { "AUTH=KERBEROS_V4", IMAP_CAPABILITY_AUTH_KERBEROS_V4 }, - { "AUTH=GSSAPI", IMAP_CAPABILITY_AUTH_GSSAPI }, - { "UIDPLUS", IMAP_CAPABILITY_UIDPLUS }, - { "LITERAL+", IMAP_CAPABILITY_LITERALPLUS }, - { NULL, 0 } -}; - -static gboolean -connect_to_server (CamelService *service, CamelException *ex) -{ - CamelImapStore *store = CAMEL_IMAP_STORE (service); - CamelImapResponse *response; - char *result, *buf, *capa, *lasts; - int i; - - if (!CAMEL_SERVICE_CLASS (remote_store_class)->connect (service, ex)) - return FALSE; - - store->command = 0; - - /* Read the greeting, if any. FIXME: deal with PREAUTH */ - if (camel_remote_store_recv_line (CAMEL_REMOTE_STORE (service), - &buf, ex) < 0) { - return FALSE; - } - g_free (buf); - store->connected = TRUE; - - /* Find out the IMAP capabilities */ - store->capabilities = 0; - response = camel_imap_command (store, NULL, ex, "CAPABILITY"); - if (!response) - return FALSE; - result = camel_imap_response_extract (response, "CAPABILITY", ex); - if (!result) - return FALSE; - - /* Skip over "* CAPABILITY". */ - capa = imap_next_word (result + 2); - - for (capa = strtok_r (capa, " ", &lasts); capa; - capa = strtok_r (NULL, " ", &lasts)) { - for (i = 0; capabilities[i].name; i++) { - if (g_strcasecmp (capa, capabilities[i].name) == 0) { - store->capabilities |= capabilities[i].flag; - break; - } - } - } - g_free (result); - - if (store->capabilities & IMAP_CAPABILITY_IMAP4REV1) { - store->server_level = IMAP_LEVEL_IMAP4REV1; - store->capabilities |= IMAP_CAPABILITY_STATUS; - } else if (store->capabilities & IMAP_CAPABILITY_IMAP4) - store->server_level = IMAP_LEVEL_IMAP4; - else - store->server_level = IMAP_LEVEL_UNKNOWN; - - return TRUE; -} - -static CamelServiceAuthType password_authtype = { - N_("Password"), - - N_("This option will connect to the IMAP server using a " - "plaintext password."), - - "", - TRUE -}; - -#ifdef HAVE_KRB4 -static CamelServiceAuthType kerberos_v4_authtype = { - N_("Kerberos 4"), - - N_("This option will connect to the IMAP server using " - "Kerberos 4 authentication."), - - "KERBEROS_V4", - FALSE -}; -#endif - -static GList * -query_auth_types_connected (CamelService *service, CamelException *ex) -{ - GList *types; - - if (!connect_to_server (service, ex)) - return NULL; - - types = CAMEL_SERVICE_CLASS (remote_store_class)->query_auth_types_connected (service, ex); -#ifdef HAVE_KRB4 - if (CAMEL_IMAP_STORE (service)->capabilities & - IMAP_CAPABILITY_AUTH_KERBEROS_V4) - types = g_list_prepend (types, &kerberos_v4_authtype); -#endif - return g_list_prepend (types, &password_authtype); -} - -static GList * -query_auth_types_generic (CamelService *service, CamelException *ex) -{ - GList *types; - - types = CAMEL_SERVICE_CLASS (remote_store_class)->query_auth_types_generic (service, ex); -#ifdef HAVE_KRB4 - types = g_list_prepend (types, &kerberos_v4_authtype); -#endif - return g_list_prepend (types, &password_authtype); -} - -static gboolean -imap_connect (CamelService *service, CamelException *ex) -{ - CamelImapStore *store = CAMEL_IMAP_STORE (service); - CamelSession *session = camel_service_get_session (CAMEL_SERVICE (store)); - gchar *result, *errbuf = NULL, *namespace; - CamelImapResponse *response; - gboolean authenticated = FALSE; - int len; - - if (connect_to_server (service, ex) == 0) - return FALSE; - - /* authenticate the user */ -#ifdef HAVE_KRB4 - if (service->url->authmech && - !g_strcasecmp (service->url->authmech, "KERBEROS_V4")) { - if (!(store->capabilities & IMAP_CAPABILITY_AUTH_KERBEROS_V4)) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, - "IMAP server %s does not " - "support requested " - "authentication type %s", - service->url->host, - service->url->authmech); - camel_service_disconnect (service, TRUE, NULL); - return FALSE; - } - - authenticated = imap_try_kerberos_v4_auth (store, ex); - if (camel_exception_is_set (ex)) { - camel_service_disconnect (service, TRUE, NULL); - return FALSE; - } - } -#endif - - while (!authenticated) { - if (errbuf) { - /* We need to un-cache the password before prompting again */ - camel_session_query_authenticator ( - session, CAMEL_AUTHENTICATOR_TELL, NULL, - TRUE, service, "password", ex); - g_free (service->url->passwd); - service->url->passwd = NULL; - } - - if (!service->url->authmech && !service->url->passwd) { - char *prompt; - - prompt = g_strdup_printf (_("%sPlease enter the IMAP " - "password for %s@%s"), - errbuf ? errbuf : "", - service->url->user, - service->url->host); - service->url->passwd = - camel_session_query_authenticator ( - session, CAMEL_AUTHENTICATOR_ASK, - prompt, TRUE, service, "password", ex); - g_free (prompt); - g_free (errbuf); - errbuf = NULL; - - if (!service->url->passwd) { - camel_exception_set (ex, CAMEL_EXCEPTION_USER_CANCEL, - "You didn\'t enter a password."); - camel_service_disconnect (service, TRUE, NULL); - return FALSE; - } - } - - response = camel_imap_command (store, NULL, ex, - "LOGIN \"%s\" \"%s\"", - service->url->user, - service->url->passwd); - if (!response) { - errbuf = g_strdup_printf (_("Unable to authenticate " - "to IMAP server.\n%s\n\n"), - camel_exception_get_description (ex)); - camel_exception_clear (ex); - } else { - authenticated = TRUE; - camel_imap_response_free (response); - } - } - - /* Find our storage path. */ - if (!store->storage_path) { - store->storage_path = - camel_session_get_storage_path (session, service, ex); - if (camel_exception_is_set (ex)) - return FALSE; - } - - /* Find the hierarchy separator for our namespace. */ - namespace = service->url->path; - if (namespace) - namespace++; - else - namespace = ""; - if (store->server_level >= IMAP_LEVEL_IMAP4REV1) { - /* This idiom means "tell me the hierarchy separator - * for the given path, even if that path doesn't exist. - */ - response = camel_imap_command (store, NULL, ex, - "LIST \"%s\" \"\"", - namespace); - } else { - /* Plain IMAP4 doesn't have that idiom, so we fall back - * to "tell me about this folder", which will fail if - * the folder doesn't exist (eg, if namespace is ""). - */ - response = camel_imap_command (store, NULL, ex, - "LIST \"\" \"%s\"", - namespace); - } - if (!response) - return FALSE; - - result = camel_imap_response_extract (response, "LIST", NULL); - if (result) { - imap_parse_list_response (result, NULL, &store->dir_sep, NULL); - g_free (result); - } - if (!store->dir_sep) - store->dir_sep = '/'; /* Guess */ - - /* Generate base URL */ - store->base_url = camel_url_to_string (service->url, FALSE); - len = strlen (store->base_url); - if (service->url->path) - store->base_url[len - strlen (service->url->path) + 1] = '\0'; - else { - store->base_url = g_realloc (store->base_url, len + 2); - store->base_url[len] = '/'; - store->base_url[len + 1] = '\0'; - } - - camel_remote_store_refresh_folders (CAMEL_REMOTE_STORE (store), ex); - - return !camel_exception_is_set (ex); -} - -static gboolean -imap_disconnect (CamelService *service, gboolean clean, CamelException *ex) -{ - CamelImapStore *store = CAMEL_IMAP_STORE (service); - CamelImapResponse *response; - - if (store->connected && clean) { - /* send the logout command */ - response = camel_imap_command (store, NULL, ex, "LOGOUT"); - camel_imap_response_free (response); - } - - store->current_folder = NULL; - - return CAMEL_SERVICE_CLASS (remote_store_class)->disconnect (service, clean, ex); -} - -static gboolean -imap_folder_exists (CamelImapStore *store, const char *folder_name, - gboolean *selectable, char **short_name, - CamelException *ex) -{ - CamelImapResponse *response; - char *result, sep; - int flags; - - if (!g_strcasecmp (folder_name, "INBOX")) { - if (selectable) - *selectable = TRUE; - if (short_name) - *short_name = g_strdup ("INBOX"); - return TRUE; - } - - response = camel_imap_command (store, NULL, ex, "LIST \"\" \"%s\"", - folder_name); - if (!response) - return FALSE; - result = camel_imap_response_extract (response, "LIST", ex); - if (!result) - return FALSE; - - if (!imap_parse_list_response (result, &flags, &sep, NULL)) - return FALSE; - - if (selectable) - *selectable = !(flags & IMAP_LIST_FLAG_NOSELECT); - if (short_name) { - *short_name = strrchr (folder_name, sep); - if (*short_name) - *short_name = g_strdup (*short_name + 1); - else - *short_name = g_strdup (folder_name); - } - - return TRUE; -} - -static gboolean -imap_create (CamelImapStore *store, const char *folder_name, - CamelException *ex) -{ - CamelImapResponse *response; - - response = camel_imap_command (store, NULL, ex, "CREATE \"%s\"", - folder_name); - camel_imap_response_free (response); - - return !camel_exception_is_set (ex); -} - -static CamelFolder * -get_folder (CamelStore *store, const char *folder_name, guint32 flags, - CamelException *ex) -{ - CamelImapStore *imap_store = CAMEL_IMAP_STORE (store); - CamelFolder *new_folder = NULL; - char *short_name, *summary_file, *p; - gboolean selectable; - - if (!imap_folder_exists (imap_store, folder_name, - &selectable, &short_name, ex)) { - if ((flags & CAMEL_STORE_FOLDER_CREATE) == 0) - return NULL; - - if (!imap_create (imap_store, folder_name, ex)) - return NULL; - - if (!imap_folder_exists (imap_store, folder_name, - &selectable, &short_name, ex)) - return NULL; - } - - if (!selectable) { - camel_exception_setv (ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, - "%s is not a selectable folder", - folder_name); - g_free (short_name); - return NULL; - } - - summary_file = g_strdup_printf ("%s/%s/#summary", - imap_store->storage_path, - folder_name); - p = strrchr (summary_file, '/'); - *p = '\0'; - if (e_mkdir_hier (summary_file, S_IRWXU) == 0) { - *p = '/'; - new_folder = camel_imap_folder_new (store, folder_name, - short_name, summary_file, - ex); - } else { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not create directory %s: %s"), - summary_file, g_strerror (errno)); - } - g_free (summary_file); - g_free (short_name); - - if (camel_exception_is_set (ex)) - return NULL; - - return new_folder; -} - -static char * -get_folder_name (CamelStore *store, const char *folder_name, - CamelException *ex) -{ - /* INBOX is case-insensitive */ - if (g_strcasecmp (folder_name, "INBOX") == 0) - return g_strdup ("INBOX"); - else - return g_strdup (folder_name); -} - -static char * -get_root_folder_name (CamelStore *store, CamelException *ex) -{ - return g_strdup (""); -} - -static CamelFolderInfo * -parse_list_response_as_folder_info (CamelImapStore *imap_store, - const char *response) -{ - CamelFolderInfo *fi; - int flags; - char sep, *dir, *name; - - if (!imap_parse_list_response (response, &flags, &sep, &dir)) - return NULL; - - if (sep) { - name = strrchr (dir, sep); - if (name && !*++name) { - g_free (dir); - return NULL; - } - } - - fi = g_new0 (CamelFolderInfo, 1); - fi->full_name = dir; - if (sep && name) - fi->name = g_strdup (name); - else - fi->name = g_strdup (dir); - if (!(flags & IMAP_LIST_FLAG_NOSELECT)) - fi->url = g_strdup_printf ("%s%s", imap_store->base_url, dir); - - return fi; -} - -static CamelFolderInfo * -get_folder_info (CamelStore *store, const char *top, gboolean fast, - gboolean recursive, gboolean subscribed_only, - CamelException *ex) -{ - CamelImapStore *imap_store = CAMEL_IMAP_STORE (store); - CamelURL *url = CAMEL_SERVICE (store)->url; - gboolean need_inbox = FALSE; - int i; - CamelImapResponse *response; - GPtrArray *folders; - const char *name; - char *pattern, *list; - char *status, *p; - CamelFolderInfo *topfi, *fi; - - name = top; - if (!name) { - need_inbox = !subscribed_only; - if (url->path) - name = url->path + 1; - else - name = ""; - } - response = camel_imap_command (imap_store, NULL, ex, - "LIST \"\" \"%s\"", name); - if (!response) - return FALSE; - list = camel_imap_response_extract (response, "LIST", ex); - if (!list) - return FALSE; - topfi = parse_list_response_as_folder_info (imap_store, list); - g_free (list); - if (!topfi) { - topfi = g_new0 (CamelFolderInfo, 1); - topfi->full_name = g_strdup (name); - topfi->name = g_strdup (name); - } - - if (!top && subscribed_only) - pattern = g_strdup (""); - else if (*name) - pattern = g_strdup_printf ("%s%c", name, imap_store->dir_sep); - else - pattern = g_strdup (name); - response = camel_imap_command (imap_store, NULL, ex, - "%s \"\" \"%s%c\"", - subscribed_only ? "LSUB" : "LIST", - pattern, recursive ? '*' : '%'); - g_free (pattern); - if (!response) - return NULL; - - if (subscribed_only) { - g_hash_table_foreach_remove (imap_store->subscribed_folders, - free_sub, NULL); - } - - /* Turn responses into CamelFolderInfo and remove any - * extraneous responses. - */ - folders = g_ptr_array_new (); - for (i = 0; i < response->untagged->len; i++) { - list = response->untagged->pdata[i]; - fi = parse_list_response_as_folder_info (imap_store, list); - if (!fi) - continue; - g_ptr_array_add (folders, fi); - - if (subscribed_only) { - g_hash_table_insert (imap_store->subscribed_folders, - g_strdup (fi->full_name), - GUINT_TO_POINTER (1)); - } - - if (!g_strcasecmp (fi->full_name, "INBOX")) - need_inbox = FALSE; - } - camel_imap_response_free (response); - - /* Add INBOX, if necessary */ - if (need_inbox) { - fi = g_new0 (CamelFolderInfo, 1); - fi->full_name = g_strdup ("INBOX"); - fi->name = g_strdup ("INBOX"); - fi->url = g_strdup_printf ("%sINBOX", imap_store->base_url); - - g_ptr_array_add (folders, fi); - } - - if (!fast) { - /* Get read/unread counts */ - for (i = 0; i < folders->len; i++) { - fi = folders->pdata[i]; - if (!fi->url) - continue; - - response = camel_imap_command ( - imap_store, NULL, NULL, - "STATUS \"%s\" (MESSAGES UNSEEN)", - fi->full_name); - if (!response) - continue; - status = camel_imap_response_extract ( - response, "STATUS", NULL); - if (!status) - continue; - - p = e_strstrcase (status, "MESSAGES"); - if (p) - fi->message_count = strtoul (p + 8, NULL, 10); - p = e_strstrcase (status, "UNSEEN"); - if (p) - fi->unread_message_count = strtoul (p + 6, NULL, 10); - g_free (status); - } - } - - /* And assemble */ - camel_folder_info_build (folders, topfi, imap_store->dir_sep, TRUE); - g_ptr_array_free (folders, TRUE); - - /* Remove the top if it's the root of the store. */ - if (!top && !topfi->sibling && !topfi->url) { - fi = topfi; - topfi = topfi->child; - fi->child = NULL; - camel_folder_info_free (fi); - for (fi = topfi; fi; fi = fi->sibling) - fi->parent = NULL; - } - - return topfi; -} - -static gboolean -folder_subscribed (CamelStore *store, const char *folder_name) -{ - CamelImapStore *imap_store = CAMEL_IMAP_STORE (store); - - return g_hash_table_lookup (imap_store->subscribed_folders, - folder_name) != NULL; -} - -static void -subscribe_folder (CamelStore *store, const char *folder_name, - CamelException *ex) -{ - CamelImapStore *imap_store = CAMEL_IMAP_STORE (store); - CamelImapResponse *response; - - response = camel_imap_command (imap_store, NULL, ex, - "SUBSCRIBE \"%s\"", folder_name); - if (response) { - g_hash_table_insert (imap_store->subscribed_folders, - g_strdup (folder_name), - GUINT_TO_POINTER (1)); - } - camel_imap_response_free (response); -} - -static void -unsubscribe_folder (CamelStore *store, const char *folder_name, - CamelException *ex) -{ - CamelImapStore *imap_store = CAMEL_IMAP_STORE (store); - CamelImapResponse *response; - gpointer key, value; - - response = camel_imap_command (imap_store, NULL, ex, - "UNSUBSCRIBE \"%s\"", folder_name); - if (response) { - g_hash_table_lookup_extended (imap_store->subscribed_folders, - folder_name, key, value); - g_hash_table_remove (imap_store->subscribed_folders, - folder_name); - g_free (key); - } - camel_imap_response_free (response); -} - -static void -imap_keepalive (CamelRemoteStore *store) -{ - CamelImapStore *imap_store = CAMEL_IMAP_STORE (store); - CamelImapResponse *response; - - response = camel_imap_command (imap_store, NULL, NULL, "NOOP"); - camel_imap_response_free (response); -} diff --git a/camel/providers/imap/camel-imap-store.h b/camel/providers/imap/camel-imap-store.h deleted file mode 100644 index 8fd996c420..0000000000 --- a/camel/providers/imap/camel-imap-store.h +++ /dev/null @@ -1,88 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-imap-store.h : class for an imap store */ - -/* - * Authors: Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_IMAP_STORE_H -#define CAMEL_IMAP_STORE_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include "camel-remote-store.h" - -#define CAMEL_IMAP_STORE_TYPE (camel_imap_store_get_type ()) -#define CAMEL_IMAP_STORE(obj) (CAMEL_CHECK_CAST((obj), CAMEL_IMAP_STORE_TYPE, CamelImapStore)) -#define CAMEL_IMAP_STORE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_IMAP_STORE_TYPE, CamelImapStoreClass)) -#define IS_CAMEL_IMAP_STORE(o) (CAMEL_CHECK_TYPE((o), CAMEL_IMAP_STORE_TYPE)) - -typedef enum { - IMAP_LEVEL_UNKNOWN, - IMAP_LEVEL_IMAP4, - IMAP_LEVEL_IMAP4REV1 -} CamelImapServerLevel; - -#define IMAP_CAPABILITY_IMAP4 (1 << 0) -#define IMAP_CAPABILITY_IMAP4REV1 (1 << 1) -#define IMAP_CAPABILITY_STATUS (1 << 2) -#define IMAP_CAPABILITY_NAMESPACE (1 << 3) -#define IMAP_CAPABILITY_AUTH_KERBEROS_V4 (1 << 4) -#define IMAP_CAPABILITY_AUTH_GSSAPI (1 << 5) -#define IMAP_CAPABILITY_UIDPLUS (1 << 6) -#define IMAP_CAPABILITY_LITERALPLUS (1 << 7) - -typedef struct { - CamelRemoteStore parent_object; - - CamelFolder *current_folder; - - guint32 command; - - CamelImapServerLevel server_level; - guint32 capabilities; - - gchar dir_sep, *storage_path, *base_url; - - gboolean connected; - - GHashTable *subscribed_folders; -} CamelImapStore; - - -typedef struct { - CamelRemoteStoreClass parent_class; - -} CamelImapStoreClass; - - -/* Standard Camel function */ -CamelType camel_imap_store_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_IMAP_STORE_H */ diff --git a/camel/providers/imap/camel-imap-stream.c b/camel/providers/imap/camel-imap-stream.c deleted file mode 100644 index 4e9ee046d7..0000000000 --- a/camel/providers/imap/camel-imap-stream.c +++ /dev/null @@ -1,220 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - - -#include <config.h> -#include "camel-imap-stream.h" -#include "camel/camel-exception.h" -#include <sys/types.h> -#include <errno.h> -#include <stdlib.h> - -static CamelStreamClass *parent_class = NULL; - -/* Returns the class for a CamelImapStream */ -#define CIS_CLASS(so) CAMEL_IMAP_STREAM_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - -static ssize_t stream_read (CamelStream *stream, char *buffer, size_t n); -static int stream_reset (CamelStream *stream); -static gboolean stream_eos (CamelStream *stream); - -static void finalize (CamelObject *object); - -static void -camel_imap_stream_class_init (CamelImapStreamClass *camel_imap_stream_class) -{ - CamelStreamClass *camel_stream_class = - CAMEL_STREAM_CLASS (camel_imap_stream_class); - - parent_class = CAMEL_STREAM_CLASS (camel_type_get_global_classfuncs (camel_stream_get_type ())); - - /* virtual method overload */ - camel_stream_class->read = stream_read; - camel_stream_class->reset = stream_reset; - camel_stream_class->eos = stream_eos; -} - -static void -camel_imap_stream_init (gpointer object, gpointer klass) -{ - CamelImapStream *imap_stream = CAMEL_IMAP_STREAM (object); - - imap_stream->cache = NULL; - imap_stream->cache_ptr = NULL; -} - -CamelType -camel_imap_stream_get_type (void) -{ - static CamelType camel_imap_stream_type = CAMEL_INVALID_TYPE; - - if (camel_imap_stream_type == CAMEL_INVALID_TYPE) { - camel_imap_stream_type = - camel_type_register (camel_stream_get_type (), "CamelImapStream", - sizeof (CamelImapStream), - sizeof (CamelImapStreamClass), - (CamelObjectClassInitFunc) camel_imap_stream_class_init, - NULL, - (CamelObjectInitFunc) camel_imap_stream_init, - (CamelObjectFinalizeFunc) finalize); - } - - return camel_imap_stream_type; -} - -CamelStream * -camel_imap_stream_new (CamelImapFolder *folder, char *command) -{ - CamelImapStream *imap_stream; - - imap_stream = CAMEL_IMAP_STREAM(camel_object_new (camel_imap_stream_get_type ())); - - imap_stream->folder = folder; - camel_object_ref (CAMEL_OBJECT (imap_stream->folder)); - - imap_stream->command = g_strdup (command); - - return CAMEL_STREAM (imap_stream); -} - -static void -finalize (CamelObject *object) -{ - CamelImapStream *imap_stream = CAMEL_IMAP_STREAM (object); - - g_free (imap_stream->cache); - g_free (imap_stream->command); - - if (imap_stream->folder) - camel_object_unref (CAMEL_OBJECT (imap_stream->folder)); -} - -static ssize_t -stream_read (CamelStream *stream, char *buffer, size_t n) -{ - ssize_t nread; - - /* do we want to do any IMAP specific parsing in here? If not, maybe rename to camel-stream-cache? */ - CamelImapStream *imap_stream = CAMEL_IMAP_STREAM (stream); - - if (!imap_stream->cache) { - /* We need to send the IMAP command since this is our first fetch */ - CamelFolder *folder = CAMEL_FOLDER (imap_stream->folder); - CamelException ex; - gchar *result, *p, *q; - gint status, part_len; - - camel_exception_init (&ex); - status = camel_imap_fetch_command (CAMEL_IMAP_STORE (folder->parent_store), - CAMEL_FOLDER (imap_stream->folder), - &result, &ex, "%s\r\n", - imap_stream->command); - /* FIXME: exception is ignored */ - camel_exception_clear (&ex); - - if (!result || status != CAMEL_IMAP_OK) { - /* we got an error, dump this stuff */ - g_free (result); - imap_stream->cache = NULL; - camel_object_unref (CAMEL_OBJECT (imap_stream->folder)); - - return -1; - } - - /* we don't need the folder anymore... */ - camel_object_unref (CAMEL_OBJECT (imap_stream->folder)); - - /* parse out the message part */ - for (p = result; *p && *p != '{' && *p != '"' && *p != '\n'; p++); - switch (*p) { - case '"': - /* a quoted string - section 4.3 */ - p++; - for (q = p; *q && *q != '"' && *q != '\n'; q++); - part_len = (gint) (q - p); - - break; - case '{': - /* a literal string - section 4.3 */ - part_len = atoi (p + 1); - for ( ; *p && *p != '\n'; p++); - if (*p != '\n') { - g_free (result); - return -1; - } - - /* advance to the beginning of the actual data */ - p++; - - /* calculate the new part-length */ - for (q = p; *q && (q - p) <= part_len; q++) { - if (*q == '\n') - part_len--; - } - - /* FIXME: This is a hack for IMAP daemons that send us a UID at the end of each FETCH */ - for ( ; q > p && *(q-1) != '\n'; q--, part_len--); - part_len++; - - break; - default: - /* Bad input */ - g_free (result); - return -1; - } - - imap_stream->cache = g_strndup (p, part_len); - g_free (result); - - imap_stream->cache_ptr = imap_stream->cache; - } - - /* we've already read this stream, so return whats in the cache */ - nread = MIN (n, strlen (imap_stream->cache_ptr)); - - if (nread > 0) { - memcpy (buffer, imap_stream->cache_ptr, nread); - imap_stream->cache_ptr += nread; - } else { - nread = -1; - } - - return nread; -} - -static int -stream_reset (CamelStream *stream) -{ - CamelImapStream *imap_stream = CAMEL_IMAP_STREAM (stream); - - imap_stream->cache_ptr = imap_stream->cache; - - return 1; -} - -static gboolean -stream_eos (CamelStream *stream) -{ - CamelImapStream *imap_stream = CAMEL_IMAP_STREAM (stream); - - return (imap_stream->cache_ptr && strlen (imap_stream->cache_ptr)); -} diff --git a/camel/providers/imap/camel-imap-stream.h b/camel/providers/imap/camel-imap-stream.h deleted file mode 100644 index 88881e7c1f..0000000000 --- a/camel/providers/imap/camel-imap-stream.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - - -#ifndef CAMEL_IMAP_STREAM_H -#define CAMEL_IMAP_STREAM_H - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-stream.h> -#include "camel-imap-folder.h" -#include "camel-imap-store.h" -#include <sys/types.h> - -#define CAMEL_IMAP_STREAM_TYPE (camel_imap_stream_get_type ()) -#define CAMEL_IMAP_STREAM(obj) (CAMEL_CHECK_CAST((obj), CAMEL_IMAP_STREAM_TYPE, CamelImapStream)) -#define CAMEL_IMAP_STREAM_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_IMAP_STREAM_TYPE, CamelImapStreamClass)) -#define CAMEL_IS_IMAP_STREAM(o) (CAMEL_CHECK_TYPE((o), CAMEL_IMAP_STREAM_TYPE)) - -typedef struct _CamelImapStream CamelImapStream; -typedef struct _CamelImapStreamClass CamelImapStreamClass; - -struct _CamelImapStream { - CamelStream parent_object; - - CamelImapFolder *folder; - char *command; - char *cache; - char *cache_ptr; -}; - -struct _CamelImapStreamClass { - CamelStreamClass parent_class; - - /* Virtual methods */ -}; - -/* Standard Camel function */ -CamelType camel_imap_stream_get_type (void); - -/* public methods */ -CamelStream *camel_imap_stream_new (CamelImapFolder *folder, char *command); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_IMAP_STREAM_H */ diff --git a/camel/providers/imap/camel-imap-summary.c b/camel/providers/imap/camel-imap-summary.c deleted file mode 100644 index ebdf8b9842..0000000000 --- a/camel/providers/imap/camel-imap-summary.c +++ /dev/null @@ -1,147 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: - * Michael Zucchi <notzed@helixcode.com> - * Dan Winship <danw@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "camel-imap-summary.h" -#include <camel/camel-mime-message.h> - -#include <sys/stat.h> -#include <sys/uio.h> -#include <unistd.h> -#include <errno.h> -#include <string.h> -#include <stdlib.h> - -#define CAMEL_IMAP_SUMMARY_VERSION (0x1000) - -static int summary_header_load (CamelFolderSummary *, FILE *); -static int summary_header_save (CamelFolderSummary *, FILE *); - -static void camel_imap_summary_class_init (CamelImapSummaryClass *klass); -static void camel_imap_summary_init (CamelImapSummary *obj); - -static CamelFolderSummaryClass *camel_imap_summary_parent; - -CamelType -camel_imap_summary_get_type (void) -{ - static CamelType type = CAMEL_INVALID_TYPE; - - if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register( - camel_folder_summary_get_type(), "CamelImapSummary", - sizeof (CamelImapSummary), - sizeof (CamelImapSummaryClass), - (CamelObjectClassInitFunc) camel_imap_summary_class_init, - NULL, - (CamelObjectInitFunc) camel_imap_summary_init, - NULL); - } - - return type; -} - -static void -camel_imap_summary_class_init (CamelImapSummaryClass *klass) -{ - CamelFolderSummaryClass *cfs_class = (CamelFolderSummaryClass *) klass; - - camel_imap_summary_parent = CAMEL_FOLDER_SUMMARY_CLASS (camel_type_get_global_classfuncs (camel_folder_summary_get_type())); - - cfs_class->summary_header_load = summary_header_load; - cfs_class->summary_header_save = summary_header_save; -} - -static void -camel_imap_summary_init (CamelImapSummary *obj) -{ - CamelFolderSummary *s = (CamelFolderSummary *)obj; - - /* subclasses need to set the right instance data sizes */ - s->message_info_size = sizeof(CamelImapMessageInfo); - s->content_info_size = sizeof(CamelImapMessageContentInfo); - - /* and a unique file version */ - s->version += CAMEL_IMAP_SUMMARY_VERSION; -} - -/** - * camel_imap_summary_new: - * @filename: the file to store the summary in. - * @validity: the current UIDVALIDITY value of the folder - * - * This will create a new CamelImapSummary object and read in the - * summary data from disk, if it exists and has the right UIDVALIDITY - * value. - * - * Return value: A new CamelImapSummary object. - **/ -CamelFolderSummary * -camel_imap_summary_new (const char *filename, guint32 validity) -{ - CamelFolderSummary *summary = CAMEL_FOLDER_SUMMARY ( - camel_object_new (camel_imap_summary_get_type ())); - CamelImapSummary *imap_summary = (CamelImapSummary *)summary; - - camel_folder_summary_set_build_content (summary, FALSE); - camel_folder_summary_set_filename (summary, filename); - - if (camel_folder_summary_load (summary) == -1) { - if (errno == ENOENT) { - imap_summary->validity = validity; - return summary; - } else { - camel_object_unref ((CamelObject *)summary); - return NULL; - } - } - if (imap_summary->validity != validity) { - camel_folder_summary_clear (summary); - imap_summary->validity = validity; - } - - return summary; -} - - -static int -summary_header_load (CamelFolderSummary *s, FILE *in) -{ - CamelImapSummary *ims = CAMEL_IMAP_SUMMARY (s); - - if (camel_imap_summary_parent->summary_header_load (s, in) == -1) - return -1; - - return camel_folder_summary_decode_uint32 (in, &ims->validity); -} - -static int -summary_header_save (CamelFolderSummary *s, FILE *out) -{ - CamelImapSummary *ims = CAMEL_IMAP_SUMMARY(s); - - if (camel_imap_summary_parent->summary_header_save (s, out) == -1) - return -1; - - return camel_folder_summary_encode_uint32 (out, ims->validity); -} diff --git a/camel/providers/imap/camel-imap-summary.h b/camel/providers/imap/camel-imap-summary.h deleted file mode 100644 index 0b844fdd7e..0000000000 --- a/camel/providers/imap/camel-imap-summary.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: - * Michael Zucchi <notzed@helixcode.com> - * Dan Winship <danw@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef _CAMEL_IMAP_SUMMARY_H -#define _CAMEL_IMAP_SUMMARY_H - -#include <camel/camel-folder-summary.h> -#include <camel/camel-exception.h> - -#define CAMEL_IMAP_SUMMARY(obj) CAMEL_CHECK_CAST (obj, camel_imap_summary_get_type (), CamelImapSummary) -#define CAMEL_IMAP_SUMMARY_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_imap_summary_get_type (), CamelImapSummaryClass) -#define CAMEL_IS_IMAP_SUMMARY(obj) CAMEL_CHECK_TYPE (obj, camel_imap_summary_get_type ()) - -typedef struct _CamelImapSummary CamelImapSummary; -typedef struct _CamelImapSummaryClass CamelImapSummaryClass; - -typedef struct _CamelImapMessageContentInfo { - CamelMessageContentInfo info; - -} CamelImapMessageContentInfo; - -typedef struct _CamelImapMessageInfo { - CamelMessageInfo info; - -} CamelImapMessageInfo; - -struct _CamelImapSummary { - CamelFolderSummary parent; - - guint32 validity; -}; - -struct _CamelImapSummaryClass { - CamelFolderSummaryClass parent_class; - -}; - -guint camel_imap_summary_get_type (void); -CamelFolderSummary *camel_imap_summary_new (const char *filename, - guint32 validity); - -#endif /* ! _CAMEL_IMAP_SUMMARY_H */ - diff --git a/camel/providers/imap/camel-imap-utils.c b/camel/providers/imap/camel-imap-utils.c deleted file mode 100644 index b38024ecc6..0000000000 --- a/camel/providers/imap/camel-imap-utils.c +++ /dev/null @@ -1,688 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#include <ctype.h> -#include <stdio.h> -#include <string.h> -#include <time.h> - -#include <gtk/gtk.h> -#include "camel-imap-utils.h" -#include "string-utils.h" -#include <e-sexp.h> -#include "camel/camel-folder-summary.h" - -#define d(x) x - -char * -imap_next_word (const char *buf) -{ - char *word; - - /* skip over current word */ - for (word = (char *)buf; *word && *word != ' '; word++); - - /* skip over white space */ - for ( ; *word && *word == ' '; word++); - - return word; -} - -/** - * imap_parse_list_response: - * @buf: the LIST or LSUB response - * @flags: a pointer to a variable to store the flags in, or %NULL - * @sep: a pointer to a variable to store the hierarchy separator in, or %NULL - * @folder: a pointer to a variable to store the folder name in, or %NULL - * - * Parses a LIST or LSUB response and returns the desired parts of it. - * If @folder is non-%NULL, its value must be freed by the caller. - * - * Return value: whether or not the response was successfully parsed. - **/ -gboolean -imap_parse_list_response (const char *buf, int *flags, char *sep, char **folder) -{ - char *word; - int len; - - if (*buf != '*') - return FALSE; - - word = imap_next_word (buf); - if (g_strncasecmp (word, "LIST", 4) && g_strncasecmp (word, "LSUB", 4)) - return FALSE; - - /* get the flags */ - word = imap_next_word (word); - if (*word != '(') - return FALSE; - - if (flags) - *flags = 0; - - word++; - while (*word != ')') { - len = strcspn (word, " )"); - if (flags) { - if (!g_strncasecmp (word, "\\Noinferiors", len)) - *flags |= IMAP_LIST_FLAG_NOINFERIORS; - else if (!g_strncasecmp (word, "\\Noselect", len)) - *flags |= IMAP_LIST_FLAG_NOSELECT; - else if (!g_strncasecmp (word, "\\Marked", len)) - *flags |= IMAP_LIST_FLAG_MARKED; - else if (!g_strncasecmp (word, "\\Unmarked", len)) - *flags |= IMAP_LIST_FLAG_UNMARKED; - } - - word += len; - while (*word == ' ') - word++; - } - - /* get the directory separator */ - word = imap_next_word (word); - if (!strncmp (word, "NIL", 3)) { - if (sep) - *sep = '\0'; - } else if (*word++ == '"') { - if (*word == '\\') - word++; - if (sep) - *sep = *word; - word++; - if (*word++ != '"') - return FALSE; - } else - return FALSE; - - if (folder) { - /* get the folder name */ - word = imap_next_word (word); - *folder = imap_parse_astring (&word, &len); - return *folder != NULL; - } - - return TRUE; -} - -static ESExpResult * -func_and (struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - GList **list = data; - ESExpResult *r; - - d(fprintf (stderr, "in AND func (argc = %d)\n", argc)); - if (argc > 0) { - char **strings; - int i; - - strings = g_new (char*, argc+1); - strings[argc] = NULL; - - for (i = 0; i < argc; i++) { - GList *list_head = *list; - - d(fprintf (stderr, "\tAND func: %s\n", (*list) ? (char *) (*list)->data : "(null)")); - strings[argc - (i+1)] = (*list) ? (*list)->data : g_strdup (""); - *list = g_list_remove_link (*list, *list); - g_list_free_1 (list_head); - } - - *list = g_list_prepend (*list, g_strjoinv (" ", strings)); - d(fprintf (stderr, "%s\n", (char *) (*list)->data)); - - for (i = 0 ; i < argc; i ++) - g_free (strings[i]); - - g_free (strings); - } - - r = e_sexp_result_new (ESEXP_RES_BOOL); - r->value.bool = FALSE; - - return r; -} - -static ESExpResult * -func_or (struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - GList **list = data; - ESExpResult *r; - - d(fprintf (stderr, "in OR func (argc = %d)\n", argc)); - if (argc == 2 && (*list)->data && (*list)->next && (*list)->next->data) { - char **strings; - int i; - - strings = g_new (char*, argc+2); - strings[0] = g_strdup ("OR"); - strings[argc+2 - 1] = NULL; - - for (i = 0; i < 2; i++) { - GList *list_head = *list; - - d(fprintf (stderr, "\tOR func: %s\n", (*list) ? (char *) (*list)->data : "(null)")); - strings[argc - i] = (*list) ? (*list)->data : g_strdup (""); - *list = g_list_remove_link (*list, *list); - g_list_free_1 (list_head); - } - - *list = g_list_prepend (*list, g_strjoinv (" ", strings)); - d(fprintf (stderr, "%s\n", (char *) (*list)->data)); - - for (i = 0 ; i < argc + 2; i ++) - g_free (strings[i]); - - g_free (strings); - } - - r = e_sexp_result_new (ESEXP_RES_BOOL); - r->value.bool = FALSE; - - return r; -} - -static ESExpResult * -func_not (struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - GList **list = data; - ESExpResult *r; - - d(fprintf (stderr, "in NOT func\n")); - /* just replace the head of the list with the NOT of it. */ - if (argc > 0) { - char *term = (*list)->data; - - (*list)->data = g_strdup_printf ("NOT %s", term); - d(fprintf (stderr, "%s\n", (char *) (*list)->data)); - g_free (term); - } - - r = e_sexp_result_new (ESEXP_RES_BOOL); - r->value.bool = FALSE; - - return r; -} - -static char *tz_months [] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" -}; - -static char * -format_date (time_t time, int offset) -{ - struct tm tm; - - time += ((offset / 100) * (60*60)) + (offset % 100)*60; - - d(printf("converting date %s", ctime (&time))); - - memcpy (&tm, gmtime (&time), sizeof (tm)); - - return g_strdup_printf ("%d-%s-%04d", - tm.tm_mday, tz_months[tm.tm_mon], - tm.tm_year + 1900); -} - -static ESExpResult * -func_lt (struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - GList **list = data; - char *type = (*list)->data; - time_t date = (time_t) (argv[1])->value.number; - ESExpResult *r; - - d(fprintf (stderr, "in less-than func: (%d) (%s) (%d)\n", argc, type, (int) date)); - if (argc > 0) { - char *string, *date_str; - - date_str = format_date (date, 0); - - if (!strcmp ("SENT", type)) { - string = g_strdup_printf ("SENTBEFORE \"%s\"", date_str); - } else { - string = g_strdup_printf ("BEFORE \"%s\"", date_str); - } - - (*list)->data = string; - g_free (type); - } - - r = e_sexp_result_new (ESEXP_RES_BOOL); - r->value.bool = FALSE; - - return r; -} - -static ESExpResult * -func_gt (struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - GList **list = data; - char *type = (*list)->data; - time_t date = (time_t) (argv[1])->value.number; - ESExpResult *r; - - d(fprintf (stderr, "in greater-than func: (%d) (%s) (%d)\n", argc, type, (int) date)); - if (argc > 0) { - char *string, *date_str; - - date_str = format_date (date, 0); - - if (!strcmp ("SENT", type)) { - string = g_strdup_printf ("SENTSINCE \"%s\"", date_str); - } else { - string = g_strdup_printf ("SINCE \"%s\"", date_str); - } - - (*list)->data = string; - g_free (type); - } - - r = e_sexp_result_new (ESEXP_RES_BOOL); - r->value.bool = FALSE; - - return r; -} - -static ESExpResult * -func_eq (struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - GList **list = data; - char *type = (*list)->data; - time_t date = (time_t) (argv[1])->value.number; - ESExpResult *r; - - d(fprintf (stderr, "in equal-to func: (%d) (%s) (%d)\n", argc, type, (int) date)); - if (argc > 0) { - char *string, *date_str; - - date_str = format_date (date, 0); - - if (!strcmp ("SENT", type)) { - string = g_strdup_printf ("SENTON \"%s\"", date_str); - } else { - string = g_strdup_printf ("ON \"%s\"", date_str); - } - - (*list)->data = string; - g_free (type); - } - - r = e_sexp_result_new (ESEXP_RES_BOOL); - r->value.bool = FALSE; - - return r; -} - -static ESExpResult * -func_match_all (struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - /* match-all doesn't have a IMAP equiv */ - ESExpResult *r; - - r = e_sexp_result_new (ESEXP_RES_BOOL); - r->value.bool = FALSE; - - return r; -} - -static ESExpResult * -func_body_contains (struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - GList **list = data; - char *value = (*argv)->value.string; - ESExpResult *r; - - if (argc > 0) { - char *string; - - string = g_strdup_printf ("BODY \"%s\"", value); - - *list = g_list_prepend (*list, string); - } - - r = e_sexp_result_new (ESEXP_RES_BOOL); - r->value.bool = FALSE; - - return r; -} - -static ESExpResult * -func_header_contains (struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - GList **list = data; - char *header = (argv[0])->value.string; - char *match = (argv[1])->value.string; - ESExpResult *r; - - if (argc == 2) { - char *string; - string = g_strdup_printf ("HEADER %s \"%s\"", header, match); - - *list = g_list_prepend (*list, string); - } - - r = e_sexp_result_new (ESEXP_RES_BOOL); - r->value.bool = FALSE; - - return r; -} - -static ESExpResult * -func_user_tag (struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - /* FIXME: what do I do here? */ - ESExpResult *r; - - r = e_sexp_result_new (ESEXP_RES_BOOL); - r->value.bool = FALSE; - - return r; -} - -static ESExpResult * -func_user_flag (struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - /* FIXME: what do I do here? */ - ESExpResult *r; - - r = e_sexp_result_new (ESEXP_RES_BOOL); - r->value.bool = FALSE; - - return r; -} - -static ESExpResult * -func_get_sent_date (struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - GList **list = data; - ESExpResult *r; - - *list = g_list_prepend (*list, g_strdup ("SENT")); - - r = e_sexp_result_new (ESEXP_RES_BOOL); - r->value.bool = FALSE; - - return r; -} - -static ESExpResult * -func_get_received_date (struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - GList **list = data; - ESExpResult *r; - - *list = g_list_prepend (*list, g_strdup ("RECEIVED")); - - r = e_sexp_result_new (ESEXP_RES_BOOL); - r->value.bool = FALSE; - - return r; -} - -static ESExpResult * -func_get_current_date (struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - ESExpResult *r; - - r = e_sexp_result_new (ESEXP_RES_INT); - r->value.number = time (NULL); - - return r; -} - -/* builtin functions */ -static struct { - char *name; - ESExpFunc *func; - int type; /* set to 1 if a function can perform shortcut evaluation, or - doesn't execute everything, 0 otherwise */ -} symbols[] = { - { "and", (ESExpFunc *) func_and, 0 }, - { "or", (ESExpFunc *) func_or, 0 }, - { "not", (ESExpFunc *) func_not, 0 }, - { "<", (ESExpFunc *) func_lt, 0 }, - { ">", (ESExpFunc *) func_gt, 0 }, - { "=", (ESExpFunc *) func_eq, 0 }, - { "match-all", (ESExpFunc *) func_match_all, 0 }, - { "body-contains", (ESExpFunc *) func_body_contains, 0 }, - { "header-contains", (ESExpFunc *) func_header_contains, 0 }, - { "user-tag", (ESExpFunc *) func_user_tag, 1 }, - { "user-flag", (ESExpFunc *) func_user_flag, 1 }, - { "get-sent-date", (ESExpFunc *) func_get_sent_date, 1 }, - { "get-received-date", (ESExpFunc *) func_get_received_date, 1 }, - { "get-current-date", (ESExpFunc *) func_get_current_date, 1 } -}; - -char * -imap_translate_sexp (const char *expression) -{ - ESExp *sexp; - ESExpResult *r; - gchar *retval; - GList *list = NULL; - int i; - - sexp = e_sexp_new (); - - for (i = 0; i < sizeof (symbols) / sizeof (symbols[0]); i++) { - if (symbols[i].type == 1) { - e_sexp_add_ifunction (sexp, 0, symbols[i].name, - (ESExpIFunc *)symbols[i].func, &list); - } else { - e_sexp_add_function (sexp, 0, symbols[i].name, - symbols[i].func, &list); - } - } - - e_sexp_input_text (sexp, expression, strlen (expression)); - - e_sexp_parse (sexp); - - r = e_sexp_eval (sexp); - - gtk_object_unref (GTK_OBJECT (sexp)); - e_sexp_result_free (r); - - if (list->next) { - g_warning ("conversion to IMAP SEARCH string failed"); - retval = NULL; - g_list_foreach (list, (GFunc)g_free, NULL); - } else { - retval = list->data; - } - - g_list_free (list); - - return retval; -} - -char * -imap_create_flag_list (guint32 flags) -{ - GString *gstr; - char *flag_list; - - gstr = g_string_new ("("); - - if (flags & CAMEL_MESSAGE_ANSWERED) - g_string_append (gstr, "\\Answered "); - if (flags & CAMEL_MESSAGE_DELETED) - g_string_append (gstr, "\\Deleted "); - if (flags & CAMEL_MESSAGE_DRAFT) - g_string_append (gstr, "\\Draft "); - if (flags & CAMEL_MESSAGE_FLAGGED) - g_string_append (gstr, "\\Flagged "); - if (flags & CAMEL_MESSAGE_SEEN) - g_string_append (gstr, "\\Seen "); - - if (gstr->str[gstr->len - 1] == ' ') - gstr->str[gstr->len - 1] = ')'; - else - g_string_append_c (gstr, ')'); - - flag_list = gstr->str; - g_string_free (gstr, FALSE); - return flag_list; -} - -guint32 -imap_parse_flag_list (const char *flag_list) -{ - guint32 flags = 0; - int len; - - if (*flag_list++ != '(') - return 0; - - while (*flag_list != ')') { - len = strcspn (flag_list, " )"); - if (!g_strncasecmp (flag_list, "\\Answered", len)) - flags |= CAMEL_MESSAGE_ANSWERED; - else if (!g_strncasecmp (flag_list, "\\Deleted", len)) - flags |= CAMEL_MESSAGE_DELETED; - else if (!g_strncasecmp (flag_list, "\\Draft", len)) - flags |= CAMEL_MESSAGE_DRAFT; - else if (!g_strncasecmp (flag_list, "\\Flagged", len)) - flags |= CAMEL_MESSAGE_FLAGGED; - else if (!g_strncasecmp (flag_list, "\\Seen", len)) - flags |= CAMEL_MESSAGE_SEEN; - - flag_list += len; - if (*flag_list == ' ') - flag_list++; - } - - return flags; -} - -/** - * imap_parse_nstring: - * @str_p: a pointer to a string - * @len: a pointer to an int to return the length in - * - * This parses an "nstring" (NIL, a quoted string, or a literal) - * starting at *@str_p. On success, *@str_p will point to the first - * character after the end of the nstring, and *@len will contain - * the length of the returned string. On failure, *@str_p will be - * set to %NULL. - * - * This assumes that the string is in the form returned by - * camel_imap_command(): that line breaks are indicated by LF rather - * than CRLF. - * - * Return value: the parsed string, or %NULL if a NIL or no string - * was parsed. (In the former case, *@str_p will be %NULL; in the - * latter, it will point to the character after the NIL.) - **/ -char * -imap_parse_nstring (char **str_p, int *len) -{ - char *str = *str_p; - char *out; - - if (!str) - return NULL; - else if (*str == '"') { - char *p; - int size; - - str++; - size = strcspn (str, "\"") + 1; - p = out = g_malloc (size); - - while (*str && *str != '"') { - if (*str == '\\') - str++; - *p++ = *str++; - if (p - out == size) { - out = g_realloc (out, size * 2); - p = out + size; - size *= 2; - } - } - if (*str != '"') { - *str_p = NULL; - g_free (out); - return NULL; - } - *p = '\0'; - *str_p = str + 1; - *len = strlen (out); - return out; - } else if (*str == '{') { - *len = strtoul (str + 1, (char **)&str, 10); - if (*str++ != '}' || *str++ != '\n' || strlen (str) < *len) { - *str_p = NULL; - return NULL; - } - out = g_strndup (str, *len); - *str_p = str + *len; - return out; - } else if (!g_strncasecmp (str, "nil", 3)) { - *str_p += 3; - *len = 0; - return NULL; - } else { - *str_p = NULL; - return NULL; - } -} - -/** - * imap_parse_astring: - * @str_p: a pointer to a string - * @len: a pointer to an int to return the length in - * - * This parses an "astring" (an atom, a quoted string, or a literal) - * starting at *@str_p. On success, *@str_p will point to the first - * character after the end of the astring, and *@len will contain - * the length of the returned string. On failure, *@str_p will be - * set to %NULL. - * - * This assumes that the string is in the form returned by - * camel_imap_command(): that line breaks are indicated by LF rather - * than CRLF. - * - * Return value: the parsed string, or %NULL if no string - * was parsed. (In this case, *@str_p will also be %NULL.) - **/ -char * -imap_parse_astring (char **str_p, int *len) -{ - char *p; - - if (**str_p == '{' || **str_p == '"') - return imap_parse_nstring (str_p, len); - - p = *str_p; - while (isascii ((unsigned char)*p) && - !strchr ("(){ \"\\%*", *p)) - p++; - - *len = p - *str_p; - p = g_strndup (*str_p, *len); - *str_p += *len; - return p; -} diff --git a/camel/providers/imap/camel-imap-utils.h b/camel/providers/imap/camel-imap-utils.h deleted file mode 100644 index d0cc05832d..0000000000 --- a/camel/providers/imap/camel-imap-utils.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#ifndef CAMEL_IMAP_UTILS_H -#define CAMEL_IMAP_UTILS_H 1 - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <glib.h> - -char *imap_next_word (const char *buf); - -#define IMAP_LIST_FLAG_NOINFERIORS (1 << 0) -#define IMAP_LIST_FLAG_NOSELECT (1 << 1) -#define IMAP_LIST_FLAG_MARKED (1 << 2) -#define IMAP_LIST_FLAG_UNMARKED (1 << 3) -gboolean imap_parse_list_response (const char *buf, int *flags, char *sep, char **folder); - -char *imap_translate_sexp (const char *expression); - -char *imap_create_flag_list (guint32 flags); -guint32 imap_parse_flag_list (const char *flag_list); - -char *imap_parse_nstring (char **str_p, int *len); -char *imap_parse_astring (char **str_p, int *len); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_IMAP_UTILS_H */ diff --git a/camel/providers/imap/libcamelimap.urls b/camel/providers/imap/libcamelimap.urls deleted file mode 100644 index c301c0ffac..0000000000 --- a/camel/providers/imap/libcamelimap.urls +++ /dev/null @@ -1 +0,0 @@ -imap diff --git a/camel/providers/maildir/.cvsignore b/camel/providers/maildir/.cvsignore deleted file mode 100644 index 2e7b174532..0000000000 --- a/camel/providers/maildir/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -Makefile.in -Makefile -.deps -*.lo -*.la -.libs diff --git a/camel/providers/maildir/Makefile.am b/camel/providers/maildir/Makefile.am deleted file mode 100644 index 80b41a2d45..0000000000 --- a/camel/providers/maildir/Makefile.am +++ /dev/null @@ -1,22 +0,0 @@ -## Process this file with automake to produce Makefile.in - -libcamelmaildirincludedir = $(includedir)/camel - -lib_LTLIBRARIES = libcamelmaildir.la - -INCLUDES = -I.. -I$(srcdir)/.. -I$(top_srcdir)/intl -I$(top_srcdir)/camel \ - $(GTK_INCLUDEDIR) -I$(includedir) \ - -DG_LOG_DOMAIN=\"camel-maildir-provider\" - -libcamelmaildir_la_SOURCES = \ - camel-maildir-folder.c \ - camel-maildir-provider.c \ - camel-maildir-store.c - -libcamelmaildirinclude_HEADERS = \ - camel-maildir-folder.h \ - camel-maildir-store.h - -libcamelmaildir_la_LDFLAGS = -version-info 0:0:0 - -EXTRA_DIST = diff --git a/camel/providers/maildir/camel-maildir-folder.c b/camel/providers/maildir/camel-maildir-folder.c deleted file mode 100644 index 2cb81f3e81..0000000000 --- a/camel/providers/maildir/camel-maildir-folder.c +++ /dev/null @@ -1,802 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-maildir-folder.c : camel-folder subclass for maildir folders */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@inria.fr> . - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -/* - * AUTHORS : Jukka Zitting - * - */ - - -#include <config.h> -#include <sys/stat.h> -#include <sys/param.h> -#include <unistd.h> -#include <sys/types.h> -#include <fcntl.h> -#include <dirent.h> -#include <stdio.h> -#include <errno.h> -#include <time.h> -#include <string.h> -#include "camel-maildir-folder.h" -#include "camel-maildir-store.h" -#include "camel-stream-fs.h" -#include "camel-log.h" - -static CamelFolderClass *parent_class=NULL; - -/* Returns the class for a CamelMaildirFolder */ -#define CMAILDIRF_CLASS(so) CAMEL_MAILDIR_FOLDER_CLASS (GTK_OBJECT(so)->klass) -#define CF_CLASS(so) CAMEL_FOLDER_CLASS (GTK_OBJECT(so)->klass) -#define CMAILDIRS_CLASS(so) CAMEL_STORE_CLASS (GTK_OBJECT(so)->klass) - -static void _init_with_store (CamelFolder *folder, CamelStore *parent_store, CamelException *ex); -static void _set_name (CamelFolder *folder, const gchar *name, CamelException *ex); -static gboolean _exists (CamelFolder *folder, CamelException *ex); -static gboolean _create (CamelFolder *folder, CamelException *ex); -static gboolean _delete (CamelFolder *folder, gboolean recurse, CamelException *ex); -static gboolean _delete_messages (CamelFolder *folder, CamelException *ex); -static CamelMimeMessage *_get_message (CamelFolder *folder, gint number, CamelException *ex); -static gint _get_message_count (CamelFolder *folder, CamelException *ex); -static void _expunge (CamelFolder *folder, CamelException *ex); -static GList *_list_subfolders (CamelFolder *folder, CamelException *ex); - -/* fs utility functions */ -static DIR * _xopendir (const gchar *path); -static gboolean _xstat (const gchar *path, struct stat *buf); -static gboolean _xmkdir (const gchar *path); -static gboolean _xrename (const gchar *from, const gchar *to); -static gboolean _xunlink (const gchar *path); -static gboolean _xrmdir (const gchar *path); -/* ** */ - -static void -camel_maildir_folder_class_init (CamelMaildirFolderClass *camel_maildir_folder_class) -{ - CamelFolderClass *camel_folder_class = - CAMEL_FOLDER_CLASS (camel_maildir_folder_class); - - parent_class = gtk_type_class (camel_folder_get_type ()); - - /* virtual method definition */ - /* virtual method overload */ - camel_folder_class->init_with_store = _init_with_store; - camel_folder_class->set_name = _set_name; - camel_folder_class->exists = _exists; - camel_folder_class->create = _create; - camel_folder_class->delete = _delete; - camel_folder_class->delete_messages = _delete_messages; - camel_folder_class->expunge = _expunge; - camel_folder_class->get_message = _get_message; - camel_folder_class->get_message_count = _get_message_count; - camel_folder_class->list_subfolders = _list_subfolders; -} - -GtkType -camel_maildir_folder_get_type (void) -{ - static GtkType camel_maildir_folder_type = 0; - - if (!camel_maildir_folder_type) { - GtkTypeInfo camel_maildir_folder_info = - { - "CamelMaildirFolder", - sizeof (CamelMaildirFolder), - sizeof (CamelMaildirFolderClass), - (GtkClassInitFunc) camel_maildir_folder_class_init, - (GtkObjectInitFunc) NULL, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_maildir_folder_type = - gtk_type_unique (CAMEL_FOLDER_TYPE, &camel_maildir_folder_info); - } - - return camel_maildir_folder_type; -} - - - - - - -/** - * CamelMaildirFolder::init_with_store: initializes the folder object - * @folder: folder object to initialize - * @parent_store: parent store object of the folder - * - * Simply tells that the folder can contain messages but not subfolders. - * Perhaps we'll later implement subfolders too... - */ -static void -_init_with_store (CamelFolder *folder, CamelStore *parent_store, CamelException *ex) -{ - CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::init_with_store\n"); - g_assert (folder); - g_assert (parent_store); - - /* call parent method */ - parent_class->init_with_store (folder, parent_store, ex); - - folder->can_hold_messages = TRUE; - folder->can_hold_folders = TRUE; - folder->has_summary_capability = FALSE; - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::init_with_store\n"); -} - -/** - * CamelMaildirFolder::set_name: sets the name of the folder - * @folder: folder object - * @name: name of the folder - * - * Sets the name of the folder object. The existence of a folder with - * the given name is not checked in this function. - */ -static void -_set_name (CamelFolder *folder, const gchar *name, CamelException *ex) -{ - CamelMaildirFolder *maildir_folder; - CamelMaildirStore *maildir_store; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::set_name\n"); - g_assert (folder); - g_assert (name); - g_assert (folder->parent_store); - - maildir_folder = CAMEL_MAILDIR_FOLDER (folder); - maildir_store = CAMEL_MAILDIR_STORE (folder->parent_store); - - /* call default implementation */ - parent_class->set_name (folder, name, ex); - - if (maildir_folder->directory_path) - g_free (maildir_folder->directory_path); - - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::set_name full_name is %s\n", folder->full_name); - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::set_name toplevel_dir is %s\n", maildir_store->toplevel_dir); - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::set_name separator is %c\n", camel_store_get_separator (folder->parent_store)); - - if (folder->full_name && folder->full_name[0]) - maildir_folder->directory_path = - g_strconcat (maildir_store->toplevel_dir, G_DIR_SEPARATOR_S, - folder->full_name, NULL); - else - maildir_folder->directory_path = g_strdup (maildir_store->toplevel_dir); - - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::set_name: name set to %s\n", name); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::set_name\n"); -} - -/** - * CamelMaildirFolder::exists: tests whether the named maildir exists - * @folder: folder object - * - * A created maildir folder object doesn't necessarily exist yet in the - * filesystem. This function checks whether the maildir exists. - * The structure of the maildir is stated in the maildir.5 manpage. - * - * maildir.5: - * A directory in maildir format has three subdirectories, - * all on the same filesystem: tmp, new, and cur. - * - * Return value: TRUE if the maildir exists, FALSE otherwise - */ -static gboolean -_exists (CamelFolder *folder, CamelException *ex) -{ - CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER (folder); - static const gchar *dir[3] = { "new", "cur", "tmp" }; - gint i; - struct stat statbuf; - const gchar *maildir; - gchar *path; - gboolean rv = TRUE; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::exists\n"); - g_assert (folder); - g_return_val_if_fail (maildir_folder->directory_path, FALSE); - - maildir = maildir_folder->directory_path; - - CAMEL_LOG_FULL_DEBUG ("CamelMailFolder::exists: checking maildir %s\n", - maildir); - - /* check whether the toplevel directory exists */ - rv = _xstat (maildir, &statbuf) && S_ISDIR (statbuf.st_mode); - - /* check whether the maildir subdirectories exist */ - for (i = 0; rv && i < 3; i++) { - path = g_strconcat (maildir, G_DIR_SEPARATOR_S, dir[i], NULL); - - rv = _xstat (path, &statbuf) && S_ISDIR (statbuf.st_mode); - - g_free (path); - } - - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::exists: %s\n", - (rv) ? "maildir found" : "maildir not found"); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::exists\n"); - return rv; -} - -/** - * CamelMaildirFolder::create: creates the named maildir - * @folder: folder object - * - * A created maildir folder object doesn't necessarily exist yet in the - * filesystem. This function creates the maildir if it doesn't yet exist. - * The structure of the maildir is stated in the maildir.5 manpage. - * - * maildir.5: - * A directory in maildir format has three subdirectories, - * all on the same filesystem: tmp, new, and cur. - * - * Return value: TRUE if the maildir existed already or was created, - * FALSE otherwise - */ -static gboolean -_create (CamelFolder *folder, CamelException *ex) -{ - CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER (folder); - static const gchar *dir[3] = { "new", "cur", "tmp" }; - gint i; - const gchar *maildir; - gchar *path; - gboolean rv = TRUE; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::create\n"); - g_assert (folder); - - /* check whether the maildir already exists */ - if (camel_folder_exists (folder, ex)) return TRUE; - - maildir = maildir_folder->directory_path; - - CAMEL_LOG_FULL_DEBUG ("CamelMailFolder::create: creating maildir %s\n", - maildir); - - /* create the toplevel directory */ - rv = _xmkdir (maildir); - - /* create the maildir subdirectories */ - for (i = 0; rv && i < 3; i++) { - path = g_strconcat (maildir, G_DIR_SEPARATOR_S, dir[i], NULL); - - rv = _xmkdir (path); - - g_free (path); - } - - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::create: %s\n", - rv ? "maildir created" : "an error occurred"); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::create\n"); - return rv; -} - -/** - * CamelMaildirFolder::delete: delete the maildir folder - * @folder: the folder object - * @recurse: - * - * This function empties and deletes the maildir folder. The subdirectories - * "tmp", "cur", and "new" are removed first and then the toplevel maildir - * directory is deleted. All files from the directories are deleted as well, - * so you should be careful when using this function. If a subdirectory cannot - * be deleted, then the operation it is stopped. Thus if an error occurs, the - * maildir directory won't be removed, but it might no longer be a valid maildir. - */ -static gboolean -_delete (CamelFolder *folder, gboolean recurse, CamelException *ex) -{ - CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER (folder); - static const gchar *dir[3] = { "new", "cur", "tmp" }; - gint i; - const gchar *maildir; - gchar *path; - gboolean rv = TRUE; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::create\n"); - g_assert (folder); - - /* check whether the maildir already exists */ - if (!camel_folder_exists (folder, ex)) return TRUE; - - maildir = maildir_folder->directory_path; - - CAMEL_LOG_FULL_DEBUG ("CamelMailFolder::delete: deleting maildir %s\n", - maildir); - - /* delete the maildir subdirectories */ - for (i = 0; rv && i < 3; i++) { - path = g_strconcat (maildir, G_DIR_SEPARATOR_S, dir[i], NULL); - - rv = _xrmdir (path); - - g_free (path); - } - - /* create the toplevel directory */ - if (rv) - rv = _xrmdir (maildir); - - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::delete: %s\n", - rv ? "maildir deleted" : "an error occurred"); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::delete\n"); - return rv; -} - -/** - * CamelMaildirFolder::delete_messages: empty the maildir folder - * @folder: the folder object - * - * This function empties the maildir folder. All messages from the - * "cur" subdirectory are deleted. If a message cannot be deleted, then - * it is just skipped and the rest of the messages are still deleted. - * Files with names starting with a dot are skipped as described in the - * maildir.5 manpage. - * - * maildir.5: - * It is a good idea for readers to skip all filenames in new - * and cur starting with a dot. Other than this, readers - * should not attempt to parse filenames. - * - * Return value: FALSE on error and if some messages could not be deleted. - * TRUE otherwise. - */ -static gboolean -_delete_messages (CamelFolder *folder, CamelException *ex) -{ - CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER (folder); - const gchar *maildir; - gchar *curdir, *file; - DIR *dir_handle; - struct dirent *dir_entry; - gboolean rv = TRUE; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::delete_messages\n"); - g_assert (folder); - - /* call default implementation */ - parent_class->delete_messages (folder, ex); - - /* Check if the folder didn't exist */ - if (!camel_folder_exists (folder, ex)) return TRUE; - - maildir = maildir_folder->directory_path; - - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::delete_messages: " - "deleting messages from %s\n", maildir); - - /* delete messages from the maildir subdirectory "cur" */ - curdir = g_strconcat (maildir, G_DIR_SEPARATOR_S, "cur", NULL); - - dir_handle = _xopendir (curdir); - if (dir_handle) { - while ((dir_entry = readdir (dir_handle))) { - if (dir_entry->d_name[0] == '.') continue; - file = g_strconcat (curdir, G_DIR_SEPARATOR_S, - dir_entry->d_name, NULL); - - if (!_xunlink (file)) rv = FALSE; - - g_free (file); - } - closedir (dir_handle); - } else - rv = FALSE; - - g_free (curdir); - - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::delete_messages: %s\n", - rv ? "messages deleted" : "an error occurred"); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::delete_messages\n"); - return rv; -} - -/** - * CamelMaildirFolder::get_message: get a message from maildir - * @folder: the folder object - * @number: number of the message within the folder - * - * Return value: the message, NULL on error - */ -static CamelMimeMessage * -_get_message (CamelFolder *folder, gint number, CamelException *ex) -{ - CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER(folder); - DIR *dir_handle; - struct dirent *dir_entry; - CamelStream *stream; - CamelMimeMessage *message = NULL; - const gchar *maildir; - gchar *curdir, *file = NULL; - gint count = -1; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::get_message\n"); - g_assert(folder); - - /* Check if the folder exists */ - if (!camel_folder_exists (folder, ex)) return NULL; - - maildir = maildir_folder->directory_path; - - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::get_message: " - "getting message #%d from %s\n", number, maildir); - - /* Count until the desired message is reached */ - curdir = g_strconcat (maildir, G_DIR_SEPARATOR_S, "cur", NULL); - if ((dir_handle = _xopendir (curdir))) { - while ((count < number) && (dir_entry = readdir (dir_handle))) - if (dir_entry->d_name[0] != '.') count++; - - if (count == number) - file = g_strconcat (curdir, G_DIR_SEPARATOR_S, - dir_entry->d_name, NULL); - - closedir (dir_handle); - } - g_free (curdir); - if (!file) return NULL; - - /* Create the message object */ - message = camel_mime_message_new (); - stream = camel_stream_fs_new_with_name (file, CAMEL_STREAM_FS_READ); - - if (!message || !stream) { - g_free (file); - if (stream) gtk_object_unref (GTK_OBJECT (stream)); - if (message) gtk_object_unref (GTK_OBJECT (message)); - return NULL; - } - - camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (message), - stream); - gtk_object_unref (GTK_OBJECT (stream)); - gtk_object_set_data_full (GTK_OBJECT (message), - "fullpath", file, g_free); - - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::get_message: " - "message %p created from %s\n", message, file); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::get_message\n"); - return message; -} - -/** - * CamelMaildirFolder::get_message_count: count messages in maildir - * @folder: the folder object - * - * Returns the number of messages in the maildir folder. New messages - * are included in this count. - * - * Return value: number of messages in the maildir, -1 on error - */ -static gint -_get_message_count (CamelFolder *folder, CamelException *ex) -{ - CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER(folder); - const gchar *maildir; - gchar *newdir, *curdir, *newfile, *curfile; - DIR *dir_handle; - struct dirent *dir_entry; - guint count = 0; - - CAMEL_LOG_FULL_DEBUG ("Entering " - "CamelMaildirFolder::get_message_count\n"); - g_assert(folder); - - /* check if the maildir exists */ - if (!camel_folder_exists (folder, ex)) return -1; - - maildir = maildir_folder->directory_path; - - newdir = g_strconcat (maildir, G_DIR_SEPARATOR_S, "new", NULL); - curdir = g_strconcat (maildir, G_DIR_SEPARATOR_S, "cur", NULL); - - /* Check new messages */ - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::get_message_count: " - "getting new messages from %s\n", newdir); - if ((dir_handle = _xopendir (newdir))) { - while ((dir_entry = readdir (dir_handle))) { - if (dir_entry->d_name[0] == '.') continue; - newfile = g_strconcat (newdir, G_DIR_SEPARATOR_S, - dir_entry->d_name, NULL); - curfile = g_strconcat (curdir, G_DIR_SEPARATOR_S, - dir_entry->d_name, ":2,", NULL); - - _xrename (newfile, curfile); - - g_free (curfile); - g_free (newfile); - } - closedir (dir_handle); - } - - /* Count messages */ - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::get_message_count: " - "counting messages in %s\n", curdir); - if ((dir_handle = _xopendir (curdir))) { - while ((dir_entry = readdir (dir_handle))) - if (dir_entry->d_name[0] != '.') count++; - closedir (dir_handle); - } - - g_free (curdir); - g_free (newdir); - - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::get_message_count: " - " found %d messages\n", count); - CAMEL_LOG_FULL_DEBUG ("Leaving " - "CamelMaildirFolder::get_message_count\n"); - return count; -} - - - - -/** - * CamelMaildirFolder::expunge: expunge messages marked as deleted - * @folder: the folder object - * - * Physically deletes the messages marked as deleted in the folder. - */ -static void -_expunge (CamelFolder *folder, CamelException *ex) -{ - CamelMimeMessage *message; - GList *node; - gchar *fullpath; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::expunge\n"); - g_assert(folder); - - /* expunge messages marked for deletion */ - for (node = folder->message_list; node; node = g_list_next(node)) { - message = CAMEL_MIME_MESSAGE (node->data); - if (!message) { - CAMEL_LOG_WARNING ("CamelMaildirFolder::expunge: " - "null message in node %p\n", node); - continue; - } - - if (camel_mime_message_get_flag (message, "DELETED")) { - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::expunge: " - "expunging message #%d\n", - message->message_number); - - /* expunge the message */ - fullpath = gtk_object_get_data (GTK_OBJECT (message), - "fullpath"); - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::expunge: " - "message fullpath is %s\n", - fullpath); - - if (_xunlink (fullpath)) - message->expunged = TRUE; - } else { - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::expunge: " - "skipping message #%d\n", - message->message_number); - } - } - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::expunge\n"); -} - - - - -/** - * CamelMaildirFolder::list_subfolders: return a list of subfolders - * @folder: the folder object - * - * Returns the names of the maildir subfolders in a list. - * - * Return value: list of subfolder names - */ -static GList * -_list_subfolders (CamelFolder *folder, CamelException *ex) -{ - CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER (folder); - const gchar *maildir; - gchar *subdir; - struct stat statbuf; - struct dirent *dir_entry; - DIR *dir_handle; - GList *subfolders = NULL; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::list_subfolders\n"); - g_assert (folder); - - /* check if the maildir exists */ - if (!camel_folder_exists (folder, ex)) return NULL; - - /* scan through the maildir toplevel directory */ - maildir = maildir_folder->directory_path; - if ((dir_handle = _xopendir (maildir))) { - while ((dir_entry = readdir (dir_handle))) { - if (dir_entry->d_name[0] == '.') continue; - if (strcmp (dir_entry->d_name, "new") == 0) continue; - if (strcmp (dir_entry->d_name, "cur") == 0) continue; - if (strcmp (dir_entry->d_name, "tmp") == 0) continue; - - subdir = g_strconcat (maildir, G_DIR_SEPARATOR_S, - dir_entry->d_name, NULL); - - if (_xstat (subdir, &statbuf) - && S_ISDIR (statbuf.st_mode)) - subfolders = - g_list_append ( - subfolders, - g_strdup (dir_entry->d_name)); - - g_free (subdir); - } - closedir (dir_handle); - } - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::list_subfolders\n"); - return subfolders; -} - - - - - - - -/* - * fs utility function - * - */ - -static DIR * -_xopendir (const gchar *path) -{ - DIR *handle; - g_assert (path); - - handle = opendir (path); - if (!handle) { - CAMEL_LOG_WARNING ("ERROR: opendir (%s);\n", path); - CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n", - errno, strerror(errno)); - } - - return handle; -} - -static gboolean -_xstat (const gchar *path, struct stat *buf) -{ - gint stat_error; - g_assert (path); - g_assert (buf); - - stat_error = stat (path, buf); - if (stat_error == 0) { - return TRUE; - } else if (errno == ENOENT) { - buf->st_mode = 0; - return TRUE; - } else { - CAMEL_LOG_WARNING ("ERROR: stat (%s, %p);\n", path, buf); - CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n", - errno, strerror(errno)); - return FALSE; - } -} - -static gboolean -_xmkdir (const gchar *path) -{ - g_assert (path); - - if (mkdir (path, S_IRWXU) == -1) { - CAMEL_LOG_WARNING ("ERROR: mkdir (%s, S_IRWXU);\n", path); - CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n", - errno, strerror(errno)); - return FALSE; - } - - return TRUE; -} - -static gboolean -_xrename (const gchar *from, const gchar *to) -{ - g_assert (from); - g_assert (to); - - if (rename (from, to) == 0) { - return TRUE; - } else { - CAMEL_LOG_WARNING ("ERROR: rename (%s, %s);\n", from, to); - CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n", - errno, strerror(errno)); - return FALSE; - } -} - -static gboolean -_xunlink (const gchar *path) -{ - g_assert (path); - - if (unlink (path) == 0) { - return TRUE; - } else if (errno == ENOENT) { - return TRUE; - } else { - CAMEL_LOG_WARNING ("ERROR: unlink (%s);\n", path); - CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n", - errno, strerror(errno)); - return FALSE; - } -} - -static gboolean -_xrmdir (const gchar *path) -{ - DIR *dir_handle; - struct dirent *dir_entry; - gchar *file; - struct stat statbuf; - g_assert (path); - - dir_handle = opendir (path); - if (!dir_handle && errno == ENOENT) { - return TRUE; - } else if (!dir_handle) { - CAMEL_LOG_WARNING ("ERROR: opendir (%s);\n", path); - CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n", - errno, strerror(errno)); - return FALSE; - } - - while ((dir_entry = readdir (dir_handle))) { - file = g_strconcat (path, G_DIR_SEPARATOR_S, dir_entry->d_name, - NULL); - if (_xstat (file, &statbuf) && S_ISREG (statbuf.st_mode)) - _xunlink (file); - g_free (file); - } - - closedir (dir_handle); - - if (rmdir (path) == 0) { - return TRUE; - } else if (errno == ENOENT) { - return TRUE; - } else { - CAMEL_LOG_WARNING ("ERROR: rmdir (%s);\n", path); - CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n", - errno, strerror(errno)); - return FALSE; - } -} - -/** *** **/ - diff --git a/camel/providers/maildir/camel-maildir-folder.h b/camel/providers/maildir/camel-maildir-folder.h deleted file mode 100644 index 5997da2011..0000000000 --- a/camel/providers/maildir/camel-maildir-folder.h +++ /dev/null @@ -1,66 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-maildir-folder.h : Abstract class for an email folder */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@inria.fr> . - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ -#ifndef CAMEL_MAILDIR_FOLDER_H -#define CAMEL_MAILDIR_FOLDER_H 1 - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include "camel-folder.h" -/* #include "camel-store.h" */ - -#define CAMEL_MAILDIR_FOLDER_TYPE (camel_maildir_folder_get_type ()) -#define CAMEL_MAILDIR_FOLDER(obj) (GTK_CHECK_CAST((obj), CAMEL_MAILDIR_FOLDER_TYPE, CamelMaildirFolder)) -#define CAMEL_MAILDIR_FOLDER_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_MAILDIR_FOLDER_TYPE, CamelMaildirFolderClass)) -#define IS_CAMEL_MAILDIR_FOLDER(o) (GTK_CHECK_TYPE((o), CAMEL_MAILDIR_FOLDER_TYPE)) - - -typedef struct { - CamelFolder parent_object; - - gchar *directory_path; -} CamelMaildirFolder; - - - -typedef struct { - CamelFolderClass parent_class; - - /* Virtual methods */ - -} CamelMaildirFolderClass; - - -/* public methods */ - -/* Standard Gtk function */ -GtkType camel_maildir_folder_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MAILDIR_FOLDER_H */ diff --git a/camel/providers/maildir/camel-maildir-provider.c b/camel/providers/maildir/camel-maildir-provider.c deleted file mode 100644 index cd5521adc0..0000000000 --- a/camel/providers/maildir/camel-maildir-provider.c +++ /dev/null @@ -1,46 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-maildir-provider.c: maildir provider registration code */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@inria.fr> . - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "config.h" -#include "camel-maildir-store.h" -#include "camel-provider.h" -#include "camel-log.h" - - -static CamelProvider _maildir_provider = { - (GtkType) 0, - PROVIDER_STORE, - "maildir", - "Maildir provider for Camel", - "This maildir provider is based on the default MH provider of Camel", - (GModule *) NULL -}; - - - -CamelProvider * -camel_provider_module_init () -{ - _maildir_provider.object_type = camel_maildir_store_get_type(); - return &_maildir_provider; -} diff --git a/camel/providers/maildir/camel-maildir-store.c b/camel/providers/maildir/camel-maildir-store.c deleted file mode 100644 index 8f37494003..0000000000 --- a/camel/providers/maildir/camel-maildir-store.c +++ /dev/null @@ -1,124 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-maildir-store.c : class for an maildir store */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@inria.fr> . - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "camel-maildir-store.h" -#include "camel-maildir-folder.h" -#include "url-util.h" - -static CamelStoreClass *parent_class=NULL; - -/* Returns the class for a CamelMaildirStore */ -#define CMAILDIRS_CLASS(so) CAMEL_MAILDIR_STORE_CLASS (GTK_OBJECT(so)->klass) -#define CF_CLASS(so) CAMEL_FOLDER_CLASS (GTK_OBJECT(so)->klass) -#define CMAILDIRF_CLASS(so) CAMEL_MAILDIR_FOLDER_CLASS (GTK_OBJECT(so)->klass) - -static void _init (CamelStore *store, CamelSession *session, - const gchar *url_name); -static CamelFolder *_get_folder (CamelStore *store, const gchar *folder_name); - -static void -camel_maildir_store_class_init ( - CamelMaildirStoreClass *camel_maildir_store_class) -{ - CamelStoreClass *camel_store_class = - CAMEL_STORE_CLASS (camel_maildir_store_class); - - parent_class = gtk_type_class (camel_store_get_type ()); - - /* virtual method definition */ - /* virtual method overload */ - camel_store_class->init = _init; - camel_store_class->get_folder = _get_folder; -} - -static void -camel_maildir_store_init (gpointer object, gpointer klass) -{ - CamelMaildirStore *maildir_store = CAMEL_MAILDIR_STORE (object); - CamelStore *store = CAMEL_STORE (object); - - store->separator = G_DIR_SEPARATOR; -} - -GtkType -camel_maildir_store_get_type (void) -{ - static GtkType camel_maildir_store_type = 0; - - if (!camel_maildir_store_type) { - GtkTypeInfo camel_maildir_store_info = - { - "CamelMaildirStore", - sizeof (CamelMaildirStore), - sizeof (CamelMaildirStoreClass), - (GtkClassInitFunc) camel_maildir_store_class_init, - (GtkObjectInitFunc) camel_maildir_store_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_maildir_store_type = - gtk_type_unique (CAMEL_STORE_TYPE, - &camel_maildir_store_info); - } - - return camel_maildir_store_type; -} - -static void -_init (CamelStore *store, CamelSession *session, const gchar *url_name) -{ - CamelMaildirStore *maildir_store = CAMEL_MAILDIR_STORE (store); - Gurl *store_url; - g_assert (url_name); - - /* call parent implementation */ - parent_class->init (store, session, url_name); - - /* find the path in the URL*/ - store_url = g_url_new (url_name); - - g_return_if_fail (store_url); - g_return_if_fail (store_url->path); - - maildir_store->toplevel_dir = g_strdup (store_url->path); - - g_url_free (store_url); -} - -static CamelFolder * -_get_folder (CamelStore *store, const gchar *folder_name) -{ - CamelMaildirStore *maildir_store = CAMEL_MAILDIR_STORE (store); - CamelMaildirFolder *new_maildir_folder; - CamelFolder *new_folder; - - new_maildir_folder = gtk_type_new (CAMEL_MAILDIR_FOLDER_TYPE); - new_folder = CAMEL_FOLDER (new_maildir_folder); - - CF_CLASS (new_folder)->init_with_store (new_folder, store, NULL); - CF_CLASS (new_folder)->set_name (new_folder, folder_name, NULL); - - return new_folder; -} diff --git a/camel/providers/maildir/camel-maildir-store.h b/camel/providers/maildir/camel-maildir-store.h deleted file mode 100644 index 1a95ed1436..0000000000 --- a/camel/providers/maildir/camel-maildir-store.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-maildirstore.h : class for an maildir store */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@inria.fr> . - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_MAILDIR_STORE_H -#define CAMEL_MAILDIR_STORE_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include "camel-store.h" - -#define CAMEL_MAILDIR_STORE_TYPE (camel_maildir_store_get_type ()) -#define CAMEL_MAILDIR_STORE(obj) (GTK_CHECK_CAST((obj), CAMEL_MAILDIR_STORE_TYPE, CamelMaildirStore)) -#define CAMEL_MAILDIR_STORE_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_MAILDIR_STORE_TYPE, CamelMaildirStoreClass)) -#define IS_CAMEL_MAILDIR_STORE(o) (GTK_CHECK_TYPE((o), CAMEL_MAILDIR_STORE_TYPE)) - - -typedef struct { - CamelStore parent_object; - - gchar *toplevel_dir; -} CamelMaildirStore; - - - -typedef struct { - CamelStoreClass parent_class; - - -} CamelMaildirStoreClass; - - -/* public methods */ - -/* Standard Gtk function */ -GtkType camel_maildir_store_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MAILDIR_STORE_H */ - - diff --git a/camel/providers/mbox/.cvsignore b/camel/providers/mbox/.cvsignore deleted file mode 100644 index fd6b811c68..0000000000 --- a/camel/providers/mbox/.cvsignore +++ /dev/null @@ -1,7 +0,0 @@ -.deps -Makefile -Makefile.in -.libs -.deps -*.lo -*.la diff --git a/camel/providers/mbox/Makefile.am b/camel/providers/mbox/Makefile.am deleted file mode 100644 index 073d9830de..0000000000 --- a/camel/providers/mbox/Makefile.am +++ /dev/null @@ -1,39 +0,0 @@ -## Process this file with automake to produce Makefile.in - -libcamelmboxincludedir = $(includedir)/camel - - -providerdir = $(pkglibdir)/camel-providers/$(VERSION) - -provider_LTLIBRARIES = libcamelmbox.la -provider_DATA = libcamelmbox.urls - -INCLUDES = -I.. \ - -I$(srcdir)/.. \ - -I$(top_srcdir)/camel \ - -I$(top_srcdir)/intl \ - -I$(top_srcdir)/libibex \ - -I$(top_srcdir)/e-util \ - -I$(top_srcdir) \ - -I$(includedir) \ - $(GTK_INCLUDEDIR) \ - -DG_LOG_DOMAIN=\"camel-mbox-provider\" - -libcamelmbox_la_SOURCES = \ - camel-mbox-folder.c \ - camel-mbox-provider.c \ - camel-mbox-store.c \ - camel-mbox-summary.c - -libcamelmboxinclude_HEADERS = \ - camel-mbox-folder.h \ - camel-mbox-store.h \ - camel-mbox-summary.h - -libcamelmbox_la_LDFLAGS = -version-info 0:0:0 - -libcamelmbox_la_LIBADD = $(top_builddir)/e-util/libeutil.la $(top_builddir)/libibex/libibex.la $(UNICODE_LIBS) -#libcamelmbox_la_LIBADD = $(top_builddir)/libibex/libibex.la $(UNICODE_LIBS) - -EXTRA_DIST = libcamelmbox.urls - diff --git a/camel/providers/mbox/camel-mbox-folder.c b/camel/providers/mbox/camel-mbox-folder.c deleted file mode 100644 index 44dfc7c6a4..0000000000 --- a/camel/providers/mbox/camel-mbox-folder.c +++ /dev/null @@ -1,620 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */ -/* camel-mbox-folder.c : Abstract class for an email folder */ - -/* - * Authors: Bertrand Guiheneuf <bertrand@helixcode.com> - * Michael Zucchi <notzed@helixcode.com> - * Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright (C) 1999, 2000 Helix Code Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> - -#include <stdlib.h> -#include <sys/types.h> -#include <dirent.h> -#include <sys/stat.h> -#include <unistd.h> -#include <errno.h> -#include <string.h> -#include <fcntl.h> - -#include "camel-mbox-folder.h" -#include "camel-mbox-store.h" -#include "string-utils.h" -#include "camel-stream-fs.h" -#include "camel-mbox-summary.h" -#include "camel-data-wrapper.h" -#include "camel-mime-message.h" -#include "camel-stream-filter.h" -#include "camel-mime-filter-from.h" -#include "camel-exception.h" - -#define d(x) - -static CamelFolderClass *parent_class = NULL; - -/* Returns the class for a CamelMboxFolder */ -#define CMBOXF_CLASS(so) CAMEL_MBOX_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so)) -#define CF_CLASS(so) CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so)) -#define CMBOXS_CLASS(so) CAMEL_STORE_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - - -static void mbox_sync(CamelFolder *folder, gboolean expunge, CamelException *ex); -static gint mbox_get_message_count(CamelFolder *folder); -static gint mbox_get_unread_message_count(CamelFolder *folder); -static void mbox_append_message(CamelFolder *folder, CamelMimeMessage * message, const CamelMessageInfo * info, - - CamelException *ex); -static GPtrArray *mbox_get_uids(CamelFolder *folder); -static GPtrArray *mbox_get_summary(CamelFolder *folder); -static CamelMimeMessage *mbox_get_message(CamelFolder *folder, const gchar * uid, CamelException *ex); - -static void mbox_expunge(CamelFolder *folder, CamelException *ex); - -static const CamelMessageInfo *mbox_get_message_info(CamelFolder *folder, const char *uid); - -static GPtrArray *mbox_search_by_expression(CamelFolder *folder, const char *expression, CamelException *ex); -static void mbox_search_free(CamelFolder *folder, GPtrArray * result); - -static guint32 mbox_get_message_flags(CamelFolder *folder, const char *uid); -static void mbox_set_message_flags(CamelFolder *folder, const char *uid, guint32 flags, guint32 set); -static gboolean mbox_get_message_user_flag(CamelFolder *folder, const char *uid, const char *name); -static void mbox_set_message_user_flag(CamelFolder *folder, const char *uid, const char *name, gboolean value); -static const char *mbox_get_message_user_tag(CamelFolder *folder, const char *uid, const char *name); -static void mbox_set_message_user_tag(CamelFolder *folder, const char *uid, const char *name, const char *value); - - -static void mbox_finalize(CamelObject * object); - -static void -camel_mbox_folder_class_init(CamelMboxFolderClass * camel_mbox_folder_class) -{ - CamelFolderClass *camel_folder_class = CAMEL_FOLDER_CLASS(camel_mbox_folder_class); - - parent_class = CAMEL_FOLDER_CLASS(camel_type_get_global_classfuncs(camel_folder_get_type())); - - /* virtual method definition */ - - /* virtual method overload */ - camel_folder_class->sync = mbox_sync; - camel_folder_class->get_message_count = mbox_get_message_count; - camel_folder_class->get_unread_message_count = mbox_get_unread_message_count; - camel_folder_class->append_message = mbox_append_message; - camel_folder_class->get_uids = mbox_get_uids; - camel_folder_class->free_uids = camel_folder_free_deep; - camel_folder_class->get_summary = mbox_get_summary; - camel_folder_class->free_summary = camel_folder_free_nop; - camel_folder_class->expunge = mbox_expunge; - - camel_folder_class->get_message = mbox_get_message; - - camel_folder_class->search_by_expression = mbox_search_by_expression; - camel_folder_class->search_free = mbox_search_free; - - camel_folder_class->get_message_info = mbox_get_message_info; - - camel_folder_class->get_message_flags = mbox_get_message_flags; - camel_folder_class->set_message_flags = mbox_set_message_flags; - camel_folder_class->get_message_user_flag = mbox_get_message_user_flag; - camel_folder_class->set_message_user_flag = mbox_set_message_user_flag; - camel_folder_class->get_message_user_tag = mbox_get_message_user_tag; - camel_folder_class->set_message_user_tag = mbox_set_message_user_tag; -} - -static void -mbox_init(gpointer object, gpointer klass) -{ - CamelFolder *folder = object; - CamelMboxFolder *mbox_folder = object; - - folder->has_summary_capability = TRUE; - folder->has_search_capability = TRUE; - - folder->permanent_flags = CAMEL_MESSAGE_ANSWERED | - CAMEL_MESSAGE_DELETED | CAMEL_MESSAGE_DRAFT | - CAMEL_MESSAGE_FLAGGED | CAMEL_MESSAGE_SEEN | CAMEL_MESSAGE_USER; - /* FIXME: we don't actually preserve user flags right now. */ - - mbox_folder->summary = NULL; - mbox_folder->search = NULL; -} - -static void -mbox_finalize(CamelObject * object) -{ - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(object); - - if (mbox_folder->index) - ibex_close(mbox_folder->index); - - g_free(mbox_folder->folder_file_path); - g_free(mbox_folder->summary_file_path); - g_free(mbox_folder->folder_dir_path); - g_free(mbox_folder->index_file_path); - - camel_folder_change_info_free(mbox_folder->changes); -} - -CamelType camel_mbox_folder_get_type(void) -{ - static CamelType camel_mbox_folder_type = CAMEL_INVALID_TYPE; - - if (camel_mbox_folder_type == CAMEL_INVALID_TYPE) { - camel_mbox_folder_type = camel_type_register(CAMEL_FOLDER_TYPE, "CamelMboxFolder", - sizeof(CamelMboxFolder), - sizeof(CamelMboxFolderClass), - (CamelObjectClassInitFunc) camel_mbox_folder_class_init, - NULL, - (CamelObjectInitFunc) mbox_init, - (CamelObjectFinalizeFunc) mbox_finalize); - } - - return camel_mbox_folder_type; -} - -CamelFolder * -camel_mbox_folder_new(CamelStore *parent_store, const char *full_name, guint32 flags, CamelException *ex) -{ - CamelFolder *folder; - CamelMboxFolder *mbox_folder; - const char *root_dir_path, *name; - struct stat st; - int forceindex; - - folder = CAMEL_FOLDER (camel_object_new (CAMEL_MBOX_FOLDER_TYPE)); - mbox_folder = (CamelMboxFolder *)folder; - - name = strrchr(full_name, '/'); - if (name) - name++; - else - name = full_name; - - camel_folder_construct(folder, parent_store, full_name, name); - - root_dir_path = camel_mbox_store_get_toplevel_dir(CAMEL_MBOX_STORE(folder->parent_store)); - - mbox_folder->folder_file_path = g_strdup_printf("%s/%s", root_dir_path, full_name); - mbox_folder->summary_file_path = g_strdup_printf("%s/%s-ev-summary", root_dir_path, full_name); - mbox_folder->folder_dir_path = g_strdup_printf("%s/%s.sdb", root_dir_path, full_name); - mbox_folder->index_file_path = g_strdup_printf("%s/%s.ibex", root_dir_path, full_name); - - mbox_folder->changes = camel_folder_change_info_new(); - - /* if we have no index file, force it */ - forceindex = stat(mbox_folder->index_file_path, &st) == -1; - if (flags & CAMEL_STORE_FOLDER_BODY_INDEX) { - - mbox_folder->index = ibex_open(mbox_folder->index_file_path, O_CREAT | O_RDWR, 0600); - if (mbox_folder->index == NULL) { - /* yes, this isn't fatal at all */ - g_warning("Could not open/create index file: %s: indexing not performed", strerror(errno)); - forceindex = FALSE; - } - } else { - /* if we do have an index file, remove it */ - if (forceindex == FALSE) { - unlink(mbox_folder->index_file_path); - } - forceindex = FALSE; - } - /* no summary (disk or memory), and we're proverbially screwed */ - mbox_folder->summary = camel_mbox_summary_new(mbox_folder->summary_file_path, - mbox_folder->folder_file_path, mbox_folder->index); - if (mbox_folder->summary == NULL || camel_mbox_summary_load(mbox_folder->summary, forceindex) == -1) { - camel_exception_set(ex, CAMEL_EXCEPTION_FOLDER_INVALID, /* FIXME: right error code */ - _("Could not create summary")); - camel_object_unref (CAMEL_OBJECT (folder)); - return NULL; - } - - return folder; -} - -static void -mbox_sync(CamelFolder *folder, gboolean expunge, CamelException *ex) -{ - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder); - - if (expunge) - mbox_expunge(folder, ex); - else { - camel_mbox_summary_sync(mbox_folder->summary, FALSE, mbox_folder->changes, ex); - camel_object_trigger_event(CAMEL_OBJECT(folder), "folder_changed", mbox_folder->changes); - camel_folder_change_info_clear(mbox_folder->changes); - } - - /* save index */ - if (mbox_folder->index) - ibex_save(mbox_folder->index); - if (mbox_folder->summary) - camel_folder_summary_save(CAMEL_FOLDER_SUMMARY(mbox_folder->summary)); -} - -static void -mbox_expunge(CamelFolder *folder, CamelException *ex) -{ - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder); - - camel_mbox_summary_sync(mbox_folder->summary, TRUE, mbox_folder->changes, ex); - camel_object_trigger_event(CAMEL_OBJECT(folder), "folder_changed", mbox_folder->changes); - camel_folder_change_info_clear(mbox_folder->changes); -} - -static gint -mbox_get_message_count(CamelFolder *folder) -{ - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder); - - g_return_val_if_fail(mbox_folder->summary != NULL, -1); - - return camel_folder_summary_count(CAMEL_FOLDER_SUMMARY(mbox_folder->summary)); -} - -static gint -mbox_get_unread_message_count(CamelFolder *folder) -{ - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder); - CamelMessageInfo *info; - GPtrArray *infolist; - gint i, max, count = 0; - - g_return_val_if_fail(mbox_folder->summary != NULL, -1); - - max = camel_folder_summary_count(CAMEL_FOLDER_SUMMARY(mbox_folder->summary)); - if (max == -1) - return -1; - - infolist = mbox_get_summary(folder); - - for (i = 0; i < infolist->len; i++) { - info = (CamelMessageInfo *) g_ptr_array_index(infolist, i); - if (!(info->flags & CAMEL_MESSAGE_SEEN)) - count++; - } - - return count; -} - -/* FIXME: this may need some tweaking for performance? */ -static void -mbox_append_message(CamelFolder *folder, CamelMimeMessage * message, const CamelMessageInfo * info, CamelException *ex) -{ - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder); - CamelStream *output_stream = NULL, *filter_stream = NULL; - CamelMimeFilter *filter_from = NULL; - CamelMessageInfo *newinfo; - struct stat st; - off_t seek = -1; - char *xev; - guint32 uid; - char *fromline = NULL; - - if (stat(mbox_folder->folder_file_path, &st) != 0) - goto fail; - - output_stream = camel_stream_fs_new_with_name(mbox_folder->folder_file_path, O_WRONLY|O_APPEND, 0600); - if (output_stream == NULL) - goto fail; - - seek = st.st_size; - - /* assign a new x-evolution header/uid */ - camel_medium_remove_header(CAMEL_MEDIUM(message), "X-Evolution"); - uid = camel_folder_summary_next_uid(CAMEL_FOLDER_SUMMARY(mbox_folder->summary)); - /* important that the header matches exactly 00000000-0000 */ - xev = g_strdup_printf("%08x-%04x", uid, info ? info->flags & 0xFFFF : 0); - camel_medium_add_header(CAMEL_MEDIUM(message), "X-Evolution", xev); - g_free(xev); - - /* we must write this to the non-filtered stream ... */ - fromline = camel_mbox_summary_build_from(CAMEL_MIME_PART(message)->headers); - if (camel_stream_printf(output_stream, seek==0?"%s":"\n%s", fromline) == -1) - goto fail; - - /* and write the content to the filtering stream, that translated '\nFrom' into '\n>From' */ - filter_stream = (CamelStream *) camel_stream_filter_new_with_stream(output_stream); - filter_from = (CamelMimeFilter *) camel_mime_filter_from_new(); - camel_stream_filter_add((CamelStreamFilter *) filter_stream, filter_from); - if (camel_data_wrapper_write_to_stream(CAMEL_DATA_WRAPPER(message), filter_stream) == -1) - goto fail; - - if (camel_stream_close(filter_stream) == -1) - goto fail; - - /* filter stream ref's the output stream itself, so we need to unref it too */ - camel_object_unref(CAMEL_OBJECT(filter_from)); - camel_object_unref(CAMEL_OBJECT(filter_stream)); - camel_object_unref(CAMEL_OBJECT(output_stream)); - g_free(fromline); - - /* force a summary update - will only update from the new position, if it can */ - if (camel_mbox_summary_update(mbox_folder->summary, seek==0?seek:seek+1, mbox_folder->changes) == 0) { - char uidstr[16]; - - sprintf(uidstr, "%u", uid); - newinfo = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mbox_folder->summary), uidstr); - - if (info && newinfo) { - CamelFlag *flag = info->user_flags; - CamelTag *tag = info->user_tags; - - while (flag) { - camel_flag_set(&(newinfo->user_flags), flag->name, TRUE); - flag = flag->next; - } - - while (tag) { - camel_tag_set(&(newinfo->user_tags), tag->name, tag->value); - tag = tag->next; - } - } - camel_object_trigger_event(CAMEL_OBJECT(folder), "folder_changed", mbox_folder->changes); - camel_folder_change_info_clear(mbox_folder->changes); - } - - return; - - fail: - if (camel_exception_is_set(ex)) { - camel_exception_setv(ex, camel_exception_get_id(ex), - _("Cannot append message to mbox file: %s"), camel_exception_get_description(ex)); - } else { - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Cannot append message to mbox file: %s"), g_strerror(errno)); - } - if (filter_stream) { - /*camel_stream_close (filter_stream); */ - camel_object_unref(CAMEL_OBJECT(filter_stream)); - } - if (output_stream) - camel_object_unref(CAMEL_OBJECT(output_stream)); - - if (filter_from) - camel_object_unref(CAMEL_OBJECT(filter_from)); - - g_free(fromline); - - /* make sure the file isn't munged by us */ - if (seek != -1) { - int fd = open(mbox_folder->folder_file_path, O_WRONLY, 0600); - - if (fd != -1) { - ftruncate(fd, st.st_size); - close(fd); - } - } -} - -static GPtrArray * -mbox_get_uids(CamelFolder *folder) -{ - GPtrArray *array; - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder); - int i, count; - - count = camel_folder_summary_count(CAMEL_FOLDER_SUMMARY(mbox_folder->summary)); - array = g_ptr_array_new(); - g_ptr_array_set_size(array, count); - for (i = 0; i < count; i++) { - CamelMboxMessageInfo *info = - (CamelMboxMessageInfo *) camel_folder_summary_index(CAMEL_FOLDER_SUMMARY(mbox_folder->summary), i); - - array->pdata[i] = g_strdup(info->info.uid); - } - - return array; -} - -static CamelMimeMessage * -mbox_get_message(CamelFolder *folder, const gchar * uid, CamelException *ex) -{ - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder); - CamelStream *message_stream = NULL; - CamelMimeMessage *message = NULL; - CamelMboxMessageInfo *info; - CamelMimeParser *parser = NULL; - char *buffer; - int len; - - /* get the message summary info */ - info = (CamelMboxMessageInfo *) camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mbox_folder->summary), uid); - - if (info == NULL) { - errno = ENOENT; - goto fail; - } - - /* if this has no content, its an error in the library */ - g_assert(info->info.content); - g_assert(info->frompos != -1); - - /* where we read from */ - message_stream = camel_stream_fs_new_with_name(mbox_folder->folder_file_path, O_RDONLY, 0); - if (message_stream == NULL) - goto fail; - - /* we use a parser to verify the message is correct, and in the correct position */ - parser = camel_mime_parser_new(); - camel_mime_parser_init_with_stream(parser, message_stream); - camel_object_unref(CAMEL_OBJECT(message_stream)); - camel_mime_parser_scan_from(parser, TRUE); - - camel_mime_parser_seek(parser, info->frompos, SEEK_SET); - if (camel_mime_parser_step(parser, &buffer, &len) != HSCAN_FROM) { - g_warning("File appears truncated"); - goto fail; - } - - if (camel_mime_parser_tell_start_from(parser) != info->frompos) { - /* TODO: This should probably perform a re-sync/etc, and try again? */ - g_warning("Summary doesn't match the folder contents! eek!\n" - " expecting offset %ld got %ld", (long int)info->frompos, - (long int)camel_mime_parser_tell_start_from(parser)); - errno = EINVAL; - goto fail; - } - - message = camel_mime_message_new(); - if (camel_mime_part_construct_from_parser(CAMEL_MIME_PART(message), parser) == -1) { - g_warning("Construction failed"); - goto fail; - } - camel_object_unref(CAMEL_OBJECT(parser)); - - return message; - - fail: - camel_exception_setv(ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID, _("Cannot get message: %s"), g_strerror(errno)); - - if (parser) - camel_object_unref(CAMEL_OBJECT(parser)); - if (message) - camel_object_unref(CAMEL_OBJECT(message)); - - return NULL; -} - -GPtrArray * -mbox_get_summary(CamelFolder *folder) -{ - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder); - - return CAMEL_FOLDER_SUMMARY(mbox_folder->summary)->messages; -} - -/* get a single message info, by uid */ -static const CamelMessageInfo * -mbox_get_message_info(CamelFolder *folder, const char *uid) -{ - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder); - - return camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mbox_folder->summary), uid); -} - -static GPtrArray * -mbox_search_by_expression(CamelFolder *folder, const char *expression, CamelException *ex) -{ - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder); - - if (mbox_folder->search == NULL) { - mbox_folder->search = camel_folder_search_new(); - } - - camel_folder_search_set_folder(mbox_folder->search, folder); - if (mbox_folder->summary) { - /* FIXME: dont access summary array directly? */ - camel_folder_search_set_summary(mbox_folder->search, - CAMEL_FOLDER_SUMMARY(mbox_folder->summary)->messages); - } - - camel_folder_search_set_body_index(mbox_folder->search, mbox_folder->index); - - return camel_folder_search_execute_expression(mbox_folder->search, expression, ex); -} - -static void -mbox_search_free(CamelFolder *folder, GPtrArray * result) -{ - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder); - - camel_folder_search_free_result(mbox_folder->search, result); -} - -static guint32 -mbox_get_message_flags(CamelFolder *folder, const char *uid) -{ - CamelMessageInfo *info; - CamelMboxFolder *mf = CAMEL_MBOX_FOLDER(folder); - - info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid); - g_return_val_if_fail(info != NULL, 0); - - return info->flags; -} - -static void -mbox_set_message_flags(CamelFolder *folder, const char *uid, guint32 flags, guint32 set) -{ - CamelMessageInfo *info; - CamelMboxFolder *mf = CAMEL_MBOX_FOLDER(folder); - - info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid); - g_return_if_fail(info != NULL); - - info->flags = (info->flags & ~flags) | (set & flags) | CAMEL_MESSAGE_FOLDER_FLAGGED; - camel_folder_summary_touch(CAMEL_FOLDER_SUMMARY(mf->summary)); - - camel_object_trigger_event(CAMEL_OBJECT(folder), "message_changed", (char *) uid); -} - -static gboolean -mbox_get_message_user_flag(CamelFolder *folder, const char *uid, const char *name) -{ - CamelMessageInfo *info; - CamelMboxFolder *mf = CAMEL_MBOX_FOLDER(folder); - - info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid); - g_return_val_if_fail(info != NULL, FALSE); - - return camel_flag_get(&info->user_flags, name); -} - -static void -mbox_set_message_user_flag(CamelFolder *folder, const char *uid, const char *name, gboolean value) -{ - CamelMessageInfo *info; - CamelMboxFolder *mf = CAMEL_MBOX_FOLDER(folder); - - info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid); - g_return_if_fail(info != NULL); - - camel_flag_set(&info->user_flags, name, value); - info->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED; - camel_folder_summary_touch(CAMEL_FOLDER_SUMMARY(mf->summary)); - camel_object_trigger_event(CAMEL_OBJECT(folder), "message_changed", (char *) uid); -} - -static const char *mbox_get_message_user_tag(CamelFolder *folder, const char *uid, const char *name) -{ - CamelMessageInfo *info; - CamelMboxFolder *mf = CAMEL_MBOX_FOLDER(folder); - - info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid); - g_return_val_if_fail(info != NULL, FALSE); - - return camel_tag_get(&info->user_tags, name); -} - -static void mbox_set_message_user_tag(CamelFolder *folder, const char *uid, const char *name, const char *value) -{ - CamelMessageInfo *info; - CamelMboxFolder *mf = CAMEL_MBOX_FOLDER(folder); - - info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid); - g_return_if_fail(info != NULL); - - camel_tag_set(&info->user_tags, name, value); - info->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED; - camel_folder_summary_touch(CAMEL_FOLDER_SUMMARY(mf->summary)); - camel_object_trigger_event(CAMEL_OBJECT(folder), "message_changed", (char *) uid); -} - - diff --git a/camel/providers/mbox/camel-mbox-folder.h b/camel/providers/mbox/camel-mbox-folder.h deleted file mode 100644 index 73f51a6d85..0000000000 --- a/camel/providers/mbox/camel-mbox-folder.h +++ /dev/null @@ -1,83 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mbox-folder.h : Abstract class for an email folder */ - -/* - * - * Author : Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright (C) 1999 Helix Code . - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_MBOX_FOLDER_H -#define CAMEL_MBOX_FOLDER_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <camel/camel-folder.h> -#include <camel/camel-folder-search.h> -#include <libibex/ibex.h> -#include "camel-mbox-summary.h" - -/* #include "camel-store.h" */ - -#define CAMEL_MBOX_FOLDER_TYPE (camel_mbox_folder_get_type ()) -#define CAMEL_MBOX_FOLDER(obj) (CAMEL_CHECK_CAST((obj), CAMEL_MBOX_FOLDER_TYPE, CamelMboxFolder)) -#define CAMEL_MBOX_FOLDER_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_MBOX_FOLDER_TYPE, CamelMboxFolderClass)) -#define IS_CAMEL_MBOX_FOLDER(o) (CAMEL_CHECK_TYPE((o), CAMEL_MBOX_FOLDER_TYPE)) - -typedef struct { - CamelFolder parent_object; - - gchar *folder_file_path; /* contains the messages */ - gchar *summary_file_path; /* contains the messages summary */ - gchar *folder_dir_path; /* contains the subfolders */ - gchar *index_file_path; /* index of body contents */ - - ibex *index; /* index for this folder */ - CamelMboxSummary *summary; - CamelFolderSearch *search; /* used to run searches, we just use the real thing (tm) */ - CamelFolderChangeInfo *changes; /* used to store changes to the folder during processing */ -} CamelMboxFolder; - - - -typedef struct { - CamelFolderClass parent_class; - - /* Virtual methods */ - -} CamelMboxFolderClass; - - -/* public methods */ -/* flags are taken from CAMEL_STORE_FOLDER_* flags */ -CamelFolder *camel_mbox_folder_new(CamelStore *parent_store, const char *full_name, guint32 flags, CamelException *ex); - -/* Standard Camel function */ -CamelType camel_mbox_folder_get_type(void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MBOX_FOLDER_H */ diff --git a/camel/providers/mbox/camel-mbox-provider.c b/camel/providers/mbox/camel-mbox-provider.c deleted file mode 100644 index bfce8b5ada..0000000000 --- a/camel/providers/mbox/camel-mbox-provider.c +++ /dev/null @@ -1,59 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mbox-provider.c: mbox provider registration code */ - -/* - * Authors : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright (C) 2000 HelixCode (www.helixcode.com). - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "config.h" -#include "camel-mbox-store.h" -#include "camel-provider.h" -#include "camel-session.h" -#include "camel-url.h" - -static CamelProvider mbox_provider = { - "mbox", - N_("UNIX mbox-format mail files"), - - N_("For reading mail delivered by the local system, and for " - "storing mail on local disk."), - - "mail", - - CAMEL_PROVIDER_IS_SOURCE | CAMEL_PROVIDER_IS_STORAGE, - - CAMEL_URL_NEED_PATH, - - { 0, 0 }, - - NULL -}; - -void -camel_provider_module_init (CamelSession *session) -{ - mbox_provider.object_types[CAMEL_PROVIDER_STORE] = - camel_mbox_store_get_type(); - - mbox_provider.service_cache = g_hash_table_new (camel_url_hash, camel_url_equal); - - camel_session_register_provider (session, &mbox_provider); -} diff --git a/camel/providers/mbox/camel-mbox-store.c b/camel/providers/mbox/camel-mbox-store.c deleted file mode 100644 index e3110ef3d3..0000000000 --- a/camel/providers/mbox/camel-mbox-store.c +++ /dev/null @@ -1,287 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mbox-store.c : class for an mbox store */ - -/* - * - * Copyright (C) 2000 Helix Code, Inc. <bertrand@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#include <config.h> - -#include <sys/stat.h> -#include <errno.h> -#include <string.h> -#include <unistd.h> - -#include "camel-mbox-store.h" -#include "camel-mbox-folder.h" -#include "camel-exception.h" -#include "camel-url.h" - -/* Returns the class for a CamelMboxStore */ -#define CMBOXS_CLASS(so) CAMEL_MBOX_STORE_CLASS (CAMEL_OBJECT_GET_CLASS(so)) -#define CF_CLASS(so) CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so)) -#define CMBOXF_CLASS(so) CAMEL_MBOX_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - -static char *get_name(CamelService *service, gboolean brief); -static CamelFolder *get_folder(CamelStore *store, const char *folder_name, guint32 flags, CamelException *ex); -static void delete_folder(CamelStore *store, const char *folder_name, CamelException *ex); -static void rename_folder(CamelStore *store, const char *old_name, const char *new_name, CamelException *ex); -static char *get_folder_name(CamelStore *store, const char *folder_name, CamelException *ex); -static CamelFolderInfo *get_folder_info (CamelStore *store, const char *top, - gboolean fast, gboolean recursive, - gboolean subscribed_only, - CamelException *ex); - -static void -camel_mbox_store_class_init (CamelMboxStoreClass *camel_mbox_store_class) -{ - CamelStoreClass *camel_store_class = CAMEL_STORE_CLASS (camel_mbox_store_class); - CamelServiceClass *camel_service_class = CAMEL_SERVICE_CLASS (camel_mbox_store_class); - - /* virtual method overload */ - camel_service_class->get_name = get_name; - - camel_store_class->get_folder = get_folder; - camel_store_class->delete_folder = delete_folder; - camel_store_class->rename_folder = rename_folder; - camel_store_class->get_folder_name = get_folder_name; - camel_store_class->get_folder_info = get_folder_info; - camel_store_class->free_folder_info = camel_store_free_folder_info_full; -} - -static void -camel_mbox_store_init (gpointer object, gpointer klass) -{ - CamelStore *store = CAMEL_STORE (object); - - /* mbox names are filenames, so they are case-sensitive. */ - store->folders = g_hash_table_new (g_str_hash, g_str_equal); -} - -CamelType -camel_mbox_store_get_type (void) -{ - static CamelType camel_mbox_store_type = CAMEL_INVALID_TYPE; - - if (camel_mbox_store_type == CAMEL_INVALID_TYPE) { - camel_mbox_store_type = camel_type_register (CAMEL_STORE_TYPE, "CamelMboxStore", - sizeof (CamelMboxStore), - sizeof (CamelMboxStoreClass), - (CamelObjectClassInitFunc) camel_mbox_store_class_init, - NULL, - (CamelObjectInitFunc) camel_mbox_store_init, - NULL); - } - - return camel_mbox_store_type; -} - -const gchar * -camel_mbox_store_get_toplevel_dir (CamelMboxStore *store) -{ - CamelURL *url = CAMEL_SERVICE (store)->url; - - g_assert (url != NULL); - return url->path; -} - -static CamelFolder * -get_folder(CamelStore *store, const char *folder_name, guint32 flags, CamelException *ex) -{ - char *name; - struct stat st; - - name = g_strdup_printf("%s%s", CAMEL_SERVICE(store)->url->path, folder_name); - - if (stat(name, &st) == -1) { - int fd; - - if (errno != ENOENT) { - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not open file `%s':\n%s"), - name, g_strerror(errno)); - g_free(name); - return NULL; - } - if ((flags & CAMEL_STORE_FOLDER_CREATE) == 0) { - camel_exception_setv(ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, - _("Folder `%s' does not exist."), - folder_name); - g_free(name); - return NULL; - } - - fd = open(name, O_WRONLY | O_CREAT | O_APPEND, 0600); - if (fd == -1) { - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not create file `%s':\n%s"), - name, g_strerror(errno)); - g_free(name); - return NULL; - } - g_free(name); - close(fd); - } else if (!S_ISREG(st.st_mode)) { - camel_exception_setv(ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, - _("`%s' is not a regular file."), - name); - g_free(name); - return NULL; - } else - g_free(name); - - return camel_mbox_folder_new(store, folder_name, flags, ex); -} - -static void -delete_folder (CamelStore *store, const char *folder_name, CamelException *ex) -{ - char *name, *name2; - struct stat st; - int status; - - name = g_strdup_printf ("%s%s", CAMEL_SERVICE (store)->url->path, folder_name); - if (stat (name, &st) == -1) { - if (errno == ENOENT) { - /* file doesn't exist - it's kinda like deleting it ;-) */ - g_free (name); - return; - } - - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not delete folder `%s':\n%s"), - folder_name, g_strerror (errno)); - g_free (name); - return; - } - - if (!S_ISREG (st.st_mode)) { - camel_exception_setv (ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, - _("`%s' is not a regular file."), name); - g_free (name); - return; - } - - if (st.st_size != 0) { - camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_NON_EMPTY, - _("Folder `%s' is not empty. Not deleted."), - folder_name); - g_free (name); - return; - } - - /* Delete index and summary first, then the main file. */ - name2 = g_strdup_printf ("%s.ibex", name); - status = unlink (name2); - g_free (name2); - if (status == 0 || errno == ENOENT) { - name2 = g_strdup_printf ("%s-ev-summary", name); - status = unlink (name2); - g_free (name2); - } - if (status == 0 || errno == ENOENT) - status = unlink (name); - g_free (name); - - if (status == -1 && errno != ENOENT) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not delete folder `%s':\n%s"), - folder_name, g_strerror (errno)); - } -} - -static int xrename(const char *oldp, const char *newp, const char *prefix, const char *suffix, CamelException *ex) -{ - struct stat st; - char *old = g_strconcat(prefix, oldp, suffix, 0); - char *new = g_strconcat(prefix, newp, suffix, 0); - int ret = -1; - - printf("renaming %s%s to %s%s\n", oldp, suffix, newp, suffix); - - /* FIXME: this has races ... */ - if (!(stat(new, &st) == -1 && errno==ENOENT)) { - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not rename folder %s to %s: destination exists"), - old, new); - } else if (rename(old, new) == 0 || errno==ENOENT) { - ret = 0; - } else if (stat(old, &st) == -1 && errno==ENOENT && stat(new, &st) == 0) { - /* for nfs, check if the rename worked anyway ... */ - ret = 0; - } - - g_free(old); - g_free(new); - return ret; -} - -static void rename_folder(CamelStore *store, const char *old, const char *new, CamelException *ex) -{ - char *path = CAMEL_SERVICE (store)->url->path; - - /* try to rollback failures, has obvious races */ - if (xrename(old, new, path, ".ibex", ex)) { - return; - } - if (xrename(old, new, path, "-ev-summary", ex)) { - xrename(new, old, path, ".ibex", ex); - return; - } - if (xrename(old, new, path, "", ex)) { - xrename(new, old, path, "-ev-summary", ex); - xrename(new, old, path, ".ibex", ex); - } -} - -static char * -get_folder_name (CamelStore *store, const char *folder_name, CamelException *ex) -{ - /* For now, we don't allow hieararchy. FIXME. */ - if (strchr (folder_name + 1, '/')) { - camel_exception_set (ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, - _("Mbox folders may not be nested.")); - return NULL; - } - - return *folder_name == '/' ? g_strdup (folder_name) : - g_strdup_printf ("/%s", folder_name); -} - -static char * -get_name (CamelService *service, gboolean brief) -{ - if (brief) - return g_strdup (service->url->path); - else - return g_strdup_printf (_("Local mail file %s"), service->url->path); -} - -static CamelFolderInfo * -get_folder_info (CamelStore *store, const char *top, - gboolean fast, gboolean recursive, - gboolean subscribed_only, - CamelException *ex) -{ - /* FIXME: This is broken, but it corresponds to what was - * there before. - */ - return NULL; -} diff --git a/camel/providers/mbox/camel-mbox-store.h b/camel/providers/mbox/camel-mbox-store.h deleted file mode 100644 index 7b298b67f6..0000000000 --- a/camel/providers/mbox/camel-mbox-store.h +++ /dev/null @@ -1,68 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mbox-store.h : class for an mbox store */ - -/* - * - * Copyright (C) 2000 Helix Code, Inc. <bertrand@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_MBOX_STORE_H -#define CAMEL_MBOX_STORE_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include "camel-store.h" - -#define CAMEL_MBOX_STORE_TYPE (camel_mbox_store_get_type ()) -#define CAMEL_MBOX_STORE(obj) (CAMEL_CHECK_CAST((obj), CAMEL_MBOX_STORE_TYPE, CamelMboxStore)) -#define CAMEL_MBOX_STORE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_MBOX_STORE_TYPE, CamelMboxStoreClass)) -#define IS_CAMEL_MBOX_STORE(o) (CAMEL_CHECK_TYPE((o), CAMEL_MBOX_STORE_TYPE)) - - -typedef struct { - CamelStore parent_object; - -} CamelMboxStore; - - - -typedef struct { - CamelStoreClass parent_class; - -} CamelMboxStoreClass; - - -/* public methods */ - -/* Standard Camel function */ -CamelType camel_mbox_store_get_type (void); - -const gchar *camel_mbox_store_get_toplevel_dir (CamelMboxStore *store); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MBOX_STORE_H */ - - diff --git a/camel/providers/mbox/camel-mbox-summary.c b/camel/providers/mbox/camel-mbox-summary.c deleted file mode 100644 index 8856d37ee8..0000000000 --- a/camel/providers/mbox/camel-mbox-summary.c +++ /dev/null @@ -1,894 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "camel-mbox-summary.h" -#include <camel/camel-mime-message.h> - -#include <sys/stat.h> -#include <sys/uio.h> -#include <unistd.h> -#include <errno.h> -#include <string.h> -#include <stdlib.h> - -#define io(x) -#define d(x) - -#define CAMEL_MBOX_SUMMARY_VERSION (0x1000) - -struct _CamelMboxSummaryPrivate { -}; - -#define _PRIVATE(o) (((CamelMboxSummary *)(o))->priv) - -static int summary_header_load (CamelFolderSummary *, FILE *); -static int summary_header_save (CamelFolderSummary *, FILE *); - -static CamelMessageInfo * message_info_new (CamelFolderSummary *, struct _header_raw *); -static CamelMessageInfo * message_info_new_from_parser (CamelFolderSummary *, CamelMimeParser *); -static CamelMessageInfo * message_info_load (CamelFolderSummary *, FILE *); -static int message_info_save (CamelFolderSummary *, FILE *, CamelMessageInfo *); -/*static void message_info_free (CamelFolderSummary *, CamelMessageInfo *);*/ - -static void camel_mbox_summary_class_init (CamelMboxSummaryClass *klass); -static void camel_mbox_summary_init (CamelMboxSummary *obj); -static void camel_mbox_summary_finalise (CamelObject *obj); - -static CamelFolderSummaryClass *camel_mbox_summary_parent; - -CamelType -camel_mbox_summary_get_type(void) -{ - static CamelType type = CAMEL_INVALID_TYPE; - - if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register(camel_folder_summary_get_type(), "CamelMboxSummary", - sizeof (CamelMboxSummary), - sizeof (CamelMboxSummaryClass), - (CamelObjectClassInitFunc) camel_mbox_summary_class_init, - NULL, - (CamelObjectInitFunc) camel_mbox_summary_init, - (CamelObjectFinalizeFunc) camel_mbox_summary_finalise); - } - - return type; -} - -static void -camel_mbox_summary_class_init(CamelMboxSummaryClass *klass) -{ - CamelFolderSummaryClass *sklass = (CamelFolderSummaryClass *) klass; - - camel_mbox_summary_parent = CAMEL_FOLDER_SUMMARY_CLASS(camel_type_get_global_classfuncs(camel_folder_summary_get_type())); - - sklass->summary_header_load = summary_header_load; - sklass->summary_header_save = summary_header_save; - - sklass->message_info_new = message_info_new; - sklass->message_info_new_from_parser = message_info_new_from_parser; - sklass->message_info_load = message_info_load; - sklass->message_info_save = message_info_save; - /*sklass->message_info_free = message_info_free;*/ -} - -static void -camel_mbox_summary_init(CamelMboxSummary *obj) -{ - struct _CamelMboxSummaryPrivate *p; - struct _CamelFolderSummary *s = (CamelFolderSummary *)obj; - - p = _PRIVATE(obj) = g_malloc0(sizeof(*p)); - - /* subclasses need to set the right instance data sizes */ - s->message_info_size = sizeof(CamelMboxMessageInfo); - s->content_info_size = sizeof(CamelMboxMessageContentInfo); - - /* and a unique file version */ - s->version += CAMEL_MBOX_SUMMARY_VERSION; -} - -static void -camel_mbox_summary_finalise(CamelObject *obj) -{ - CamelMboxSummary *mbs = CAMEL_MBOX_SUMMARY(obj); - - g_free(mbs->folder_path); -} - -/** - * camel_mbox_summary_new: - * - * Create a new CamelMboxSummary object. - * - * Return value: A new CamelMboxSummary widget. - **/ -CamelMboxSummary * -camel_mbox_summary_new(const char *filename, const char *mbox_name, ibex *index) -{ - CamelMboxSummary *new = CAMEL_MBOX_SUMMARY(camel_object_new(camel_mbox_summary_get_type())); - - if (new) { - /* ?? */ - camel_folder_summary_set_build_content(CAMEL_FOLDER_SUMMARY(new), TRUE); - camel_folder_summary_set_filename(CAMEL_FOLDER_SUMMARY(new), filename); - new->folder_path = g_strdup(mbox_name); - new->index = index; - } - return new; -} - -static int -summary_header_load(CamelFolderSummary *s, FILE *in) -{ - CamelMboxSummary *mbs = CAMEL_MBOX_SUMMARY(s); - - if (((CamelFolderSummaryClass *)camel_mbox_summary_parent)->summary_header_load(s, in) == -1) - return -1; - - return camel_folder_summary_decode_uint32(in, &mbs->folder_size); -} - -static int -summary_header_save(CamelFolderSummary *s, FILE *out) -{ - CamelMboxSummary *mbs = CAMEL_MBOX_SUMMARY(s); - - if (((CamelFolderSummaryClass *)camel_mbox_summary_parent)->summary_header_save(s, out) == -1) - return -1; - - return camel_folder_summary_encode_uint32(out, mbs->folder_size); -} - -static int -header_evolution_decode(const char *in, guint32 *uid, guint32 *flags) -{ - char *header; - - if (in && (header = header_token_decode(in))) { - if (strlen (header) == strlen ("00000000-0000") - && sscanf (header, "%08x-%04x", uid, flags) == 2) { - g_free(header); - return *uid; - } - g_free(header); - } - - return -1; -} - -static char * -header_evolution_encode(guint32 uid, guint32 flags) -{ - return g_strdup_printf("%08x-%04x", uid, flags & 0xffff); -} - -static CamelMessageInfo * -message_info_new(CamelFolderSummary *s, struct _header_raw *h) -{ - CamelMessageInfo *mi; - - mi = ((CamelFolderSummaryClass *)camel_mbox_summary_parent)->message_info_new(s, h); - if (mi) { - const char *xev; - guint32 uid, flags; - CamelMboxMessageInfo *mbi = (CamelMboxMessageInfo *)mi; - - xev = header_raw_find(&h, "X-Evolution", NULL); - if (xev && header_evolution_decode(xev, &uid, &flags) != -1) { - g_free(mi->uid); - mi->uid = g_strdup_printf("%u", uid); - if (camel_folder_summary_uid(s, mi->uid)) { - g_free(mi->uid); - mi->uid = camel_folder_summary_next_uid_string(s); - } else { - /* so we dont get clashes later on */ - camel_folder_summary_set_uid(s, uid+1); - } - mi->flags = flags; - } else { - /* to indicate it has no xev header? */ - mi->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED | CAMEL_MESSAGE_FOLDER_NOXEV; - mi->uid = g_strdup_printf("%u", camel_folder_summary_next_uid(s)); - } - mbi->frompos = -1; - } - - return mi; -} - -static CamelMessageInfo * -message_info_new_from_parser(CamelFolderSummary *s, CamelMimeParser *mp) -{ - CamelMessageInfo *mi; - CamelMboxSummary *mbs = CAMEL_MBOX_SUMMARY(s); - - mi = ((CamelFolderSummaryClass *)camel_mbox_summary_parent)->message_info_new_from_parser(s, mp); - if (mi) { - CamelMboxMessageInfo *mbi = (CamelMboxMessageInfo *)mi; - - mbi->frompos = camel_mime_parser_tell_start_from(mp); - - /* do we want to index this message as we add it, as well? */ - if (mbs->index - && (mbs->index_force - || (mi->flags & CAMEL_MESSAGE_FOLDER_FLAGGED) != 0 - || !ibex_contains_name(mbs->index, mi->uid))) { - camel_folder_summary_set_index(s, mbs->index); - } else { - camel_folder_summary_set_index(s, NULL); - } - } - - return mi; -} - -static CamelMessageInfo * -message_info_load(CamelFolderSummary *s, FILE *in) -{ - CamelMessageInfo *mi; - - io(printf("loading mbox message info\n")); - - mi = ((CamelFolderSummaryClass *)camel_mbox_summary_parent)->message_info_load(s, in); - if (mi) { - guint32 position; - CamelMboxMessageInfo *mbi = (CamelMboxMessageInfo *)mi; - - camel_folder_summary_decode_uint32(in, &position); - mbi->frompos = position; - } - - return mi; -} - -static int -message_info_save(CamelFolderSummary *s, FILE *out, CamelMessageInfo *mi) -{ - CamelMboxMessageInfo *mbi = (CamelMboxMessageInfo *)mi; - - io(printf("saving mbox message info\n")); - - ((CamelFolderSummaryClass *)camel_mbox_summary_parent)->message_info_save(s, out, mi); - - return camel_folder_summary_encode_uint32(out, mbi->frompos); -} - -static int -summary_rebuild(CamelMboxSummary *mbs, off_t offset) -{ - CamelFolderSummary *s = CAMEL_FOLDER_SUMMARY(mbs); - CamelMimeParser *mp; - int fd; - int ok = 0; - - fd = open(mbs->folder_path, O_RDONLY); - if (fd == -1) { - printf("%s failed to open: %s", mbs->folder_path, strerror(errno)); - return -1; - } - - mp = camel_mime_parser_new(); - camel_mime_parser_init_with_fd(mp, fd); - camel_mime_parser_scan_from(mp, TRUE); - camel_mime_parser_seek(mp, offset, SEEK_SET); - - if (offset > 0) { - if (camel_mime_parser_step(mp, NULL, NULL) == HSCAN_FROM) { - if (camel_mime_parser_tell_start_from(mp) != offset) { - g_warning ("The next message didn't start where I expected\nbuilding summary from start"); - camel_mime_parser_drop_step(mp); - offset = 0; - camel_mime_parser_seek(mp, offset, SEEK_SET); - camel_folder_summary_clear(CAMEL_FOLDER_SUMMARY(mbs)); - } else { - camel_mime_parser_unstep(mp); - } - } else { - camel_object_unref(CAMEL_OBJECT(mp)); - /* end of file - no content? */ - return -1; - } - } - - while (camel_mime_parser_step(mp, NULL, NULL) == HSCAN_FROM) { - CamelMessageInfo *info; - - info = camel_folder_summary_add_from_parser(CAMEL_FOLDER_SUMMARY(mbs), mp); - if (info == NULL) { - printf ("Could not build info from file?\n"); - ok = -1; - break; - } - - g_assert(camel_mime_parser_step(mp, NULL, NULL) == HSCAN_FROM_END); - } - - camel_object_unref(CAMEL_OBJECT (mp)); - - /* update the file size/mtime in the summary */ - if (ok != -1) { - struct stat st; - - if (stat(mbs->folder_path, &st) == 0) { - mbs->folder_size = st.st_size; - s->time = st.st_mtime; - } - } - - return ok; -} - -int -camel_mbox_summary_update(CamelMboxSummary *mbs, off_t offset, CamelFolderChangeInfo *changeinfo) -{ - int ret, i, count; - CamelFolderSummary *s = (CamelFolderSummary *)mbs; - - /* we use the diff function of the change_info to build the update list. */ - for (i = 0; i < camel_folder_summary_count(s); i++) { - CamelMessageInfo *mi = camel_folder_summary_index(s, i); - - camel_folder_change_info_add_source(changeinfo, mi->uid); - } - - /* do the actual work */ - mbs->index_force = FALSE; - ret = summary_rebuild(mbs, offset); - - count = camel_folder_summary_count(s); - for (i = 0; i < count; i++) { - CamelMessageInfo *mi = camel_folder_summary_index(s, i); - camel_folder_change_info_add_update(changeinfo, mi->uid); - } - camel_folder_change_info_build_diff(changeinfo); - -#if 0 -#warning "Saving full summary and index after every summarisation is slow ..." - if (ret != -1) { - if (camel_folder_summary_save((CamelFolderSummary *)mbs) == -1) - g_warning("Could not save summary: %s", strerror(errno)); - if (mbs->index) - ibex_save(mbs->index); - } -#endif - return ret; -} - -int -camel_mbox_summary_load(CamelMboxSummary *mbs, int forceindex) -{ - CamelFolderSummary *s = CAMEL_FOLDER_SUMMARY(mbs); - struct stat st; - int ret = 0; - off_t minstart; - - mbs->index_force = forceindex; - - /* is the summary out of date? */ - if (stat(mbs->folder_path, &st) == -1) { - camel_folder_summary_clear(s); - printf("Cannot summarise folder: '%s': %s\n", mbs->folder_path, strerror(errno)); - return -1; - } - - if (forceindex || camel_folder_summary_load(s) == -1) { - camel_folder_summary_clear(s); - ret = summary_rebuild(mbs, 0); - } else { - minstart = st.st_size; -#if 0 - /* find out the first unindexed message ... */ - /* TODO: For this to work, it has to check that the message is - indexable, and contains content ... maybe it cannot be done - properly? */ - for (i = 0; i < camel_folder_summary_count(s); i++) { - CamelMessageInfo *mi = camel_folder_summary_index(s, i); - - if (mbs->index && !ibex_contains_name(mbs->index, mi->uid)) { - minstart = ((CamelMboxMessageInfo *) mi)->frompos; - printf("Found unindexed message: %s\n", mi->uid); - break; - } - } -#endif - /* is the summary uptodate? */ - if (st.st_size == mbs->folder_size && st.st_mtime == s->time) { - if (minstart < st.st_size) { - /* FIXME: Only clear the messages and reindex from this point forward */ - camel_folder_summary_clear(s); - ret = summary_rebuild(mbs, 0); - } - } else { - if (mbs->folder_size < st.st_size) { - if (minstart < mbs->folder_size) { - /* FIXME: only make it rebuild as necessary */ - camel_folder_summary_clear(s); - ret = summary_rebuild(mbs, 0); - } else { - ret = summary_rebuild(mbs, mbs->folder_size); - /* If that fails, it might be because a message was changed - * rather than appended... so try again from the beginning. - */ - if (ret == -1) { - camel_folder_summary_clear(s); - ret = summary_rebuild(mbs, 0); - } - } - } else { - camel_folder_summary_clear(s); - ret = summary_rebuild(mbs, 0); - } - } - } - - if (ret != -1) { - mbs->folder_size = st.st_size; - s->time = st.st_mtime; - if (camel_folder_summary_save(s) == -1) - g_warning("Could not save summary: %s", strerror(errno)); - if (mbs->index) - ibex_save(mbs->index); - } - - return ret; -} - -static int -header_write(int fd, struct _header_raw *header, char *xevline) -{ - struct iovec iv[4]; - int outlen = 0, len; - - iv[1].iov_base = ":"; - iv[1].iov_len = 1; - iv[3].iov_base = "\n"; - iv[3].iov_len = 1; - - while (header) { - if (strcasecmp(header->name, "X-Evolution")) { - iv[0].iov_base = header->name; - iv[0].iov_len = strlen(header->name); - iv[2].iov_base = header->value; - iv[2].iov_len = strlen(header->value); - - do { - len = writev(fd, iv, 4); - } while (len == -1 && errno == EINTR); - - if (len == -1) - return -1; - outlen += len; - } - header = header->next; - } - - iv[0].iov_base = "X-Evolution: "; - iv[0].iov_len = strlen(iv[0].iov_base); - iv[1].iov_base = xevline; - iv[1].iov_len = strlen(xevline); - iv[2].iov_base = "\n\n"; - iv[2].iov_len = 2; - - do { - len = writev(fd, iv, 3); - } while (len == -1 && errno == EINTR); - - if (len == -1) - return -1; - - outlen += 1; - - d(printf("Wrote %d bytes of headers\n", outlen)); - - return outlen; -} - -static int -copy_block(int fromfd, int tofd, off_t start, size_t bytes) -{ - char buffer[4096]; - int written = 0; - - d(printf("writing %d bytes ... ", bytes)); - - if (lseek(fromfd, start, SEEK_SET) != start) - return -1; - - while (bytes > 0) { - int toread, towrite; - - toread = bytes; - if (bytes > 4096) - toread = 4096; - else - toread = bytes; - do { - towrite = read(fromfd, buffer, toread); - } while (towrite == -1 && errno == EINTR); - - if (towrite == -1) - return -1; - - /* check for 'end of file' */ - if (towrite == 0) { - d(printf("end of file?\n")); - break; - } - - do { - toread = write(tofd, buffer, towrite); - } while (toread == -1 && errno == EINTR); - - if (toread == -1) - return -1; - - written += toread; - bytes -= toread; - } - - d(printf("written %d bytes\n", written)); - - return written; -} - -static char *tz_months[] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" -}; - -static char *tz_days[] = { - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" -}; - -/* tries to build a From line, based on message headers */ -char * -camel_mbox_summary_build_from(struct _header_raw *header) -{ - GString *out = g_string_new("From "); - char *ret; - const char *tmp; - time_t thetime; - int offset; - struct tm tm; - - tmp = header_raw_find(&header, "Sender", NULL); - if (tmp == NULL) - tmp = header_raw_find(&header, "From", NULL); - if (tmp != NULL) { - struct _header_address *addr = header_address_decode(tmp); - - tmp = NULL; - if (addr) { - if (addr->type == HEADER_ADDRESS_NAME) { - g_string_append(out, addr->v.addr); - tmp = ""; - } - header_address_unref(addr); - } - } - if (tmp == NULL) { - g_string_append(out, "unknown@nodomain.now.au"); - } - - /* try use the received header to get the date */ - tmp = header_raw_find(&header, "Received", NULL); - if (tmp) { - tmp = strrchr(tmp, ';'); - if (tmp) - tmp++; - } - - /* if there isn't one, try the Date field */ - if (tmp == NULL) - tmp = header_raw_find(&header, "Date", NULL); - - thetime = header_decode_date(tmp, &offset); - - thetime += ((offset / 100) * (60 * 60)) + (offset % 100) * 60; - - /* a pseudo, but still bogus attempt at thread safing the function */ - /*memcpy(&tm, gmtime(&thetime), sizeof(tm));*/ - gmtime_r(&thetime, &tm); - - g_string_sprintfa(out, " %s %s %d %02d:%02d:%02d %4d\n", - tz_days[tm.tm_wday], - tz_months[tm.tm_mon], tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_year + 1900); - - ret = out->str; - g_string_free(out, FALSE); - return ret; -} - -int -camel_mbox_summary_sync(CamelMboxSummary *mbs, gboolean expunge, CamelFolderChangeInfo *changeinfo, CamelException *ex) -{ - CamelMimeParser *mp = NULL; - int i, count; - CamelMboxMessageInfo *info; - CamelFolderSummary *s = CAMEL_FOLDER_SUMMARY(mbs); - int fd = -1, fdout = -1; - off_t offset = 0; - char *tmpname = NULL; - char *buffer, *xevnew = NULL; - const char *xev; - int len; - guint32 uid, flags; - int quick = TRUE, work = FALSE; - struct stat st; - char *fromline; - - /* make sure we're in sync, after this point we at least have a complete list of id's */ - count = camel_folder_summary_count (s); - if (count > 0) { - CamelMessageInfo *mi = camel_folder_summary_index(s, count - 1); - camel_mbox_summary_update(mbs, mi->content->endpos, changeinfo); - } else { - camel_mbox_summary_update(mbs, 0, changeinfo); - } - - /* check if we have any work to do */ - d(printf("Performing sync, %d messages in inbox\n", count)); - for (i = 0; quick && i < count; i++) { - info = (CamelMboxMessageInfo *)camel_folder_summary_index(s, i); - if ((expunge && (info->info.flags & CAMEL_MESSAGE_DELETED)) || - (info->info.flags & CAMEL_MESSAGE_FOLDER_NOXEV)) - quick = FALSE; - else - work |= (info->info.flags & CAMEL_MESSAGE_FOLDER_FLAGGED) != 0; - } - - d(printf("Options: %s %s %s\n", expunge ? "expunge" : "", quick ? "quick" : "", work ? "Work" : "")); - - if (quick && !work) - return 0; - - fd = open(mbs->folder_path, O_RDWR); - if (fd == -1) { - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not open summary %s"), mbs->folder_path); - return -1; - } - - mp = camel_mime_parser_new(); - camel_mime_parser_scan_from(mp, TRUE); - camel_mime_parser_init_with_fd(mp, fd); - - if (!quick) { - tmpname = alloca(strlen (mbs->folder_path) + 5); - sprintf(tmpname, "%s.tmp", mbs->folder_path); - d(printf("Writing tmp file to %s\n", tmpname)); - retry_out: - fdout = open(tmpname, O_WRONLY|O_CREAT|O_EXCL, 0600); - if (fdout == -1) { - if (errno == EEXIST) - if (unlink(tmpname) != -1) - goto retry_out; - - tmpname = NULL; - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Cannot open temporary mailbox: %s"), strerror(errno)); - goto error; - } - } - - for (i = 0; i < count; i++) { - off_t frompos, bodypos, lastpos; - /* This has to be an int, not an off_t, because that's - * what camel_mime_parser_header returns... FIXME. - */ - int xevoffset; - - info = (CamelMboxMessageInfo *)camel_folder_summary_index(s, i); - - g_assert(info); - - d(printf("Looking at message %s\n", info->info.uid)); - - if (expunge && info->info.flags & CAMEL_MESSAGE_DELETED) { - d(printf("Deleting %s\n", info->info.uid)); - - g_assert(!quick); - offset -= (info->info.content->endpos - info->frompos); - if (mbs->index) - ibex_unindex(mbs->index, info->info.uid); - /* remove it from teh change list */ - camel_folder_change_info_remove_uid(changeinfo, info->info.uid); - camel_folder_summary_remove(s, (CamelMessageInfo *)info); - count--; - i--; - info = NULL; - } else if (info->info.flags & (CAMEL_MESSAGE_FOLDER_NOXEV | CAMEL_MESSAGE_FOLDER_FLAGGED)) { - int xevok = FALSE; - - d(printf("Updating header for %s flags = %08x\n", info->info.uid, info->info.flags)); - - /* find the next message, header parts */ - camel_mime_parser_seek(mp, info->frompos, SEEK_SET); - if (camel_mime_parser_step(mp, &buffer, &len) != HSCAN_FROM) { - g_warning("camel_mime_parser_step failed (1)"); - goto error; - } - - if (camel_mime_parser_tell_start_from (mp) != info->frompos) { - g_warning("Summary/mbox mismatch, aborting sync"); - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Summary mismatch, aborting sync")); - goto error; - } - - if (camel_mime_parser_step (mp, &buffer, &len) == HSCAN_FROM_END) { - g_warning("camel_mime_parser_step failed (2)"); - goto error; - } - - /* Check if the X-Evolution header is valid. */ - - xev = camel_mime_parser_header(mp, "X-Evolution", &xevoffset); - if (xev && header_evolution_decode (xev, &uid, &flags) != -1) - xevok = TRUE; - - xevnew = header_evolution_encode(strtoul (info->info.uid, NULL, 10), info->info.flags & 0xffff); - if (quick) { - if (!xevok) { - g_warning("The summary told me I had an X-Evolution header, but i dont!"); - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Summary mismatch, X-Evolution header missing")); - goto error; - } - buffer = g_strdup_printf("X-Evolution: %s", xevnew); - lastpos = lseek(fd, 0, SEEK_CUR); - lseek(fd, xevoffset, SEEK_SET); - do { - len = write(fd, buffer, strlen (buffer)); - } while (len == -1 && errno == EINTR); - lseek(fd, lastpos, SEEK_SET); - g_free(buffer); - if (len == -1) { - goto error; - } - } else { - frompos = lseek(fdout, 0, SEEK_CUR); - fromline = camel_mbox_summary_build_from(camel_mime_parser_headers_raw (mp)); - write(fdout, fromline, strlen(fromline)); - g_free(fromline); - if (header_write(fdout, camel_mime_parser_headers_raw(mp), xevnew) == -1) { - d(printf("Error writing to tmp mailbox\n")); - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Error writing to temp mailbox: %s"), - strerror(errno)); - goto error; - } - bodypos = lseek(fdout, 0, SEEK_CUR); - d(printf("pos = %d, endpos = %d, bodypos = %d\n", - (int) info->info.content->pos, - (int) info->info.content->endpos, - (int) info->info.content->bodypos)); - if (copy_block(fd, fdout, info->info.content->bodypos, - info->info.content->endpos - info->info.content->bodypos) == -1) { - g_warning("Cannot copy data to output fd"); - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Cannot copy data to output file: %s"), - strerror (errno)); - goto error; - } - info->frompos = frompos; - offset = bodypos - info->info.content->bodypos; - } - info->info.flags &= 0xffff; - g_free(xevnew); - xevnew = NULL; - camel_mime_parser_drop_step(mp); - camel_mime_parser_drop_step(mp); - } else { - if (!quick) { - if (copy_block(fd, fdout, info->frompos, - info->info.content->endpos - info->frompos) == -1) { - g_warning("Cannot copy data to output fd"); - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Cannot copy data to output file: %s"), - strerror(errno)); - goto error; - } - /* update from pos here? */ - info->frompos += offset; - } else { - d(printf("Nothing to do for this message\n")); - } - } - if (!quick && info != NULL && offset != 0) { - d(printf("offsetting content: %d\n", (int)offset)); - camel_folder_summary_offset_content(info->info.content, offset); - d(printf("pos = %d, endpos = %d, bodypos = %d\n", - (int) info->info.content->pos, - (int) info->info.content->endpos, - (int) info->info.content->bodypos)); - } - } - - d(printf("Closing folders\n")); - - if (close(fd) == -1) { - g_warning("Cannot close source folder: %s", strerror(errno)); - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not close source folder %s: %s"), - mbs->folder_path, strerror(errno)); - goto error; - } - - if (!quick) { - if (close(fdout) == -1) { - g_warning("Cannot close tmp folder: %s", strerror(errno)); - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not close temp folder: %s"), - strerror(errno)); - goto error; - } - - if (rename(tmpname, mbs->folder_path) == -1) { - g_warning("Cannot rename folder: %s", strerror(errno)); - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not rename folder: %s"), - strerror(errno)); - goto error; - } - tmpname = NULL; - - if (mbs->index) - ibex_save(mbs->index); - } - - if (stat(mbs->folder_path, &st) == -1) { - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Unknown error: %s"), - strerror(errno)); - goto error; - } - - camel_folder_summary_touch(s); - s->time = st.st_mtime; - mbs->folder_size = st.st_size; - camel_folder_summary_save(s); - - camel_object_unref(CAMEL_OBJECT(mp)); - - return 0; - error: - if (fd != -1) - close(fd); - - if (fdout != -1) - close(fdout); - - g_free(xevnew); - - if (tmpname) - unlink(tmpname); - if (mp) - camel_object_unref(CAMEL_OBJECT(mp)); - - return -1; -} - - - - - diff --git a/camel/providers/mbox/camel-mbox-summary.h b/camel/providers/mbox/camel-mbox-summary.h deleted file mode 100644 index f90acc4f35..0000000000 --- a/camel/providers/mbox/camel-mbox-summary.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef _CAMEL_MBOX_SUMMARY_H -#define _CAMEL_MBOX_SUMMARY_H - -#include <camel/camel-folder-summary.h> -#include <camel/camel-folder.h> -#include <camel/camel-exception.h> -#include <libibex/ibex.h> - -#define CAMEL_MBOX_SUMMARY(obj) CAMEL_CHECK_CAST (obj, camel_mbox_summary_get_type (), CamelMboxSummary) -#define CAMEL_MBOX_SUMMARY_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_mbox_summary_get_type (), CamelMboxSummaryClass) -#define IS_CAMEL_MBOX_SUMMARY(obj) CAMEL_CHECK_TYPE (obj, camel_mbox_summary_get_type ()) - -typedef struct _CamelMboxSummary CamelMboxSummary; -typedef struct _CamelMboxSummaryClass CamelMboxSummaryClass; - -/* extra summary flags */ -enum { - CAMEL_MESSAGE_FOLDER_NOXEV = 1<<17, -}; - -typedef struct _CamelMboxMessageContentInfo { - CamelMessageContentInfo info; -} CamelMboxMessageContentInfo; - -typedef struct _CamelMboxMessageInfo { - CamelMessageInfo info; - - off_t frompos; -} CamelMboxMessageInfo; - -struct _CamelMboxSummary { - CamelFolderSummary parent; - - struct _CamelMboxSummaryPrivate *priv; - - char *folder_path; /* name of matching folder */ - size_t folder_size; /* size of the mbox file, last sync */ - - ibex *index; - int index_force; /* do we force index during creation? */ -}; - -struct _CamelMboxSummaryClass { - CamelFolderSummaryClass parent_class; -}; - -guint camel_mbox_summary_get_type (void); -CamelMboxSummary *camel_mbox_summary_new (const char *filename, const char *mbox_name, ibex *index); - -/* load/check the summary */ -int camel_mbox_summary_load(CamelMboxSummary *mbs, int forceindex); -/* incremental update */ -int camel_mbox_summary_update(CamelMboxSummary *mbs, off_t offset, CamelFolderChangeInfo *changeinfo); -/* perform a folder sync or expunge, if needed */ -int camel_mbox_summary_sync (CamelMboxSummary *mbs, gboolean expunge, CamelFolderChangeInfo *changeinfo, CamelException *ex); -/* generate a From line from headers */ -char *camel_mbox_summary_build_from(struct _header_raw *header); - -#endif /* ! _CAMEL_MBOX_SUMMARY_H */ - diff --git a/camel/providers/mbox/libcamelmbox.urls b/camel/providers/mbox/libcamelmbox.urls deleted file mode 100644 index e021190356..0000000000 --- a/camel/providers/mbox/libcamelmbox.urls +++ /dev/null @@ -1 +0,0 @@ -mbox diff --git a/camel/providers/mh/.cvsignore b/camel/providers/mh/.cvsignore deleted file mode 100644 index fd6b811c68..0000000000 --- a/camel/providers/mh/.cvsignore +++ /dev/null @@ -1,7 +0,0 @@ -.deps -Makefile -Makefile.in -.libs -.deps -*.lo -*.la diff --git a/camel/providers/mh/Makefile.am b/camel/providers/mh/Makefile.am deleted file mode 100644 index 62f447171b..0000000000 --- a/camel/providers/mh/Makefile.am +++ /dev/null @@ -1,39 +0,0 @@ -## Process this file with automake to produce Makefile.in - -libcamelmhincludedir = $(includedir)/camel - - -providerdir = $(pkglibdir)/camel-providers/$(VERSION) - -provider_LTLIBRARIES = libcamelmh.la -provider_DATA = libcamelmh.urls - -INCLUDES = -I.. \ - -I$(srcdir)/.. \ - -I$(top_srcdir)/camel \ - -I$(top_srcdir)/intl \ - -I$(top_srcdir)/libibex \ - -I$(top_srcdir)/e-util \ - -I$(top_srcdir) \ - -I$(includedir) \ - $(GTK_INCLUDEDIR) \ - -DG_LOG_DOMAIN=\"camel-mh-provider\" - -libcamelmh_la_SOURCES = \ - camel-mh-folder.c \ - camel-mh-provider.c \ - camel-mh-store.c \ - camel-mh-summary.c - -libcamelmhinclude_HEADERS = \ - camel-mh-folder.h \ - camel-mh-store.h \ - camel-mh-summary.h - -libcamelmh_la_LDFLAGS = -version-info 0:0:0 - -libcamelmh_la_LIBADD = $(top_builddir)/e-util/libeutil.la $(top_builddir)/libibex/libibex.la $(UNICODE_LIBS) -#libcamelmh_la_LIBADD = $(top_builddir)/libibex/libibex.la $(UNICODE_LIBS) - -EXTRA_DIST = libcamelmh.urls - diff --git a/camel/providers/mh/camel-mh-folder.c b/camel/providers/mh/camel-mh-folder.c deleted file mode 100644 index a56de4a9c1..0000000000 --- a/camel/providers/mh/camel-mh-folder.c +++ /dev/null @@ -1,534 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */ -/* camel-mh-folder.c : Abstract class for an email folder */ - -/* - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * Copyright (C) 1999, 2000 Helix Code Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> - -#include <stdlib.h> -#include <sys/types.h> -#include <dirent.h> -#include <sys/stat.h> -#include <unistd.h> -#include <errno.h> -#include <string.h> -#include <fcntl.h> - -#include "camel-mh-folder.h" -#include "camel-mh-store.h" -#include "string-utils.h" -#include "camel-stream-fs.h" -#include "camel-mh-summary.h" -#include "camel-data-wrapper.h" -#include "camel-mime-message.h" -#include "camel-stream-filter.h" -#include "camel-mime-filter-from.h" -#include "camel-exception.h" - -#define d(x) - -static CamelFolderClass *parent_class = NULL; - -/* Returns the class for a CamelMhFolder */ -#define CMHF_CLASS(so) CAMEL_MH_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so)) -#define CF_CLASS(so) CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so)) -#define CMHS_CLASS(so) CAMEL_STORE_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - -static void mh_sync(CamelFolder * folder, gboolean expunge, CamelException * ex); -static gint mh_get_message_count(CamelFolder * folder); -static gint mh_get_unread_message_count(CamelFolder * folder); -static void mh_append_message(CamelFolder * folder, CamelMimeMessage * message, const CamelMessageInfo *info, CamelException * ex); -static GPtrArray *mh_get_uids(CamelFolder * folder); -static GPtrArray *mh_get_summary(CamelFolder * folder); -static CamelMimeMessage *mh_get_message(CamelFolder * folder, const gchar * uid, CamelException * ex); - -static void mh_expunge(CamelFolder * folder, CamelException * ex); - -static const CamelMessageInfo *mh_get_message_info(CamelFolder * folder, const char *uid); - -static GPtrArray *mh_search_by_expression(CamelFolder * folder, const char *expression, CamelException * ex); -static void mh_search_free(CamelFolder *folder, GPtrArray *result); - -static guint32 mh_get_message_flags(CamelFolder * folder, const char *uid); -static void mh_set_message_flags(CamelFolder * folder, const char *uid, guint32 flags, guint32 set); -static gboolean mh_get_message_user_flag(CamelFolder * folder, const char *uid, const char *name); -static void mh_set_message_user_flag(CamelFolder * folder, const char *uid, const char *name, gboolean value); -static const char *mh_get_message_user_tag(CamelFolder *folder, const char *uid, const char *name); -static void mh_set_message_user_tag(CamelFolder *folder, const char *uid, const char *name, const char *value); - -static void mh_finalize(CamelObject * object); - -static void camel_mh_folder_class_init(CamelObjectClass * camel_mh_folder_class) -{ - CamelFolderClass *camel_folder_class = CAMEL_FOLDER_CLASS(camel_mh_folder_class); - - parent_class = CAMEL_FOLDER_CLASS (camel_type_get_global_classfuncs(camel_folder_get_type())); - - /* virtual method definition */ - - /* virtual method overload */ - camel_folder_class->sync = mh_sync; - camel_folder_class->get_message_count = mh_get_message_count; - camel_folder_class->get_unread_message_count = mh_get_unread_message_count; - camel_folder_class->append_message = mh_append_message; - camel_folder_class->get_uids = mh_get_uids; - camel_folder_class->free_uids = camel_folder_free_deep; - camel_folder_class->get_summary = mh_get_summary; - camel_folder_class->free_summary = camel_folder_free_nop; - camel_folder_class->expunge = mh_expunge; - - camel_folder_class->get_message = mh_get_message; - - camel_folder_class->search_by_expression = mh_search_by_expression; - camel_folder_class->search_free = mh_search_free; - - camel_folder_class->get_message_info = mh_get_message_info; - - camel_folder_class->get_message_flags = mh_get_message_flags; - camel_folder_class->set_message_flags = mh_set_message_flags; - camel_folder_class->get_message_user_flag = mh_get_message_user_flag; - camel_folder_class->set_message_user_flag = mh_set_message_user_flag; - camel_folder_class->get_message_user_tag = mh_get_message_user_tag; - camel_folder_class->set_message_user_tag = mh_set_message_user_tag; -} - -static void mh_init(gpointer object, gpointer klass) -{ - CamelFolder *folder = object; - CamelMhFolder *mh_folder = object; - - folder->has_summary_capability = TRUE; - folder->has_search_capability = TRUE; - - folder->permanent_flags = CAMEL_MESSAGE_ANSWERED | - CAMEL_MESSAGE_DELETED | CAMEL_MESSAGE_DRAFT | - CAMEL_MESSAGE_FLAGGED | CAMEL_MESSAGE_SEEN | CAMEL_MESSAGE_USER; - - mh_folder->summary = NULL; - mh_folder->search = NULL; - mh_folder->changes = camel_folder_change_info_new(); -} - -static void mh_finalize(CamelObject * object) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(object); - - if (mh_folder->index) - ibex_close(mh_folder->index); - - g_free(mh_folder->folder_file_path); - g_free(mh_folder->summary_file_path); - g_free(mh_folder->folder_dir_path); - g_free(mh_folder->index_file_path); - camel_folder_change_info_free(mh_folder->changes); -} - -CamelType camel_mh_folder_get_type(void) -{ - static CamelType camel_mh_folder_type = CAMEL_INVALID_TYPE; - - if (camel_mh_folder_type == CAMEL_INVALID_TYPE) { - camel_mh_folder_type = camel_type_register(CAMEL_FOLDER_TYPE, "CamelMhFolder", - sizeof(CamelMhFolder), - sizeof(CamelMhFolderClass), - (CamelObjectClassInitFunc) camel_mh_folder_class_init, - NULL, - (CamelObjectInitFunc) mh_init, - (CamelObjectFinalizeFunc) mh_finalize); - } - - return camel_mh_folder_type; -} - -CamelFolder * -camel_mh_folder_new(CamelStore *parent_store, const char *full_name, guint32 flags, CamelException *ex) -{ - CamelFolder *folder; - CamelMhFolder *mh_folder; - const char *root_dir_path, *name; - int forceindex; - struct stat st; - - folder = CAMEL_FOLDER (camel_object_new(CAMEL_MH_FOLDER_TYPE)); - mh_folder = (CamelMhFolder *)folder; - - name = strrchr(full_name, '/'); - if (name) - name++; - else - name = full_name; - camel_folder_construct (folder, parent_store, full_name, name); - - root_dir_path = camel_mh_store_get_toplevel_dir(CAMEL_MH_STORE(folder->parent_store)); - - mh_folder->folder_file_path = g_strdup_printf("%s/%s", root_dir_path, full_name); - mh_folder->summary_file_path = g_strdup_printf("%s/%s/ev-summary", root_dir_path, full_name); - mh_folder->folder_dir_path = g_strdup_printf("%s/%s", root_dir_path, full_name); - mh_folder->index_file_path = g_strdup_printf("%s/%s/ev-index.ibex", root_dir_path, full_name); - - /* if we have no index file, force it */ - forceindex = stat(mh_folder->index_file_path, &st) == -1; - /* check if we need to setup an index */ - if (flags & CAMEL_STORE_FOLDER_BODY_INDEX) { - mh_folder->index = ibex_open(mh_folder->index_file_path, O_CREAT | O_RDWR, 0600); - if (mh_folder->index == NULL) { - /* yes, this isn't fatal at all */ - g_warning("Could not open/create index file: %s: indexing not performed", strerror(errno)); - forceindex = FALSE; - } - } else { - /* if we do have an index file, remove it */ - if (forceindex == FALSE) { - unlink(mh_folder->index_file_path); - } - forceindex = FALSE; - } - - /* no summary (disk or memory), and we're proverbially screwed */ - mh_folder->summary = camel_mh_summary_new(mh_folder->summary_file_path, - mh_folder->folder_file_path, - mh_folder->index); - - if (camel_mh_summary_load(mh_folder->summary, forceindex) == -1) { - camel_exception_set(ex, CAMEL_EXCEPTION_FOLDER_INVALID, /* FIXME: right error code */ - _("Could not load or create summary")); - camel_object_unref (CAMEL_OBJECT (folder)); - return NULL; - } - - return folder; -} - -static void mh_sync(CamelFolder * folder, gboolean expunge, CamelException * ex) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); - - if (expunge) - mh_expunge(folder, ex); - else { - camel_mh_summary_sync(mh_folder->summary, FALSE, mh_folder->changes, ex); - camel_object_trigger_event(CAMEL_OBJECT(folder), "folder_changed", mh_folder->changes); - camel_folder_change_info_clear(mh_folder->changes); - } - - /* save index */ - if (mh_folder->index) - ibex_save(mh_folder->index); - if (mh_folder->summary) - camel_folder_summary_save(CAMEL_FOLDER_SUMMARY(mh_folder->summary)); -} - -static void mh_expunge(CamelFolder * folder, CamelException * ex) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); - - camel_mh_summary_sync(mh_folder->summary, TRUE, mh_folder->changes, ex); - camel_object_trigger_event(CAMEL_OBJECT(folder), "folder_changed", mh_folder->changes); - camel_folder_change_info_clear(mh_folder->changes); -} - -static gint mh_get_message_count(CamelFolder * folder) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); - - g_return_val_if_fail(mh_folder->summary != NULL, -1); - - return camel_folder_summary_count(CAMEL_FOLDER_SUMMARY(mh_folder->summary)); -} - -static gint mh_get_unread_message_count(CamelFolder * folder) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); - CamelMessageInfo *info; - GPtrArray *infolist; - gint i, count = 0; - - g_return_val_if_fail(mh_folder->summary != NULL, -1); - - infolist = mh_get_summary(folder); - - for (i = 0; i < infolist->len; i++) { - info = (CamelMessageInfo *) g_ptr_array_index(infolist, i); - if (!(info->flags & CAMEL_MESSAGE_SEEN)) - count++; - } - - return count; -} - -static void mh_append_message(CamelFolder * folder, CamelMimeMessage * message, const CamelMessageInfo *info, CamelException * ex) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); - CamelStream *output_stream = NULL; - char *name = NULL; - char *uid = NULL; - CamelMessageInfo *newinfo; - - /* FIXME: probably needs additional locking */ - - /* keep trying uid's until we find one thats ok */ - do { - g_free(uid); - g_free(name); - uid = camel_folder_summary_next_uid_string((CamelFolderSummary *)mh_folder->summary); - name = g_strdup_printf("%s/%s", mh_folder->folder_file_path, uid); - output_stream = camel_stream_fs_new_with_name(name, O_WRONLY|O_CREAT|O_EXCL, 0600); - } while (output_stream == NULL && errno == EEXIST); - - if (output_stream == NULL) - goto fail; - - /* write the message */ - if (camel_data_wrapper_write_to_stream(CAMEL_DATA_WRAPPER(message), output_stream) == -1) - goto fail; - - if (camel_stream_close(output_stream) == -1) - goto fail; - - /* index/summarise the message. Yes this re-reads it, its just simpler */ - camel_mh_summary_add(mh_folder->summary, uid, TRUE); - - if (info - && (newinfo = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mh_folder->summary), uid))) { - CamelFlag *flag = info->user_flags; - CamelTag *tag = info->user_tags; - - newinfo->flags = info->flags; - while (flag) { - camel_flag_set(&newinfo->user_flags, flag->name, TRUE); - flag = flag->next; - } - while (tag) { - camel_tag_set(&newinfo->user_tags, tag->name, tag->value); - tag = tag->next; - } - } - - camel_folder_change_info_add_uid(mh_folder->changes, uid); - camel_object_trigger_event(CAMEL_OBJECT(folder), "folder_changed", mh_folder->changes); - camel_folder_change_info_clear(mh_folder->changes); - g_free(name); - g_free(uid); - return; - -fail: - if (camel_exception_is_set(ex)) { - camel_exception_setv(ex, camel_exception_get_id(ex), - _("Cannot append message to mh folder: %s"), camel_exception_get_description(ex)); - } else { - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Cannot append message to mh folder: %s"), g_strerror(errno)); - } - if (output_stream) - camel_object_unref(CAMEL_OBJECT(output_stream)); - if (name) { - unlink(name); - g_free(name); - } - g_free(uid); -} - -static GPtrArray *mh_get_uids(CamelFolder * folder) -{ - GPtrArray *array; - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); - int i, count; - - count = camel_folder_summary_count(CAMEL_FOLDER_SUMMARY(mh_folder->summary)); - array = g_ptr_array_new(); - g_ptr_array_set_size(array, count); - for (i = 0; i < count; i++) { - CamelMessageInfo *info = - camel_folder_summary_index(CAMEL_FOLDER_SUMMARY(mh_folder->summary), i); - - array->pdata[i] = g_strdup(info->uid); - } - - return array; -} - -static CamelMimeMessage *mh_get_message(CamelFolder * folder, const gchar * uid, CamelException * ex) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); - CamelStream *message_stream = NULL; - CamelMimeMessage *message = NULL; - CamelMessageInfo *info; - char *name; - - name = g_strdup_printf("%s/%s", mh_folder->folder_file_path, uid); - - /* get the message summary info */ - info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mh_folder->summary), uid); - - if (info == NULL) { - errno = ENOENT; - goto fail; - } - - message_stream = camel_stream_fs_new_with_name(name, O_RDONLY, 0); - - /* where we read from */ - if (message_stream == NULL) - goto fail; - - message = camel_mime_message_new(); - if (camel_data_wrapper_construct_from_stream(CAMEL_DATA_WRAPPER(message), message_stream) == -1) { - g_warning("Construction failed"); - errno = EINVAL; - goto fail; - } - camel_object_unref(CAMEL_OBJECT(message_stream)); - g_free(name); - - return message; - -fail: - camel_exception_setv(ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID, _("Cannot get message: %s\n %s"), - name, g_strerror(errno)); - - if (message_stream) - camel_object_unref(CAMEL_OBJECT(message_stream)); - - if (message) - camel_object_unref(CAMEL_OBJECT(message)); - - g_free(name); - - return NULL; -} - -GPtrArray *mh_get_summary(CamelFolder * folder) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); - - return CAMEL_FOLDER_SUMMARY(mh_folder->summary)->messages; -} - -/* get a single message info, by uid */ -static const CamelMessageInfo *mh_get_message_info(CamelFolder * folder, const char *uid) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); - - return camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mh_folder->summary), uid); -} - -static GPtrArray *mh_search_by_expression(CamelFolder * folder, const char *expression, CamelException * ex) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); - - if (mh_folder->search == NULL) { - mh_folder->search = camel_folder_search_new(); - } - - camel_folder_search_set_folder(mh_folder->search, folder); - if (mh_folder->summary) { - /* FIXME: dont access summary array directly? */ - camel_folder_search_set_summary(mh_folder->search, - CAMEL_FOLDER_SUMMARY(mh_folder->summary)->messages); - } - - camel_folder_search_set_body_index(mh_folder->search, mh_folder->index); - - return camel_folder_search_execute_expression(mh_folder->search, expression, ex); -} - -static void mh_search_free(CamelFolder *folder, GPtrArray *result) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER (folder); - - camel_folder_search_free_result(mh_folder->search, result); -} - -static guint32 mh_get_message_flags(CamelFolder * folder, const char *uid) -{ - CamelMessageInfo *info; - CamelMhFolder *mf = CAMEL_MH_FOLDER(folder); - - info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid); - g_return_val_if_fail(info != NULL, 0); - - return info->flags; -} - -static void mh_set_message_flags(CamelFolder * folder, const char *uid, guint32 flags, guint32 set) -{ - CamelMessageInfo *info; - CamelMhFolder *mf = CAMEL_MH_FOLDER(folder); - - info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid); - g_return_if_fail(info != NULL); - - info->flags = (info->flags & ~flags) | (set & flags) | CAMEL_MESSAGE_FOLDER_FLAGGED; - camel_folder_summary_touch(CAMEL_FOLDER_SUMMARY(mf->summary)); - - camel_object_trigger_event (CAMEL_OBJECT(folder), "message_changed", (char *) uid); -} - -static gboolean mh_get_message_user_flag(CamelFolder * folder, const char *uid, const char *name) -{ - CamelMessageInfo *info; - CamelMhFolder *mf = CAMEL_MH_FOLDER(folder); - - info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid); - g_return_val_if_fail(info != NULL, FALSE); - - return camel_flag_get(&info->user_flags, name); -} - -static void mh_set_message_user_flag(CamelFolder * folder, const char *uid, const char *name, gboolean value) -{ - CamelMessageInfo *info; - CamelMhFolder *mf = CAMEL_MH_FOLDER(folder); - - info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid); - g_return_if_fail(info != NULL); - - camel_flag_set(&info->user_flags, name, value); - info->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED; - camel_folder_summary_touch(CAMEL_FOLDER_SUMMARY(mf->summary)); - camel_object_trigger_event (CAMEL_OBJECT(folder), "message_changed", (char *) uid); -} - -static const char *mh_get_message_user_tag(CamelFolder *folder, const char *uid, const char *name) -{ - CamelMessageInfo *info; - CamelMhFolder *mf = CAMEL_MH_FOLDER(folder); - - info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid); - g_return_val_if_fail(info != NULL, FALSE); - - return camel_tag_get(&info->user_tags, name); -} - -static void mh_set_message_user_tag(CamelFolder *folder, const char *uid, const char *name, const char *value) -{ - CamelMessageInfo *info; - CamelMhFolder *mf = CAMEL_MH_FOLDER(folder); - - info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY(mf->summary), uid); - g_return_if_fail(info != NULL); - - camel_tag_set(&info->user_tags, name, value); - info->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED; - camel_folder_summary_touch(CAMEL_FOLDER_SUMMARY(mf->summary)); - camel_object_trigger_event(CAMEL_OBJECT(folder), "message_changed", (char *) uid); -} diff --git a/camel/providers/mh/camel-mh-folder.h b/camel/providers/mh/camel-mh-folder.h deleted file mode 100644 index ddfdf2b4aa..0000000000 --- a/camel/providers/mh/camel-mh-folder.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mh-folder.h : MH folder. */ - -/* - * - * Authors: - * Michael Zucchi <notzed@helixcode.com> - * - * Copyright (C) 1999 Helix Code Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef CAMEL_MH_FOLDER_H -#define CAMEL_MH_FOLDER_H 1 - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus } */ -#include <camel/camel-folder.h> -#include <camel/camel-folder-search.h> -#include <libibex/ibex.h> -#include "camel-mh-summary.h" - -#define CAMEL_MH_FOLDER_TYPE (camel_mh_folder_get_type ()) -#define CAMEL_MH_FOLDER(obj) (CAMEL_CHECK_CAST((obj), CAMEL_MH_FOLDER_TYPE, CamelMhFolder)) -#define CAMEL_MH_FOLDER_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_MH_FOLDER_TYPE, CamelMhFolderClass)) -#define IS_CAMEL_MH_FOLDER(o) (CAMEL_CHECK_TYPE((o), CAMEL_MH_FOLDER_TYPE)) - -typedef struct { - CamelFolder parent_object; - - gchar *folder_file_path; /* contains the messages */ - gchar *summary_file_path; /* contains the messages summary */ - gchar *folder_dir_path; /* contains the subfolders */ - gchar *index_file_path; /* index of body contents */ - - ibex *index; /* index for this folder */ - CamelMhSummary *summary; - CamelFolderSearch *search; /* used to run searches, we just use the real thing (tm) */ - CamelFolderChangeInfo *changes; /* mass changes to the folder */ -} CamelMhFolder; - -typedef struct { - CamelFolderClass parent_class; - - /* Virtual methods */ - -} CamelMhFolderClass; - -/* public methods */ -CamelFolder *camel_mh_folder_new(CamelStore *parent_store, const char *full_name, guint32 flags, CamelException *ex); - -/* Standard Camel function */ -CamelType camel_mh_folder_get_type(void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* CAMEL_MH_FOLDER_H */ diff --git a/camel/providers/mh/camel-mh-provider.c b/camel/providers/mh/camel-mh-provider.c deleted file mode 100644 index 74329a3203..0000000000 --- a/camel/providers/mh/camel-mh-provider.c +++ /dev/null @@ -1,56 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mbox-provider.c: mbox provider registration code */ - -/* - * Authors : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * Copyright (C) 2000 HelixCode (www.helixcode.com). - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "config.h" -#include "camel-mh-store.h" -#include "camel-provider.h" -#include "camel-session.h" -#include "camel-url.h" - -static CamelProvider mh_provider = { - "mh", - N_("UNIX MH-format mail directories"), - - N_("For storing local mail in MH-like mail directories"), - - "mail", - - CAMEL_PROVIDER_IS_STORAGE, - - CAMEL_URL_NEED_PATH, - - {0, 0}, - - NULL -}; - -void camel_provider_module_init(CamelSession * session) -{ - mh_provider.object_types[CAMEL_PROVIDER_STORE] = camel_mh_store_get_type(); - - mh_provider.service_cache = g_hash_table_new(camel_url_hash, camel_url_equal); - - camel_session_register_provider(session, &mh_provider); -} diff --git a/camel/providers/mh/camel-mh-store.c b/camel/providers/mh/camel-mh-store.c deleted file mode 100644 index 0a6da11162..0000000000 --- a/camel/providers/mh/camel-mh-store.c +++ /dev/null @@ -1,228 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mbox-store.c : class for an mbox store */ - -/* - * - * Copyright (C) 2000 Helix Code, Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> - -#include <sys/stat.h> -#include <errno.h> -#include <string.h> -#include <unistd.h> - -#include "camel-mh-store.h" -#include "camel-mh-folder.h" -#include "camel-exception.h" -#include "camel-url.h" - -/* Returns the class for a CamelMhStore */ -#define CMHS_CLASS(so) CAMEL_MH_STORE_CLASS (CAMEL_OBJECT_GET_CLASS(so)) -#define CF_CLASS(so) CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so)) -#define CMHF_CLASS(so) CAMEL_MH_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - -static char *get_name(CamelService * service, gboolean brief); -static CamelFolder *get_folder(CamelStore * store, const char *folder_name, guint32 flags, CamelException * ex); -static void delete_folder(CamelStore * store, const char *folder_name, CamelException * ex); -static void rename_folder(CamelStore *store, const char *old_name, const char *new_name, CamelException *ex); -static char *get_folder_name(CamelStore * store, const char *folder_name, CamelException * ex); -static CamelFolderInfo *get_folder_info (CamelStore *store, const char *top, - gboolean fast, gboolean recursive, - gboolean subscribed_only, - CamelException *ex); - -static void camel_mh_store_class_init(CamelObjectClass * camel_mh_store_class) -{ - CamelStoreClass *camel_store_class = CAMEL_STORE_CLASS(camel_mh_store_class); - CamelServiceClass *camel_service_class = CAMEL_SERVICE_CLASS(camel_mh_store_class); - - /* virtual method overload */ - camel_service_class->get_name = get_name; - - camel_store_class->get_folder = get_folder; - camel_store_class->delete_folder = delete_folder; - camel_store_class->rename_folder = rename_folder; - camel_store_class->get_folder_name = get_folder_name; - camel_store_class->get_folder_info = get_folder_info; - camel_store_class->free_folder_info = camel_store_free_folder_info_full; -} - -static void camel_mh_store_init(CamelObject * object) -{ - CamelStore *store = CAMEL_STORE(object); - - /* mh names are filenames, so they are case-sensitive. */ - store->folders = g_hash_table_new(g_str_hash, g_str_equal); -} - -CamelType camel_mh_store_get_type(void) -{ - static CamelType camel_mh_store_type = CAMEL_INVALID_TYPE; - - if (camel_mh_store_type == CAMEL_INVALID_TYPE) { - camel_mh_store_type = camel_type_register(CAMEL_STORE_TYPE, "CamelMhStore", - sizeof(CamelMhStore), - sizeof(CamelMhStoreClass), - (CamelObjectClassInitFunc) camel_mh_store_class_init, - NULL, - (CamelObjectInitFunc) camel_mh_store_init, - NULL); - } - - return camel_mh_store_type; -} - -const gchar *camel_mh_store_get_toplevel_dir(CamelMhStore * store) -{ - CamelURL *url = CAMEL_SERVICE(store)->url; - - g_assert(url != NULL); - return url->path; -} - -static CamelFolder *get_folder(CamelStore * store, const char *folder_name, guint32 flags, CamelException * ex) -{ - char *name; - struct stat st; - - name = g_strdup_printf("%s%s", CAMEL_SERVICE(store)->url->path, folder_name); - - if (stat(name, &st) == -1) { - if (errno != ENOENT) { - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not open folder `%s':\n%s"), - folder_name, g_strerror(errno)); - g_free (name); - return NULL; - } - if ((flags & CAMEL_STORE_FOLDER_CREATE) == 0) { - camel_exception_setv(ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, - _("Folder `%s' does not exist."), folder_name); - g_free (name); - return NULL; - } - printf("creating ...\n"); - - if (mkdir(name, 0700) != 0) { - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not create folder `%s':\n%s"), - folder_name, g_strerror(errno)); - g_free (name); - return NULL; - } - printf("created ok?\n"); - - } else if (!S_ISDIR(st.st_mode)) { - camel_exception_setv(ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, - _("`%s' is not a directory."), name); - g_free (name); - return NULL; - } - g_free(name); - - return camel_mh_folder_new(store, folder_name, flags, ex); -} - -static void delete_folder(CamelStore * store, const char *folder_name, CamelException * ex) -{ - char *name; - struct stat st; - char *str; - - name = g_strdup_printf("%s%s", CAMEL_SERVICE(store)->url->path, folder_name); - if (stat(name, &st) == -1) { - if (errno != ENOENT) - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not delete folder `%s': %s"), - folder_name, strerror(errno)); - } else { - /* this will 'fail' if there are still messages in the directory - - but only the metadata is lost */ - str = g_strdup_printf("%s/ev-summary", name); - unlink(str); - g_free(str); - str = g_strdup_printf("%s/ev-index.ibex", name); - unlink(str); - g_free(str); - if (rmdir(name) == -1) { - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not delete folder `%s': %s"), - folder_name, strerror(errno)); - } - } - g_free(name); -} - -static void rename_folder (CamelStore *store, const char *old_name, const char *new_name, CamelException *ex) -{ - char *old, *new; - struct stat st; - - old = g_strdup_printf("%s%s", CAMEL_SERVICE(store)->url->path, old_name); - new = g_strdup_printf("%s%s", CAMEL_SERVICE(store)->url->path, new_name); - if (stat(new, &st) == -1 && errno == ENOENT) { - if (stat(old, &st) == 0 && S_ISDIR(st.st_mode)) { - if (rename(old, new) != 0) { - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not rename folder `%s': %s"), old_name, strerror(errno)); - } - } else { - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not rename folder `%s': %s"), old_name, strerror(errno)); - } - } else { - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not rename folder `%s': %s exists"), old_name, new_name); - } -} - -static char *get_folder_name(CamelStore * store, const char *folder_name, CamelException * ex) -{ - /* For now, we don't allow hieararchy. FIXME. */ - if (strchr(folder_name + 1, '/')) { - camel_exception_set(ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, _("MH folders may not be nested.")); - return NULL; - } - - return *folder_name == '/' ? g_strdup(folder_name) : g_strdup_printf("/%s", folder_name); -} - -static char *get_name(CamelService * service, gboolean brief) -{ - if (brief) - return g_strdup(service->url->path); - else - return g_strdup_printf(_("Local mail directory %s"), service->url->path); -} - - -static CamelFolderInfo * -get_folder_info (CamelStore *store, const char *top, - gboolean fast, gboolean recursive, - gboolean subscribed_only, - CamelException *ex) -{ - /* FIXME: This is broken, but it corresponds to what was - * there before. - */ - return NULL; -} diff --git a/camel/providers/mh/camel-mh-store.h b/camel/providers/mh/camel-mh-store.h deleted file mode 100644 index e2e2bbb656..0000000000 --- a/camel/providers/mh/camel-mh-store.h +++ /dev/null @@ -1,59 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mh-store.h : class for an mh store */ - -/* - * - * Copyright (C) 2000 Helix Code, Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef CAMEL_MH_STORE_H -#define CAMEL_MH_STORE_H 1 - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus } */ -#include "camel-store.h" -#define CAMEL_MH_STORE_TYPE (camel_mh_store_get_type ()) -#define CAMEL_MH_STORE(obj) (CAMEL_CHECK_CAST((obj), CAMEL_MH_STORE_TYPE, CamelMhStore)) -#define CAMEL_MH_STORE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_MH_STORE_TYPE, CamelMhStoreClass)) -#define IS_CAMEL_MH_STORE(o) (CAMEL_CHECK_TYPE((o), CAMEL_MH_STORE_TYPE)) - -typedef struct { - CamelStore parent_object; - -} CamelMhStore; - -typedef struct { - CamelStoreClass parent_class; - -} CamelMhStoreClass; - -/* public methods */ - -/* Standard Camel function */ -CamelType camel_mh_store_get_type(void); - -const gchar *camel_mh_store_get_toplevel_dir(CamelMhStore * store); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* CAMEL_MH_STORE_H */ diff --git a/camel/providers/mh/camel-mh-summary.c b/camel/providers/mh/camel-mh-summary.c deleted file mode 100644 index c757a9a0a9..0000000000 --- a/camel/providers/mh/camel-mh-summary.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Not Zed <notzed@lostzed.mmc.com.au> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "camel-mh-summary.h" -#include <camel/camel-mime-message.h> - -#include <sys/stat.h> -#include <sys/uio.h> -#include <unistd.h> -#include <errno.h> -#include <string.h> -#include <stdlib.h> - -#include <sys/types.h> -#include <dirent.h> - -#include <ctype.h> - -#define d(x) - -#define CAMEL_MH_SUMMARY_VERSION (0x2000) - -static CamelMessageInfo *message_info_new(CamelFolderSummary *, struct _header_raw *); - -static void camel_mh_summary_class_init (CamelMhSummaryClass *class); -static void camel_mh_summary_init (CamelMhSummary *gspaper); -static void camel_mh_summary_finalise (CamelObject *obj); - -#define _PRIVATE(x) (((CamelMhSummary *)(x))->priv) - -struct _CamelMhSummaryPrivate { - char *current_uid; -}; - -static CamelFolderSummaryClass *parent_class; - -CamelType -camel_mh_summary_get_type (void) -{ - static CamelType type = CAMEL_INVALID_TYPE; - - if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register(camel_folder_summary_get_type (), "CamelMhSummary", - sizeof(CamelMhSummary), - sizeof(CamelMhSummaryClass), - (CamelObjectClassInitFunc)camel_mh_summary_class_init, - NULL, - (CamelObjectInitFunc)camel_mh_summary_init, - (CamelObjectFinalizeFunc)camel_mh_summary_finalise); - } - - return type; -} - -static void -camel_mh_summary_class_init (CamelMhSummaryClass *class) -{ - CamelFolderSummaryClass *sklass = (CamelFolderSummaryClass *) class; - - parent_class = CAMEL_FOLDER_SUMMARY_CLASS (camel_type_get_global_classfuncs(camel_folder_summary_get_type ())); - - /* override methods */ - sklass->message_info_new = message_info_new; -} - -static void -camel_mh_summary_init (CamelMhSummary *o) -{ - struct _CamelFolderSummary *s = (CamelFolderSummary *) o; - - o->priv = g_malloc0(sizeof(*o->priv)); - - /* set unique file version */ - s->version += CAMEL_MH_SUMMARY_VERSION; -} - -static void -camel_mh_summary_finalise(CamelObject *obj) -{ - CamelMhSummary *o = (CamelMhSummary *)obj; - - g_free(o->mh_path); - g_free(o->priv); -} - -/** - * camel_mh_summary_new: - * - * Create a new CamelMhSummary object. - * - * Return value: A new #CamelMhSummary object. - **/ -CamelMhSummary *camel_mh_summary_new (const char *filename, const char *mhdir, ibex *index) -{ - CamelMhSummary *o = (CamelMhSummary *)camel_object_new(camel_mh_summary_get_type ()); - - camel_folder_summary_set_build_content((CamelFolderSummary *)o, TRUE); - camel_folder_summary_set_filename((CamelFolderSummary *)o, filename); - o->mh_path = g_strdup(mhdir); - o->index = index; - return o; -} - -static CamelMessageInfo *message_info_new(CamelFolderSummary * s, struct _header_raw *h) -{ - CamelMessageInfo *mi; - CamelMhSummary *mhs = (CamelMhSummary *)s; - - mi = ((CamelFolderSummaryClass *) parent_class)->message_info_new(s, h); - if (mi) { - /* it only ever indexes 1 message at a time */ - mi->uid = g_strdup(mhs->priv->current_uid); - } - - return mi; -} - -int camel_mh_summary_load(CamelMhSummary * mhs, int forceindex) -{ - CamelFolderSummary *s = CAMEL_FOLDER_SUMMARY(mhs); - - d(printf("loading summary ...\n")); - - if (forceindex || camel_folder_summary_load(s) == -1) { - camel_folder_summary_clear(s); - } - return camel_mh_summary_check(mhs, forceindex); -} - -int camel_mh_summary_add(CamelMhSummary * mhs, const char *name, int forceindex) -{ - char *filename = g_strdup_printf("%s/%s", mhs->mh_path, name); - int fd; - CamelMimeParser *mp; - - d(printf("summarising: %s\n", name)); - - fd = open(filename, O_RDONLY); - if (fd == -1) { - g_warning("Cannot summarise/index: %s: %s", filename, strerror(errno)); - g_free(filename); - return -1; - } - mp = camel_mime_parser_new(); - camel_mime_parser_scan_from(mp, FALSE); - camel_mime_parser_init_with_fd(mp, fd); - if (mhs->index && (forceindex || !ibex_contains_name(mhs->index, (char *)name))) { - d(printf("forcing indexing of message content\n")); - camel_folder_summary_set_index((CamelFolderSummary *)mhs, mhs->index); - } else { - camel_folder_summary_set_index((CamelFolderSummary *)mhs, NULL); - } - mhs->priv->current_uid = (char *)name; - camel_folder_summary_add_from_parser((CamelFolderSummary *)mhs, mp); - camel_object_unref((CamelObject *)mp); - mhs->priv->current_uid = NULL; - camel_folder_summary_set_index((CamelFolderSummary *)mhs, NULL); - g_free(filename); - return 0; -} - -static void -remove_summary(char *key, CamelMessageInfo *info, CamelMhSummary *mhs) -{ - d(printf("removing message %s from summary\n", key)); - if (mhs->index) - ibex_unindex(mhs->index, info->uid); - camel_folder_summary_remove((CamelFolderSummary *)mhs, info); -} - -int camel_mh_summary_check(CamelMhSummary * mhs, int forceindex) -{ - DIR *dir; - struct dirent *d; - char *p, c; - CamelMessageInfo *info; - GHashTable *left; - int i, count; - - d(printf("checking summary ...\n")); - - /* scan the directory, check for mail files not in the index, or index entries that - no longer exist */ - dir = opendir(mhs->mh_path); - if (dir == NULL) - return -1; - - /* keeps track of all uid's that have not been processed */ - left = g_hash_table_new(g_str_hash, g_str_equal); - count = camel_folder_summary_count((CamelFolderSummary *)mhs); - for (i=0;i<count;i++) { - info = camel_folder_summary_index((CamelFolderSummary *)mhs, i); - if (info) { - g_hash_table_insert(left, info->uid, info); - } - } - while ( (d = readdir(dir)) ) { - /* FIXME: also run stat to check for regular file */ - p = d->d_name; - while ( (c = *p++) ) { - if (!isdigit(c)) - break; - } - if (c==0) { - info = camel_folder_summary_uid((CamelFolderSummary *)mhs, d->d_name); - if (info == NULL || (mhs->index && (!ibex_contains_name(mhs->index, d->d_name)))) { - /* need to add this file to the summary */ - if (info != NULL) { - g_hash_table_remove(left, info->uid); - camel_folder_summary_remove((CamelFolderSummary *)mhs, info); - } - camel_mh_summary_add(mhs, d->d_name, forceindex); - } else { - g_hash_table_remove(left, info->uid); - } - } - } - closedir(dir); - g_hash_table_foreach(left, (GHFunc)remove_summary, mhs); - g_hash_table_destroy(left); - - /* force a save of the index, just to make sure */ - /* note this could be expensive so possibly shouldn't be here - as such */ - if (mhs->index) { - ibex_save(mhs->index); - } - - return 0; -} - -/* sync the summary with the ondisk files. - It doesnt store the state in the file, the summary only, == MUCH faster */ -int camel_mh_summary_sync(CamelMhSummary * mhs, int expunge, CamelFolderChangeInfo *changes, CamelException *ex) -{ - int count, i; - CamelMessageInfo *info; - char *name; - - printf("summary_sync(expunge=%s)\n", expunge?"true":"false"); - - if (mhs->index) { - ibex_save(mhs->index); - } - if (!expunge) - return 0; - - count = camel_folder_summary_count((CamelFolderSummary *)mhs); - for (i=count-1;i>=0;i--) { - info = camel_folder_summary_index((CamelFolderSummary *)mhs, i); - if (info && info->flags & CAMEL_MESSAGE_DELETED) { - name = g_strdup_printf("%s/%s", mhs->mh_path, info->uid); - d(printf("deleting %s\n", name)); - if (unlink(name) == 0 || errno==ENOENT) { - camel_folder_change_info_remove_uid(changes, info->uid); - camel_folder_summary_remove((CamelFolderSummary *)mhs, info); - } - } - } - return 0; -} - diff --git a/camel/providers/mh/camel-mh-summary.h b/camel/providers/mh/camel-mh-summary.h deleted file mode 100644 index 81aa91b418..0000000000 --- a/camel/providers/mh/camel-mh-summary.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Not Zed <notzed@lostzed.mmc.com.au> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef _CAMEL_MH_SUMMARY_H -#define _CAMEL_MH_SUMMARY_H - -#include <camel/camel-folder-summary.h> -#include <camel/camel-folder.h> -#include <camel/camel-exception.h> -#include <libibex/ibex.h> - -#define CAMEL_MH_SUMMARY(obj) CAMEL_CHECK_CAST (obj, camel_mh_summary_get_type (), CamelMhSummary) -#define CAMEL_MH_SUMMARY_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_mh_summary_get_type (), CamelMhSummaryClass) -#define IS_CAMEL_MH_SUMMARY(obj) CAMEL_CHECK_TYPE (obj, camel_mh_summary_get_type ()) - -typedef struct _CamelMhSummary CamelMhSummary; -typedef struct _CamelMhSummaryClass CamelMhSummaryClass; - -struct _CamelMhSummary { - CamelFolderSummary parent; - struct _CamelMhSummaryPrivate *priv; - - char *mh_path; - ibex *index; -}; - -struct _CamelMhSummaryClass { - CamelFolderSummaryClass parent_class; - - /* virtual methods */ - - /* signals */ -}; - -CamelType camel_mh_summary_get_type (void); -CamelMhSummary *camel_mh_summary_new (const char *filename, const char *mhdir, ibex *index); - -/* methods */ -int camel_mh_summary_load(CamelMhSummary * mhs, int forceindex); -int camel_mh_summary_check(CamelMhSummary * mhs, int forceindex); -int camel_mh_summary_add(CamelMhSummary * mhs, const char *name, int forceindex); -int camel_mh_summary_sync(CamelMhSummary * mhs, int expunge, CamelFolderChangeInfo *changes, CamelException *ex); - -#endif /* ! _CAMEL_MH_SUMMARY_H */ - diff --git a/camel/providers/mh/libcamelmh.urls b/camel/providers/mh/libcamelmh.urls deleted file mode 100644 index 372daaa98f..0000000000 --- a/camel/providers/mh/libcamelmh.urls +++ /dev/null @@ -1 +0,0 @@ -mh diff --git a/camel/providers/nntp/.cvsignore b/camel/providers/nntp/.cvsignore deleted file mode 100644 index 1f5b9d35fb..0000000000 --- a/camel/providers/nntp/.cvsignore +++ /dev/null @@ -1,8 +0,0 @@ -.deps -Makefile -Makefile.in -.libs -.deps -*.lo -*.la -test-newsrc diff --git a/camel/providers/nntp/Makefile.am b/camel/providers/nntp/Makefile.am deleted file mode 100644 index 4b686735e3..0000000000 --- a/camel/providers/nntp/Makefile.am +++ /dev/null @@ -1,53 +0,0 @@ -## Process this file with automake to produce Makefile.in - -libcamelnntpincludedir = $(includedir)/camel - -providerdir = $(pkglibdir)/camel-providers/$(VERSION) - -provider_LTLIBRARIES = libcamelnntp.la -provider_DATA = libcamelnntp.urls - -INCLUDES = -I../.. \ - -I$(top_srcdir)/camel \ - -I$(top_srcdir)/intl \ - -I$(top_srcdir)/libibex \ - -I$(top_srcdir)/e-util \ - -I$(top_srcdir) \ - -I$(includedir) \ - $(GTK_INCLUDEDIR) \ - -DG_LOG_DOMAIN=\"camel-nntp-provider\" - -libcamelnntp_la_SOURCES = \ - camel-nntp-auth.c \ - camel-nntp-folder.c \ - camel-nntp-grouplist.c \ - camel-nntp-newsrc.c \ - camel-nntp-provider.c \ - camel-nntp-store.c \ - camel-nntp-utils.c - -libcamelnntpinclude_HEADERS = \ - camel-nntp-auth.h \ - camel-nntp-folder.h \ - camel-nntp-grouplist.h \ - camel-nntp-newsrc.h \ - camel-nntp-resp-codes.h \ - camel-nntp-store.h \ - camel-nntp-types.h \ - camel-nntp-utils.h - -libcamelnntp_la_LDFLAGS = -version-info 0:0:0 - -EXTRA_DIST = libcamelnntp.urls - -#noinst_PROGRAMS = test-newsrc - -#LDADD = \ - #$(top_builddir)/camel/libcamel.la \ - #$(top_builddir)/e-util/libeutil.la \ - #$(top_builddir)/libibex/libibex.la \ - #$(GNOME_LIBDIR) \ - #$(GNOMEUI_LIBS) $(INTLLIBS) $(EXTRA_GNOME_LIBS) -# $(BONOBO_LIBS) - -#test_newsrc_LDADD = libcamelnntp.la $(LDADD) diff --git a/camel/providers/nntp/camel-nntp-auth.c b/camel/providers/nntp/camel-nntp-auth.c deleted file mode 100644 index 1f1e6ab2d8..0000000000 --- a/camel/providers/nntp/camel-nntp-auth.c +++ /dev/null @@ -1,90 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-nntp-auth.c : authentication for nntp */ - -/* - * - * Copyright (C) 2000 Helix Code, Inc. <toshok@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#include <camel-nntp-auth.h> -#include <camel-nntp-store.h> -#include <camel-nntp-resp-codes.h> -#include <camel-exception.h> -#include <camel-session.h> - -int -camel_nntp_auth_authenticate (CamelNNTPStore *store, CamelException *ex) -{ - CamelService *service = CAMEL_SERVICE (store); - CamelSession *session = camel_service_get_session (service); - int resp; - - if (!service->url->authmech && !service->url->passwd) { - gchar *prompt; - - prompt = g_strdup_printf (_("Please enter the NNTP password for %s@%s"), - service->url->user, service->url->host); - service->url->passwd = - camel_session_query_authenticator (session, - CAMEL_AUTHENTICATOR_ASK, prompt, - TRUE, service, "password", ex); - g_free (prompt); - - if (!service->url->passwd) { - camel_exception_set (ex, CAMEL_EXCEPTION_USER_CANCEL, - "You didn\'t enter a password."); - resp = 666; - goto done; - } - } - - /* first send username */ - resp = camel_nntp_command (store, ex, NULL, "AUTHINFO USER %s", service->url->user); - - if (resp == NNTP_AUTH_REJECTED) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, - _("Server rejected username")); - goto done; - - } - else if (resp != NNTP_AUTH_CONTINUE) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, - _("Failed to send username to server")); - goto done; - } - - /* then send the username if the server asks for it */ - resp = camel_nntp_command (store, ex, NULL, "AUTHINFO PASS %s", service->url->passwd); - - if (resp == NNTP_AUTH_REJECTED) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, - _("Server rejected username/password")); - goto done; - } - - done: - - if (service->url->passwd) { - /* let's be paranoid */ - memset (service->url->passwd, 0, strlen (service->url->passwd)); - g_free (service->url->passwd); - service->url->passwd = NULL; - } - return resp; -} diff --git a/camel/providers/nntp/camel-nntp-auth.h b/camel/providers/nntp/camel-nntp-auth.h deleted file mode 100644 index 2708d9d335..0000000000 --- a/camel/providers/nntp/camel-nntp-auth.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-nntp-auth.h : authentication for nntp */ - -/* - * - * Author : Chris Toshok <toshok@helixcode.com> - * - * Copyright (C) 1999 Helix Code . - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_NNTP_AUTH_H -#define CAMEL_NNTP_AUTH_H 1 - -#include <camel-nntp-store.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -int camel_nntp_auth_authenticate (CamelNNTPStore *store, CamelException *ex); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_NNTP_AUTH_H */ diff --git a/camel/providers/nntp/camel-nntp-folder.c b/camel/providers/nntp/camel-nntp-folder.c deleted file mode 100644 index e4d53d779f..0000000000 --- a/camel/providers/nntp/camel-nntp-folder.c +++ /dev/null @@ -1,330 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-nntp-folder.c : Abstract class for an email folder */ - -/* - * Author : Chris Toshok <toshok@helixcode.com> - * - * Copyright (C) 2000 Helix Code . - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#include <config.h> - -#include <stdlib.h> -#include <sys/types.h> -#include <dirent.h> -#include <sys/stat.h> -#include <unistd.h> -#include <errno.h> -#include <string.h> -#include <fcntl.h> - -#include "camel-folder-summary.h" -#include "camel-nntp-resp-codes.h" -#include "camel-nntp-store.h" -#include "camel-nntp-folder.h" -#include "camel-nntp-store.h" -#include "camel-nntp-utils.h" - -#include "string-utils.h" -#include "camel-stream-mem.h" -#include "camel-data-wrapper.h" -#include "camel-mime-message.h" -#include "camel-folder-summary.h" - -#include "camel-exception.h" - -static CamelFolderClass *parent_class=NULL; - -/* Returns the class for a CamelNNTPFolder */ -#define CNNTPF_CLASS(so) CAMEL_NNTP_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so)) -#define CF_CLASS(so) CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so)) -#define CNNTPS_CLASS(so) CAMEL_STORE_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - - -static void -nntp_folder_sync (CamelFolder *folder, gboolean expunge, - CamelException *ex) -{ - CamelNNTPStore *store; - - camel_folder_summary_save (CAMEL_NNTP_FOLDER(folder)->summary); - - store = CAMEL_NNTP_STORE (camel_folder_get_parent_store (folder)); - - if (store->newsrc) - camel_nntp_newsrc_write (store->newsrc); -} - -static gint -nntp_folder_get_message_count (CamelFolder *folder) -{ - CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER(folder); - - g_assert (folder); - g_assert (nntp_folder->summary); - - return camel_folder_summary_count(nntp_folder->summary); -} - -static guint32 -nntp_folder_get_message_flags (CamelFolder *folder, const char *uid) -{ - CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder); - CamelMessageInfo *info = camel_folder_summary_uid (nntp_folder->summary, uid); - - return info->flags; -} - -static void -nntp_folder_set_message_flags (CamelFolder *folder, const char *uid, - guint32 flags, guint32 set) -{ - CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder); - CamelMessageInfo *info = camel_folder_summary_uid (nntp_folder->summary, uid); - - info->flags = set; - - if (set & CAMEL_MESSAGE_SEEN) { - int article_num; - CamelNNTPStore *nntp_store = CAMEL_NNTP_STORE (camel_folder_get_parent_store (folder)); - - sscanf (uid, "%d", &article_num); - - camel_nntp_newsrc_mark_article_read (nntp_store->newsrc, - folder->name, - article_num); - } - - camel_folder_summary_touch (nntp_folder->summary); -} - -static CamelMimeMessage * -nntp_folder_get_message (CamelFolder *folder, const gchar *uid, CamelException *ex) -{ - CamelStream *message_stream = NULL; - CamelMimeMessage *message = NULL; - CamelStore *parent_store; - char *buf; - int buf_len; - int buf_alloc; - int status; - gboolean done; - char *message_id; - - /* get the parent store */ - parent_store = camel_folder_get_parent_store (folder); - - message_id = strchr (uid, ',') + 1; - status = camel_nntp_command (CAMEL_NNTP_STORE( parent_store ), ex, NULL, "ARTICLE %s", message_id); - - /* if the message_id was not found, raise an exception and return */ - if (status == NNTP_NO_SUCH_ARTICLE) { - camel_exception_setv (ex, - CAMEL_EXCEPTION_FOLDER_INVALID_UID, - _("Message %s not found."), - message_id); - return NULL; - } - else if (status != NNTP_ARTICLE_FOLLOWS) { - /* XXX */ - g_warning ("weird nntp error %d\n", status); - return NULL; - } - - /* XXX ick ick ick. read the entire message into a buffer and - then create a stream_mem for it. */ - buf_alloc = 2048; - buf_len = 0; - buf = g_malloc(buf_alloc); - done = FALSE; - - buf[0] = 0; - - while (!done) { - int line_length; - char *line; - - if (camel_remote_store_recv_line (CAMEL_REMOTE_STORE (parent_store), &line, ex) < 0) { - g_warning ("recv_line failed while building message\n"); - break; - } - - /* XXX check exception */ - - line_length = strlen ( line ); - - if (!strcmp(line, ".")) { - done = TRUE; - g_free (line); - } - else { - if (buf_len + line_length > buf_alloc) { - buf_alloc *= 2; - buf = g_realloc (buf, buf_alloc); - } - strcat(buf, line); - strcat(buf, "\n"); - buf_len += strlen(line) + 1; - g_free (line); - } - } - - /* create a stream bound to the message */ - message_stream = camel_stream_mem_new_with_buffer(buf, buf_len); - - message = camel_mime_message_new (); - camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER(message), message_stream); - - camel_object_unref (CAMEL_OBJECT (message_stream)); - -#if 0 - gtk_signal_connect (CAMEL_OBJECT (message), "message_changed", message_changed, folder); -#endif - - g_free (buf); - - return message; -} - -static GPtrArray * -nntp_folder_get_uids (CamelFolder *folder) -{ - CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder); - GPtrArray *out; - CamelMessageInfo *message_info; - int i; - int count = camel_folder_summary_count (nntp_folder->summary); - - out = g_ptr_array_new (); - g_ptr_array_set_size (out, count); - - for (i = 0; i < count; i++) { - message_info = camel_folder_summary_index (nntp_folder->summary, i); - out->pdata[i] = g_strdup (message_info->uid); - } - - return out; -} - -static GPtrArray * -nntp_folder_get_summary (CamelFolder *folder) -{ - CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder); - - return nntp_folder->summary->messages; -} - -static GPtrArray* -nntp_folder_search_by_expression (CamelFolder *folder, const char *expression, CamelException *ex) -{ - g_assert (0); - return NULL; -} - -static const CamelMessageInfo* -nntp_folder_get_message_info (CamelFolder *folder, const char *uid) -{ - CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder); - - return camel_folder_summary_uid (nntp_folder->summary, uid); -} - -static void -nntp_folder_finalize (CamelObject *object) -{ - CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (object); - - g_free (nntp_folder->summary_file_path); -} - -static void -camel_nntp_folder_class_init (CamelNNTPFolderClass *camel_nntp_folder_class) -{ - CamelFolderClass *camel_folder_class = CAMEL_FOLDER_CLASS (camel_nntp_folder_class); - - parent_class = CAMEL_FOLDER_CLASS (camel_type_get_global_classfuncs (camel_folder_get_type ())); - - /* virtual method definition */ - - /* virtual method overload */ - camel_folder_class->sync = nntp_folder_sync; - camel_folder_class->get_message_count = nntp_folder_get_message_count; - camel_folder_class->set_message_flags = nntp_folder_set_message_flags; - camel_folder_class->get_message_flags = nntp_folder_get_message_flags; - camel_folder_class->get_message = nntp_folder_get_message; - camel_folder_class->get_uids = nntp_folder_get_uids; - camel_folder_class->free_uids = camel_folder_free_deep; - camel_folder_class->get_summary = nntp_folder_get_summary; - camel_folder_class->free_summary = camel_folder_free_nop; - camel_folder_class->search_by_expression = nntp_folder_search_by_expression; - camel_folder_class->get_message_info = nntp_folder_get_message_info; -} - -CamelType -camel_nntp_folder_get_type (void) -{ - static CamelType camel_nntp_folder_type = CAMEL_INVALID_TYPE; - - if (camel_nntp_folder_type == CAMEL_INVALID_TYPE) { - camel_nntp_folder_type = camel_type_register (CAMEL_FOLDER_TYPE, "CamelNNTPFolder", - sizeof (CamelNNTPFolder), - sizeof (CamelNNTPFolderClass), - (CamelObjectClassInitFunc) camel_nntp_folder_class_init, - NULL, - (CamelObjectInitFunc) NULL, - (CamelObjectFinalizeFunc) nntp_folder_finalize); - } - - return camel_nntp_folder_type; -} - -CamelFolder * -camel_nntp_folder_new (CamelStore *parent, const char *folder_name, CamelException *ex) -{ - CamelFolder *folder = CAMEL_FOLDER (camel_object_new (CAMEL_NNTP_FOLDER_TYPE)); - CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder); - const gchar *root_dir_path; - - camel_folder_construct (folder, parent, folder_name, folder_name); - folder->has_summary_capability = TRUE; - - root_dir_path = camel_nntp_store_get_toplevel_dir (CAMEL_NNTP_STORE(folder->parent_store)); - nntp_folder->summary_file_path = g_strdup_printf ("%s/%s-ev-summary", - root_dir_path, - folder->name); - - nntp_folder->summary = camel_folder_summary_new (); - camel_folder_summary_set_filename (nntp_folder->summary, - nntp_folder->summary_file_path); - - if (-1 == camel_folder_summary_load (nntp_folder->summary)) { - /* Bad or nonexistant summary file */ - camel_nntp_get_headers (CAMEL_FOLDER( folder )->parent_store, - nntp_folder, ex); - if (camel_exception_get_id (ex)) { - camel_object_unref (CAMEL_OBJECT (folder)); - return NULL; - } - - /* XXX check return value */ - camel_folder_summary_save (nntp_folder->summary); - } - - return folder; -} diff --git a/camel/providers/nntp/camel-nntp-folder.h b/camel/providers/nntp/camel-nntp-folder.h deleted file mode 100644 index eed946fb5c..0000000000 --- a/camel/providers/nntp/camel-nntp-folder.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-nntp-folder.h : NNTP group (folder) support. */ - -/* - * - * Author : Chris Toshok <toshok@helixcode.com> - * - * Copyright (C) 2000 Helix Code . - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_NNTP_FOLDER_H -#define CAMEL_NNTP_FOLDER_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include "camel-folder.h" - -/* #include "camel-store.h" */ - -#define CAMEL_NNTP_FOLDER_TYPE (camel_nntp_folder_get_type ()) -#define CAMEL_NNTP_FOLDER(obj) (CAMEL_CHECK_CAST((obj), CAMEL_NNTP_FOLDER_TYPE, CamelNNTPFolder)) -#define CAMEL_NNTP_FOLDER_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_NNTP_FOLDER_TYPE, CamelNNTPFolderClass)) -#define IS_CAMEL_NNTP_FOLDER(o) (CAMEL_CHECK_TYPE((o), CAMEL_NNTP_FOLDER_TYPE)) - - -typedef struct { - CamelFolder parent_object; - - gchar *summary_file_path; /* contains the messages summary */ - CamelFolderSummary *summary; -} CamelNNTPFolder; - - - -typedef struct { - CamelFolderClass parent_class; - - /* Virtual methods */ - -} CamelNNTPFolderClass; - - -/* public methods */ - -/* Standard Camel function */ -CamelType camel_nntp_folder_get_type (void); - -CamelFolder *camel_nntp_folder_new (CamelStore *parent, const char *folder_name, CamelException *ex); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_NNTP_FOLDER_H */ diff --git a/camel/providers/nntp/camel-nntp-grouplist.c b/camel/providers/nntp/camel-nntp-grouplist.c deleted file mode 100644 index d7ee85d182..0000000000 --- a/camel/providers/nntp/camel-nntp-grouplist.c +++ /dev/null @@ -1,214 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-nntp-grouplist.c : getting/updating the list of newsgroups on the server. */ - -/* - * Author : Chris Toshok <toshok@helixcode.com> - * - * Copyright (C) 2000 Helix Code . - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> -#include <errno.h> -#include <string.h> - -#include "camel-exception.h" -#include "camel-nntp-grouplist.h" -#include "camel-nntp-resp-codes.h" - -static CamelNNTPGroupList * -camel_nntp_get_grouplist_from_server (CamelNNTPStore *store, CamelException *ex) -{ - int status; - gboolean done = FALSE; - CamelNNTPGroupList *list; - - status = camel_nntp_command (store, ex, NULL, - "LIST"); - - if (status != NNTP_LIST_FOLLOWS) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not get group list from server.")); - return NULL; - } - - list = g_new0 (CamelNNTPGroupList, 1); - list->time = time (NULL); - - while (!done) { - char *line; - - if (camel_remote_store_recv_line (CAMEL_REMOTE_STORE (store), &line, ex) < 0) - return list; - - if (*line == '.') { - done = TRUE; - } - else { - CamelNNTPGroupListEntry *entry = g_new (CamelNNTPGroupListEntry, 1); - char **split_line = g_strsplit (line, " ", 4); - - entry->group_name = g_strdup (split_line[0]); - entry->high = atoi (split_line[1]); - entry->low = atoi (split_line[2]); - - g_strfreev (split_line); - - list->group_list = g_list_append (list->group_list, entry); - } - } - - return list; -} - -static CamelNNTPGroupList* -camel_nntp_get_grouplist_from_file (CamelNNTPStore *store, CamelException *ex) -{ - gchar *root_dir = camel_nntp_store_get_toplevel_dir(CAMEL_NNTP_STORE(store)); - gchar *grouplist_file = g_strdup_printf ("%s/grouplist", root_dir); - CamelNNTPGroupList *list; - FILE *fp; - char buf[300]; - unsigned long time; - - g_free (root_dir); - fp = fopen (grouplist_file, "r"); - g_free (grouplist_file); - - if (fp == NULL) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - _("Unable to load grouplist file for %s: %s"), - CAMEL_SERVICE(store)->url->host, - strerror(errno)); - return NULL; - } - - /* read the time */ - if (!fgets (buf, 300, fp)) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - _("Unable to load grouplist file for %s: %s"), - CAMEL_SERVICE(store)->url->host, - strerror(errno)); - fclose (fp); - return NULL; - } - - - list = g_new0 (CamelNNTPGroupList, 1); - list->store = store; - sscanf (buf, "%lu", &time); - list->time = time; - - while (fgets (buf, 300, fp)) { - CamelNNTPGroupListEntry *entry = g_new (CamelNNTPGroupListEntry, 1); - char **split_line = g_strsplit (buf, " ", 4); - - entry->group_name = g_strdup (split_line[0]); - entry->high = atoi (split_line[1]); - entry->low = atoi (split_line[2]); - - g_strfreev (split_line); - - list->group_list = g_list_append (list->group_list, entry); - } - - fclose (fp); - - return list; -} - -static void -save_entry (CamelNNTPGroupListEntry *entry, FILE *fp) -{ - fprintf (fp, "%s %d %d\n", entry->group_name, entry->low, entry->high); -} - -void -camel_nntp_grouplist_save (CamelNNTPGroupList *group_list, CamelException *ex) -{ - FILE *fp; - gchar *root_dir = camel_nntp_store_get_toplevel_dir(CAMEL_NNTP_STORE(group_list->store)); - gchar *grouplist_file = g_strdup_printf ("%s/grouplist", root_dir); - - g_free (root_dir); - fp = fopen (grouplist_file, "w"); - g_free (grouplist_file); - - if (fp == NULL) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - _("Unable to save grouplist file for %s: %s"), - CAMEL_SERVICE(group_list->store)->url->host, - strerror(errno)); - return; - } - - fprintf (fp, "%lu\n", (long)group_list->time); - - g_list_foreach (group_list->group_list, (GFunc)save_entry, fp); - - fclose (fp); -} - -static void -free_entry (CamelNNTPGroupListEntry *entry, void *data) -{ - g_free (entry->group_name); - g_free (entry); -} - -void -camel_nntp_grouplist_free (CamelNNTPGroupList *group_list) -{ - g_return_if_fail (group_list); - - g_list_foreach (group_list->group_list, (GFunc)free_entry, NULL); - - g_free (group_list); -} - -CamelNNTPGroupList* -camel_nntp_grouplist_fetch (CamelNNTPStore *store, CamelException *ex) -{ - CamelNNTPGroupList *list; - - list = camel_nntp_get_grouplist_from_file (store, ex); - - printf ("camel_nntp_get_grouplist_from_file returned %p\n", list); - - if (!list) { - camel_exception_clear (ex); - - list = camel_nntp_get_grouplist_from_server (store, ex); - - if (!list) { - camel_nntp_grouplist_free (list); - } - else { - list->store = store; - camel_nntp_grouplist_save (list, ex); - return list; - } - } - - return list; -} - -gint -camel_nntp_grouplist_update (CamelNNTPGroupList *group_list, CamelException *ex) -{ - return 0; -} diff --git a/camel/providers/nntp/camel-nntp-grouplist.h b/camel/providers/nntp/camel-nntp-grouplist.h deleted file mode 100644 index 67c74d5dc2..0000000000 --- a/camel/providers/nntp/camel-nntp-grouplist.h +++ /dev/null @@ -1,49 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-nntp-grouplist.h : getting/updating the list of newsgroups on the server. */ - -/* - * Author : Chris Toshok <toshok@helixcode.com> - * - * Copyright (C) 2000 Helix Code . - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef CAMEL_NNTP_GROUPLIST_H -#define CAMEL_NNTP_GROUPLIST_H 1 - -#include <time.h> -#include "camel-nntp-store.h" - -struct CamelNNTPGroupListEntry { - char *group_name; - guint32 low; - guint32 high; - guint32 flags; -}; - -struct CamelNNTPGroupList { - CamelNNTPStore *store; - time_t time; - GList *group_list; -}; - -CamelNNTPGroupList* camel_nntp_grouplist_fetch (CamelNNTPStore *store, CamelException *ex); -gint camel_nntp_grouplist_update (CamelNNTPGroupList *group_list, CamelException *ex); -void camel_nntp_grouplist_save (CamelNNTPGroupList *group_list, CamelException *ex); -void camel_nntp_grouplist_free (CamelNNTPGroupList *group_list); - -#endif /* CAMEL_NNTP_GROUPLIST_H */ diff --git a/camel/providers/nntp/camel-nntp-newsrc.c b/camel/providers/nntp/camel-nntp-newsrc.c deleted file mode 100644 index b474dd3a40..0000000000 --- a/camel/providers/nntp/camel-nntp-newsrc.c +++ /dev/null @@ -1,573 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-nntp-newsrc.c - .newsrc parsing/regurgitating code */ -/* - * - * Copyright (C) 2000 Helix Code, Inc. <toshok@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <glib.h> -#include <fcntl.h> -#include <unistd.h> -#include <errno.h> -#include "camel-nntp-newsrc.h" -#include <camel/camel-folder-summary.h> - -typedef struct { - guint low; - guint high; -} ArticleRange; - -typedef struct { - char *name; - GArray *ranges; - gboolean subscribed; -} NewsrcGroup; - -struct CamelNNTPNewsrc { - gchar *filename; - GHashTable *groups; - gboolean dirty; -} ; - -static NewsrcGroup * -camel_nntp_newsrc_group_add (CamelNNTPNewsrc *newsrc, const char *group_name, gboolean subscribed) -{ - NewsrcGroup *new_group = g_malloc(sizeof(NewsrcGroup)); - - new_group->name = g_strdup(group_name); - new_group->subscribed = subscribed; - new_group->ranges = g_array_new (FALSE, FALSE, sizeof (ArticleRange)); - - g_hash_table_insert (newsrc->groups, new_group->name, new_group); - - newsrc->dirty = TRUE; - - return new_group; -} - -static int -camel_nntp_newsrc_group_get_highest_article_read(CamelNNTPNewsrc *newsrc, NewsrcGroup *group) -{ - if (!group || group->ranges->len == 0) - return 0; - - return g_array_index(group->ranges, ArticleRange, group->ranges->len - 1).high; -} - -static int -camel_nntp_newsrc_group_get_num_articles_read(CamelNNTPNewsrc *newsrc, NewsrcGroup *group) -{ - int i; - int count = 0; - - if (group == NULL) - return 0; - - for (i = 0; i < group->ranges->len; i ++) - count += (g_array_index(group->ranges, ArticleRange, i).high - - g_array_index(group->ranges, ArticleRange, i).low) + 1; - - return count; -} - - -static void -camel_nntp_newsrc_group_mark_range_read(CamelNNTPNewsrc *newsrc, NewsrcGroup *group, long low, long high) -{ - int i; - - if (group->ranges->len == 1 - && g_array_index (group->ranges, ArticleRange, 0).low == 0 - && g_array_index (group->ranges, ArticleRange, 0).high == 0) { - g_array_index (group->ranges, ArticleRange, 0).low = low; - g_array_index (group->ranges, ArticleRange, 0).high = high; - - newsrc->dirty = TRUE; - } - else { - ArticleRange tmp_range; - - for (i = 0; i < group->ranges->len; i ++) { - guint range_low = g_array_index (group->ranges, ArticleRange, i).low; - guint range_high = g_array_index (group->ranges, ArticleRange, i).high; - - /* if it's already part of a range, return immediately. */ - if (low >= range_low && - low <= range_high && - high >= range_low && - high <= range_high) { - return; - } - /* if we have a new lower bound for this range, set it. */ - else if (low <= range_low - && high >= range_low - && high <= range_high) { - g_array_index (group->ranges, ArticleRange, i).low = low; - newsrc->dirty = TRUE; - return; - } - /* if we have a new upper bound for this range, set it. */ - else if (high >= range_high - && low >= range_low - && low <= range_high) { - g_array_index (group->ranges, ArticleRange, i).high = high; - newsrc->dirty = TRUE; - return; - } - /* if we would be inserting another range that - starts one index higher than an existing - one, make the upper value of the existing - range the upper value of the new one. */ - else if (low == range_high + 1) { - g_array_index (group->ranges, ArticleRange, i).high = high; - newsrc->dirty = TRUE; - return; - } - /* if we would be inserting another range that - ends one index lower than an existing one, - group the existing range by setting its low - to the new low */ - else if (high == range_low - 1) { - g_array_index (group->ranges, ArticleRange, i).low = low; - newsrc->dirty = TRUE; - return; - } - /* if the range lies entirely outside another - range, doesn't coincide with it's - endpoints, and has lower values, insert it - into the middle of the list. */ - else if (low < range_low - && high < range_low) { - tmp_range.low = low; - tmp_range.high = high; - - group->ranges = g_array_insert_val (group->ranges, i, tmp_range); - newsrc->dirty = TRUE; - - return; - } - } - - /* if we made it here, the range needs to go at the end */ - tmp_range.low = low; - tmp_range.high = high; - group->ranges = g_array_append_val (group->ranges, tmp_range); - newsrc->dirty = TRUE; - } -} - -int -camel_nntp_newsrc_get_highest_article_read (CamelNNTPNewsrc *newsrc, const char *group_name) -{ - NewsrcGroup *group; - - group = g_hash_table_lookup (newsrc->groups, group_name); - - return camel_nntp_newsrc_group_get_highest_article_read (newsrc, group); -} - -int -camel_nntp_newsrc_get_num_articles_read (CamelNNTPNewsrc *newsrc, const char *group_name) -{ - NewsrcGroup *group; - - group = g_hash_table_lookup (newsrc->groups, group_name); - - return camel_nntp_newsrc_group_get_num_articles_read (newsrc, group); -} - -void -camel_nntp_newsrc_mark_article_read (CamelNNTPNewsrc *newsrc, const char *group_name, int num) -{ - camel_nntp_newsrc_mark_range_read (newsrc, group_name, num, num); -} - -void -camel_nntp_newsrc_mark_range_read(CamelNNTPNewsrc *newsrc, const char *group_name, long low, long high) -{ - NewsrcGroup *group; - - /* swap them if they're in the wrong order. */ - if (low > high) { - long tmp; - - tmp = high; - high = low; - low = tmp; - } - - group = g_hash_table_lookup (newsrc->groups, group_name); - - camel_nntp_newsrc_group_mark_range_read (newsrc, group, low, high); -} - -gboolean -camel_nntp_newsrc_article_is_read (CamelNNTPNewsrc *newsrc, const char *group_name, long num) -{ - int i; - NewsrcGroup *group; - - group = g_hash_table_lookup (newsrc->groups, group_name); - - for (i = 0; i < group->ranges->len; i++) { - if (num >= g_array_index (group->ranges, ArticleRange, i).low && - num <= g_array_index (group->ranges, ArticleRange, i).high) { - return TRUE; - } - } - - return FALSE; -} - -gboolean -camel_nntp_newsrc_group_is_subscribed (CamelNNTPNewsrc *newsrc, const char *group_name) -{ - NewsrcGroup *group = g_hash_table_lookup (newsrc->groups, group_name); - - if (group) { - return group->subscribed; - } - else { - return FALSE; - } -} - -void -camel_nntp_newsrc_subscribe_group (CamelNNTPNewsrc *newsrc, const char *group_name) -{ - NewsrcGroup *group = g_hash_table_lookup (newsrc->groups, group_name); - - if (group) { - if (!group->subscribed) - newsrc->dirty = TRUE; - group->subscribed = TRUE; - } - else { - camel_nntp_newsrc_group_add (newsrc, group_name, TRUE); - } -} - -void -camel_nntp_newsrc_unsubscribe_group (CamelNNTPNewsrc *newsrc, const char *group_name) -{ - NewsrcGroup *group = g_hash_table_lookup (newsrc->groups, group_name); - - if (group) { - if (group->subscribed) - newsrc->dirty = TRUE; - group->subscribed = FALSE; - } - else { - camel_nntp_newsrc_group_add (newsrc, group_name, FALSE); - } -} - -struct newsrc_ptr_array { - GPtrArray *ptr_array; - gboolean subscribed_only; -}; - -static void -get_group_foreach (char *group_name, NewsrcGroup *group, struct newsrc_ptr_array *npa) -{ - if (group->subscribed || !npa->subscribed_only) { - g_ptr_array_add (npa->ptr_array, group_name); - } -} - -GPtrArray * -camel_nntp_newsrc_get_subscribed_group_names (CamelNNTPNewsrc *newsrc) -{ - struct newsrc_ptr_array npa; - - g_return_val_if_fail (newsrc, NULL); - - npa.ptr_array = g_ptr_array_new(); - npa.subscribed_only = TRUE; - - g_hash_table_foreach (newsrc->groups, - (GHFunc)get_group_foreach, &npa); - - return npa.ptr_array; -} - -GPtrArray * -camel_nntp_newsrc_get_all_group_names (CamelNNTPNewsrc *newsrc) -{ - struct newsrc_ptr_array npa; - - g_return_val_if_fail (newsrc, NULL); - - npa.ptr_array = g_ptr_array_new(); - npa.subscribed_only = FALSE; - - g_hash_table_foreach (newsrc->groups, - (GHFunc)get_group_foreach, &npa); - - return npa.ptr_array; -} - -void -camel_nntp_newsrc_free_group_names (CamelNNTPNewsrc *newsrc, GPtrArray *group_names) -{ - g_ptr_array_free (group_names, TRUE); -} - -struct newsrc_fp { - CamelNNTPNewsrc *newsrc; - FILE *fp; -}; - -static void -camel_nntp_newsrc_write_group_line(gpointer key, NewsrcGroup *group, struct newsrc_fp *newsrc_fp) -{ - CamelNNTPNewsrc *newsrc; - FILE *fp; - int i; - - fp = newsrc_fp->fp; - newsrc = newsrc_fp->newsrc; - - fprintf (fp, "%s%c", group->name, group->subscribed ? ':' : '!'); - - if (group->ranges->len == 1 - && g_array_index (group->ranges, ArticleRange, 0).low == 0 - && g_array_index (group->ranges, ArticleRange, 0).high == 0) { - fprintf (fp, "\n"); - - return; /* special case since our parsing code will insert this - bogus range if there were no read articles. The code - to add a range is smart enough to remove this one if we - ever mark an article read, but we still need to deal with - it if that code doesn't get hit. */ - } - - fprintf (fp, " "); - - for (i = 0; i < group->ranges->len; i ++) { - char range_buffer[100]; - guint low = g_array_index (group->ranges, ArticleRange, i).low; - guint high = g_array_index (group->ranges, ArticleRange, i).high; - - if (low == high) - sprintf(range_buffer, "%d", low); - else if (low == high - 1) - sprintf(range_buffer, "%d,%d", low, high); - else - sprintf(range_buffer, "%d-%d", low, high); - - if (i != group->ranges->len - 1) - strcat(range_buffer, ","); - - fprintf (fp, range_buffer); - } - - fprintf (fp, "\n"); -} - -void -camel_nntp_newsrc_write_to_file(CamelNNTPNewsrc *newsrc, FILE *fp) -{ - struct newsrc_fp newsrc_fp; - - g_return_if_fail (newsrc); - - newsrc_fp.newsrc = newsrc; - newsrc_fp.fp = fp; - - g_hash_table_foreach (newsrc->groups, - (GHFunc)camel_nntp_newsrc_write_group_line, - &newsrc_fp); -} - -void -camel_nntp_newsrc_write(CamelNNTPNewsrc *newsrc) -{ - FILE *fp; - - g_return_if_fail (newsrc); - - if (!newsrc->dirty) - return; - - if ((fp = fopen(newsrc->filename, "w")) == NULL) { - g_warning ("Couldn't open newsrc file '%s'.\n", newsrc->filename); - return; - } - - camel_nntp_newsrc_write_to_file(newsrc, fp); - - newsrc->dirty = FALSE; - - fclose(fp); -} - -static void -camel_nntp_newsrc_parse_line(CamelNNTPNewsrc *newsrc, char *line) -{ - char *p, *comma, *dash; - gboolean is_subscribed; - NewsrcGroup *group; - - p = strchr(line, ':'); - - if (p) { - is_subscribed = TRUE; - } - else { - p = strchr(line, '!'); - if (p) - is_subscribed = FALSE; - else - return; /* bogus line. */ - } - - *p++ = '\0'; - - group = camel_nntp_newsrc_group_add (newsrc, line, is_subscribed); - - do { - guint high, low; - - comma = strchr(p, ','); - - if (comma) - *comma = '\0'; - - dash = strchr(p, '-'); - - if (!dash) { /* there wasn't a dash. must be just one number */ - high = low = atol(p); - } - else { /* there was a dash. */ - *dash = '\0'; - low = atol(p); - *dash = '-'; - p = dash + 1; - high = atol(p); - } - - camel_nntp_newsrc_group_mark_range_read (newsrc, group, low, high); - - if (comma) { - *comma = ','; - p = comma + 1; - } - - } while(comma); -} - -static char* -get_line (char *buf, char **p) -{ - char *l; - char *line; - - g_assert (*p == NULL || **p == '\n' || **p == '\0'); - - if (*p == NULL) { - *p = buf; - - if (**p == '\0') - return NULL; - } - else { - if (**p == '\0') - return NULL; - - (*p) ++; - - /* if we just incremented to the end of the buffer, return NULL */ - if (**p == '\0') - return NULL; - } - - l = strchr (*p, '\n'); - if (l) { - *l = '\0'; - line = g_strdup (*p); - *l = '\n'; - *p = l; - } - else { - /* we're at the last line (which isn't terminated by a \n, btw) */ - line = g_strdup (*p); - (*p) += strlen (*p); - } - - return line; -} - -CamelNNTPNewsrc * -camel_nntp_newsrc_read_for_server (const char *server) -{ - int fd; - char buf[1024]; - char *file_contents, *line, *p; - char *filename; - CamelNNTPNewsrc *newsrc; - int newsrc_len; - int len_read = 0; - struct stat sb; - - filename = g_strdup_printf ("%s/.newsrc-%s", g_get_home_dir(), server); - - newsrc = g_new0(CamelNNTPNewsrc, 1); - newsrc->filename = filename; - newsrc->groups = g_hash_table_new (g_str_hash, g_str_equal); - - if ((fd = open(filename, O_RDONLY)) == -1) { - g_warning ("~/.newsrc-%s not present.\n", server); - return newsrc; - } - - if (fstat (fd, &sb) == -1) { - g_warning ("failed fstat on ~/.newsrc-%s: %s\n", server, strerror(errno)); - return newsrc; - } - newsrc_len = sb.st_size; - - file_contents = g_malloc (newsrc_len + 1); - - while (len_read < newsrc_len) { - int c = read (fd, buf, sizeof (buf)); - - if (c == -1) - break; - - memcpy (&file_contents[len_read], buf, c); - len_read += c; - } - file_contents [len_read] = 0; - - p = NULL; - while ((line = get_line (file_contents, &p))) { - camel_nntp_newsrc_parse_line(newsrc, line); - g_free (line); - } - - close (fd); - g_free (file_contents); - - return newsrc; -} diff --git a/camel/providers/nntp/camel-nntp-newsrc.h b/camel/providers/nntp/camel-nntp-newsrc.h deleted file mode 100644 index 652e3edbce..0000000000 --- a/camel/providers/nntp/camel-nntp-newsrc.h +++ /dev/null @@ -1,34 +0,0 @@ - -#ifndef _CAMEL_NNTP_NEWSRC_H_ -#define _CAMEL_NNTP_NEWSRC_H_ - -#include <stdio.h> -#include "glib.h" - -typedef struct CamelNNTPNewsrc CamelNNTPNewsrc; - -int camel_nntp_newsrc_get_highest_article_read (CamelNNTPNewsrc *newsrc, const char *group_name); -int camel_nntp_newsrc_get_num_articles_read (CamelNNTPNewsrc *newsrc, const char *group_name); -void camel_nntp_newsrc_mark_article_read (CamelNNTPNewsrc *newsrc, - const char *group_name, int num); -void camel_nntp_newsrc_mark_range_read (CamelNNTPNewsrc *newsrc, - const char *group_name, long low, long high); - -gboolean camel_nntp_newsrc_article_is_read (CamelNNTPNewsrc *newsrc, - const char *group_name, long num); - -gboolean camel_nntp_newsrc_group_is_subscribed (CamelNNTPNewsrc *newsrc, const char *group_name); -void camel_nntp_newsrc_subscribe_group (CamelNNTPNewsrc *newsrc, const char *group_name); -void camel_nntp_newsrc_unsubscribe_group (CamelNNTPNewsrc *newsrc, const char *group_name); - -GPtrArray* camel_nntp_newsrc_get_subscribed_group_names (CamelNNTPNewsrc *newsrc); -GPtrArray* camel_nntp_newsrc_get_all_group_names (CamelNNTPNewsrc *newsrc); -void camel_nntp_newsrc_free_group_names (CamelNNTPNewsrc *newsrc, GPtrArray *group_names); - -void camel_nntp_newsrc_write_to_file (CamelNNTPNewsrc *newsrc, FILE *fp); -void camel_nntp_newsrc_write (CamelNNTPNewsrc *newsrc); -CamelNNTPNewsrc *camel_nntp_newsrc_read_for_server (const char *server); - -#endif /* _CAMEL_NNTP_NEWSRC_H_ */ - - diff --git a/camel/providers/nntp/camel-nntp-provider.c b/camel/providers/nntp/camel-nntp-provider.c deleted file mode 100644 index 76ac521ec6..0000000000 --- a/camel/providers/nntp/camel-nntp-provider.c +++ /dev/null @@ -1,110 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-nntp-provider.c: nntp provider registration code */ - -/* - * Authors : - * Chris Toshok <toshok@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "config.h" -#include "camel-nntp-store.h" -#include "camel-provider.h" -#include "camel-session.h" - -static void add_hash (guint *hash, char *s); -static guint nntp_url_hash (gconstpointer key); -static gint check_equal (char *s1, char *s2); -static gint nntp_url_equal (gconstpointer a, gconstpointer b); - -static CamelProvider news_provider = { - "nntp", - N_("USENET news"), - - N_("This is a provider for reading from and posting to" - "USENET newsgroups."), - - "news", - - CAMEL_PROVIDER_IS_REMOTE | CAMEL_PROVIDER_IS_STORAGE, - - CAMEL_URL_NEED_HOST | CAMEL_URL_ALLOW_USER | - CAMEL_URL_ALLOW_PASSWORD | CAMEL_URL_ALLOW_AUTH, - - { 0, 0 }, - - NULL -}; - -void -camel_provider_module_init (CamelSession *session) -{ - news_provider.object_types[CAMEL_PROVIDER_STORE] = - camel_nntp_store_get_type(); - - news_provider.service_cache = g_hash_table_new (nntp_url_hash, nntp_url_equal); - - camel_session_register_provider (session, &news_provider); -} - -static void -add_hash (guint *hash, char *s) -{ - if (s) - *hash ^= g_str_hash(s); -} - -static guint -nntp_url_hash (gconstpointer key) -{ - const CamelURL *u = (CamelURL *)key; - guint hash = 0; - - add_hash (&hash, u->user); - add_hash (&hash, u->host); - hash ^= u->port; - - return hash; -} - -static gint -check_equal (char *s1, char *s2) -{ - if (s1 == NULL) { - if (s2 == NULL) - return TRUE; - else - return FALSE; - } - - if (s2 == NULL) - return FALSE; - - return strcmp (s1, s2) == 0; -} - -static gint -nntp_url_equal (gconstpointer a, gconstpointer b) -{ - const CamelURL *u1 = a, *u2 = b; - - return check_equal (u1->user, u2->user) - && check_equal (u1->host, u2->host) - && u1->port == u2->port; -} diff --git a/camel/providers/nntp/camel-nntp-resp-codes.h b/camel/providers/nntp/camel-nntp-resp-codes.h deleted file mode 100644 index 8b9dc8ff6c..0000000000 --- a/camel/providers/nntp/camel-nntp-resp-codes.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-nntp-resp-codes.h : #defines for all the response codes we care about */ - -/* - * - * Copyright (C) 2000 Helix Code, Inc. <toshok@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef CAMEL_NNTP_RESP_CODES_H -#define CAMEL_NNTP_RESP_CODES_H 1 - -#define CAMEL_NNTP_OK(x) ((x) < 400) -#define CAMEL_NNTP_ERR(x) (!CAMEL_NNTP_OK(x) && (x) < 500) -#define CAMEL_NNTP_FAIL(x) (!CAMEL_NNTP_OK(x) && !CAMEL_NNTP_ERR(x)) - -#define NNTP_GREETING_POSTING_OK 200 -#define NNTP_GREETING_NO_POSTING 201 - -#define NNTP_GROUP_SELECTED 211 -#define NNTP_LIST_FOLLOWS 215 -#define NNTP_ARTICLE_FOLLOWS 220 -#define NNTP_HEAD_FOLLOWS 221 -#define NNTP_DATA_FOLLOWS 224 -#define NNTP_NEW_ARTICLE_LIST_FOLLOWS 230 -#define NNTP_NEW_GROUP_LIST_FOLLOWS 231 - -#define NNTP_NO_SUCH_GROUP 411 -#define NNTP_NO_SUCH_ARTICLE 430 - -/* authentication */ -#define NNTP_AUTH_ACCEPTED 281 -#define NNTP_AUTH_CONTINUE 381 -#define NNTP_AUTH_REQUIRED 480 -#define NNTP_AUTH_REJECTED 482 - -#define NNTP_PROTOCOL_ERROR 666 - -#endif /* CAMEL_NNTP_RESP_CODES_H */ diff --git a/camel/providers/nntp/camel-nntp-store.c b/camel/providers/nntp/camel-nntp-store.c deleted file mode 100644 index ff9e7a989a..0000000000 --- a/camel/providers/nntp/camel-nntp-store.c +++ /dev/null @@ -1,870 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-nntp-store.c : class for an nntp store */ - -/* - * - * Copyright (C) 2000 Helix Code, Inc. <toshok@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> - -#include <dirent.h> -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include "libgnome/libgnome.h" - -#include "camel-nntp-resp-codes.h" -#include "camel-folder-summary.h" -#include "camel-nntp-store.h" -#include "camel-nntp-grouplist.h" -#include "camel-nntp-folder.h" -#include "camel-nntp-auth.h" -#include "camel-exception.h" -#include "camel-url.h" -#include "string-utils.h" - -#include <gal/util/e-util.h> - -#define NNTP_PORT 119 - -#define DUMP_EXTENSIONS - -/* define if you want the subscribe ui to show folders in tree form */ -/* #define INFO_AS_TREE */ - -static CamelRemoteStoreClass *remote_store_class = NULL; - -static CamelServiceClass *service_class = NULL; - -/* Returns the class for a CamelNNTPStore */ -#define CNNTPS_CLASS(so) CAMEL_NNTP_STORE_CLASS (CAMEL_OBJECT_GET_CLASS(so)) -#define CF_CLASS(so) CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so)) -#define CNNTPF_CLASS(so) CAMEL_NNTP_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - -static gboolean ensure_news_dir_exists (CamelNNTPStore *store); - -static void -camel_nntp_store_get_extensions (CamelNNTPStore *store, CamelException *ex) -{ - store->extensions = 0; - - if (camel_nntp_command (store, ex, NULL, "LIST EXTENSIONS") == NNTP_LIST_FOLLOWS) { - gboolean done = FALSE; - CamelException ex; - - camel_exception_init (&ex); - - while (!done) { - char *line; - - if (camel_remote_store_recv_line (CAMEL_REMOTE_STORE (store), &line, &ex) < 0) - break; /* XXX */ - - if (*line == '.') { - done = TRUE; - } - else { -#define CHECK_EXT(name,val) if (!strcasecmp (line, (name))) store->extensions |= (val) - - CHECK_EXT ("SEARCH", CAMEL_NNTP_EXT_SEARCH); - CHECK_EXT ("SETGET", CAMEL_NNTP_EXT_SETGET); - CHECK_EXT ("OVER", CAMEL_NNTP_EXT_OVER); - CHECK_EXT ("XPATTEXT", CAMEL_NNTP_EXT_XPATTEXT); - CHECK_EXT ("XACTIVE", CAMEL_NNTP_EXT_XACTIVE); - CHECK_EXT ("LISTMOTD", CAMEL_NNTP_EXT_LISTMOTD); - CHECK_EXT ("LISTSUBSCR", CAMEL_NNTP_EXT_LISTSUBSCR); - CHECK_EXT ("LISTPNAMES", CAMEL_NNTP_EXT_LISTPNAMES); - -#undef CHECK_EXT - } - - g_free (line); - } - } - -#ifdef DUMP_EXTENSIONS - g_print ("NNTP Extensions:"); -#define DUMP_EXT(name,val) if (store->extensions & (val)) g_print (" %s", name); - DUMP_EXT ("SEARCH", CAMEL_NNTP_EXT_SEARCH); - DUMP_EXT ("SETGET", CAMEL_NNTP_EXT_SETGET); - DUMP_EXT ("OVER", CAMEL_NNTP_EXT_OVER); - DUMP_EXT ("XPATTEXT", CAMEL_NNTP_EXT_XPATTEXT); - DUMP_EXT ("XACTIVE", CAMEL_NNTP_EXT_XACTIVE); - DUMP_EXT ("LISTMOTD", CAMEL_NNTP_EXT_LISTMOTD); - DUMP_EXT ("LISTSUBSCR", CAMEL_NNTP_EXT_LISTSUBSCR); - DUMP_EXT ("LISTPNAMES", CAMEL_NNTP_EXT_LISTPNAMES); - g_print ("\n"); -#undef DUMP_EXT -#endif -} - -static void -camel_nntp_store_get_overview_fmt (CamelNNTPStore *store, CamelException *ex) -{ - int status; - int i; - gboolean done = FALSE; - - status = camel_nntp_command (store, ex, NULL, - "LIST OVERVIEW.FMT"); - - if (status != NNTP_LIST_FOLLOWS) { - if (store->extensions & CAMEL_NNTP_EXT_OVER) { - /* if we can't get the overview format, we should - disable OVER support */ - g_warning ("server reported support of OVER but LIST OVERVIEW.FMT failed." - " disabling OVER.\n"); - store->extensions &= ~CAMEL_NNTP_EXT_OVER; - return; - } - } - else { - if (!(store->extensions & CAMEL_NNTP_EXT_OVER)) { - g_warning ("server didn't report support of OVER but LIST OVERVIEW.FMT worked." - " enabling OVER.\n"); - store->extensions |= CAMEL_NNTP_EXT_OVER; - } - } - - /* start at 1 because the article number is always first */ - store->num_overview_fields = 1; - - for (i = 0; i < CAMEL_NNTP_OVER_LAST; i ++) { - store->overview_field [i].index = -1; - } - - while (!done) { - char *line; - - if (camel_remote_store_recv_line (CAMEL_REMOTE_STORE (store), &line, ex) < 0) - break; /* XXX */ - - if (*line == '.') { - done = TRUE; - } - else { - CamelNNTPOverField *over_field = NULL; - char *colon = NULL;; - - if (!strncasecmp (line, "From:", 5)) { - over_field = &store->overview_field [ CAMEL_NNTP_OVER_FROM ]; - over_field->index = store->num_overview_fields; - colon = line + 5; - } - else if (!strncasecmp (line, "Subject:", 7)) { - over_field = &store->overview_field [ CAMEL_NNTP_OVER_SUBJECT ]; - over_field->index = store->num_overview_fields; - colon = line + 7; - } - else if (!strncasecmp (line, "Date:", 5)) { - over_field = &store->overview_field [ CAMEL_NNTP_OVER_DATE ]; - over_field->index = store->num_overview_fields; - colon = line + 5; - } - else if (!strncasecmp (line, "Message-ID:", 11)) { - over_field = &store->overview_field [ CAMEL_NNTP_OVER_MESSAGE_ID ]; - over_field->index = store->num_overview_fields; - colon = line + 11; - } - else if (!strncasecmp (line, "References:", 11)) { - over_field = &store->overview_field [ CAMEL_NNTP_OVER_REFERENCES ]; - over_field->index = store->num_overview_fields; - colon = line + 11; - } - else if (!strncasecmp (line, "Bytes:", 6)) { - over_field = &store->overview_field [ CAMEL_NNTP_OVER_BYTES ]; - over_field->index = store->num_overview_fields; - colon = line + 11; - } - - if (colon && !strncmp (colon + 1, "full", 4)) - over_field->full = TRUE; - - store->num_overview_fields ++; - } - - g_free (line); - } - - for (i = 0; i < CAMEL_NNTP_OVER_LAST; i ++) { - if (store->overview_field [i].index == -1) { - g_warning ("server's OVERVIEW.FMT doesn't support minimum set we require," - " disabling OVER support.\n"); - store->extensions &= ~CAMEL_NNTP_EXT_OVER; - } - } -} - -static gboolean -nntp_store_connect (CamelService *service, CamelException *ex) -{ - char *buf; - int resp_code; - CamelNNTPStore *store = CAMEL_NNTP_STORE (service); - - if (!ensure_news_dir_exists(store)) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not open directory for news server: %s"), - strerror (errno)); - return FALSE; - } - - if (CAMEL_SERVICE_CLASS (remote_store_class)->connect (service, ex) == FALSE) - return FALSE; - - /* Read the greeting */ - if (camel_remote_store_recv_line (CAMEL_REMOTE_STORE (service), &buf, ex) < 0) { - return FALSE; - } - - /* check if posting is allowed. */ - resp_code = atoi (buf); - if (resp_code == NNTP_GREETING_POSTING_OK) { - g_print ("posting allowed\n"); - store->posting_allowed = TRUE; - } - else if (resp_code == NNTP_GREETING_NO_POSTING) { - g_print ("no posting allowed\n"); - store->posting_allowed = FALSE; - } - else { - g_warning ("unexpected server greeting code %d, no posting allowed\n", resp_code); - store->posting_allowed = FALSE; - } - - g_free (buf); - - /* get a list of extensions that the server supports */ - camel_nntp_store_get_extensions (store, ex); - - /* try to get the overview.fmt */ - camel_nntp_store_get_overview_fmt (store, ex); - - return TRUE; -} - -static gboolean -nntp_store_disconnect (CamelService *service, gboolean clean, CamelException *ex) -{ - CamelNNTPStore *store = CAMEL_NNTP_STORE (service); - - if (clean) - camel_nntp_command (store, ex, NULL, "QUIT"); - - if (store->newsrc) - camel_nntp_newsrc_write (store->newsrc); - - if (!service_class->disconnect (service, clean, ex)) - return FALSE; - - return TRUE; -} - -static char * -nntp_store_get_name (CamelService *service, gboolean brief) -{ - if (brief) - return g_strdup_printf ("%s", service->url->host); - else - return g_strdup_printf (_("USENET News via %s"), service->url->host); - -} - -static CamelServiceAuthType password_authtype = { - N_("Password"), - - N_("This option will authenticate with the NNTP server using a " - "plaintext password."), - - "", - TRUE -}; - -static GList * -nntp_store_query_auth_types_generic (CamelService *service, CamelException *ex) -{ - GList *prev; - - prev = CAMEL_SERVICE_CLASS (remote_store_class)->query_auth_types_generic (service, ex); - return g_list_prepend (prev, &password_authtype); -} - -static GList * -nntp_store_query_auth_types_connected (CamelService *service, CamelException *ex) -{ - g_warning ("nntp::query_auth_types_connected: not implemented. Defaulting."); - /* FIXME: use the classfunc instead of the local? */ - return nntp_store_query_auth_types_generic (service, ex); -} - -static CamelFolder * -nntp_store_get_folder (CamelStore *store, const gchar *folder_name, - guint32 flags, CamelException *ex) -{ - CamelNNTPStore *nntp_store = CAMEL_NNTP_STORE (store); - - printf ("get_folder called on folder_name=%s\n", folder_name); - - /* if we haven't already read our .newsrc, read it now */ - if (!nntp_store->newsrc) - nntp_store->newsrc = - camel_nntp_newsrc_read_for_server (CAMEL_SERVICE(store)->url->host); - - if (!nntp_store->newsrc) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - _("Unable to open or create .newsrc file for %s: %s"), - CAMEL_SERVICE(store)->url->host, - strerror(errno)); - return NULL; - } - - return camel_nntp_folder_new (store, folder_name, ex); -} - -#ifdef INFO_AS_TREE -static void -build_folder_info (CamelNNTPStore *nntp_store, CamelFolderInfo **root, - CamelFolderInfo *parent, CamelNNTPGroupListEntry *entry, - char *prefix, char *suffix, - GHashTable *name_to_info) -{ - CamelURL *url = CAMEL_SERVICE (nntp_store)->url; - char *dot; - if ((dot = strchr (suffix, '.'))) { - /* it's an internal node, figure out the next node in - the chain */ - CamelFolderInfo *node; - char *node_name, *node_full_name; - - node_name = g_malloc0 (dot - suffix + 1); - strncpy (node_name, suffix, dot - suffix); - node_full_name = g_strdup_printf ("%s.%s", prefix, node_name); - - node = g_hash_table_lookup (name_to_info, node_full_name); - if (!node) { - /* we need to add one */ - node = g_new0 (CamelFolderInfo, 1); - node->name = g_strdup (node_name); - node->full_name = g_strdup (node_full_name); - node->url = NULL; - node->message_count = -1; - node->unread_message_count = -1; - - if (parent) { - if (parent->child) { - node->sibling = parent->child; - parent->child = node; - } - else { - parent->child = node; - } - } - else { - if (*root) { - *root = node; - } - else { - node->sibling = *root; - *root = node; - } - } - - g_hash_table_insert (name_to_info, node_full_name, node); - } - - build_folder_info (nntp_store, root, node, entry, node_full_name, dot + 1, name_to_info); - } - else { - /* it's a leaf node, make the CamelFolderInfo and - append it to @parent's list of children. */ - CamelFolderInfo *new_group; - - new_group = g_new0 (CamelFolderInfo, 1); - new_group->name = g_strdup (entry->group_name); - new_group->full_name = g_strdup (entry->group_name); - new_group->url = g_strdup_printf ("nntp://%s%s%s/%s", - url->user ? url->user : "", - url->user ? "@" : "", - url->host, (char *)entry->group_name); - - new_group->message_count = entry->high - entry->low; - new_group->unread_message_count = (new_group->message_count - - camel_nntp_newsrc_get_num_articles_read (nntp_store->newsrc, entry->group_name)); - - if (parent) { - if (parent->child) { - new_group->sibling = parent->child; - parent->child = new_group; - } - else { - parent->child = new_group; - } - } - else { - if (*root) { - *root = new_group; - } - else { - new_group->sibling = *root; - *root = new_group; - } - } - } -} -#endif - -static CamelFolderInfo * -build_folder_info_from_grouplist (CamelNNTPStore *nntp_store, const char *top) -{ - GList *g; - CamelFolderInfo *groups = NULL; -#ifdef INFO_AS_TREE - GHashTable *hash = g_hash_table_new (g_str_hash, g_str_equal); -#else - CamelFolderInfo *last = NULL, *fi; - CamelURL *url = CAMEL_SERVICE (nntp_store)->url; -#endif - - for (g = nntp_store->group_list->group_list; g; g = g_list_next (g)) { - CamelNNTPGroupListEntry *entry = g->data; - - if (!top || !strncmp (top, entry->group_name, strlen (top))) { -#ifdef INFO_AS_TREE - build_folder_info (nntp_store, &groups, NULL, entry, - "", entry->group_name, hash); -#else - - fi = g_new0 (CamelFolderInfo, 1); - fi->name = g_strdup (entry->group_name); - fi->full_name = g_strdup (entry->group_name); - fi->url = g_strdup_printf ("nntp://%s%s%s/%s", - url->user ? url->user : "", - url->user ? "@" : "", - url->host, (char *)entry->group_name); - - fi->message_count = entry->high - entry->low; - fi->unread_message_count = (fi->message_count - - camel_nntp_newsrc_get_num_articles_read ( - nntp_store->newsrc, entry->group_name)); - - if (last) - last->sibling = fi; - else - groups = fi; - last = fi; -#endif - } - } - - return groups; -} - -static CamelFolderInfo * -nntp_store_get_folder_info (CamelStore *store, const char *top, - gboolean fast, gboolean recursive, - gboolean subscribed_only, - CamelException *ex) -{ - CamelURL *url = CAMEL_SERVICE (store)->url; - CamelNNTPStore *nntp_store = (CamelNNTPStore *)store; - GPtrArray *names; - CamelFolderInfo *groups = NULL, *last = NULL, *fi; - int i; - - /* if we haven't already read our .newsrc, read it now */ - if (!nntp_store->newsrc) - nntp_store->newsrc = - camel_nntp_newsrc_read_for_server (CAMEL_SERVICE(store)->url->host); - - if (!nntp_store->newsrc) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - _("Unable to open or create .newsrc file for %s: %s"), - CAMEL_SERVICE(store)->url->host, - strerror(errno)); - return NULL; - } - - if (!subscribed_only) { - if (!nntp_store->group_list) - nntp_store->group_list = camel_nntp_grouplist_fetch (nntp_store, ex); - if (camel_exception_is_set (ex)) { - return NULL; - } - else { - fi = build_folder_info_from_grouplist (nntp_store, top); - return fi; - } - } - - if (top == NULL) { - /* return the list of groups */ - names = camel_nntp_newsrc_get_subscribed_group_names (nntp_store->newsrc); - for (i = 0; i < names->len; i++) { - fi = g_new0 (CamelFolderInfo, 1); - fi->name = g_strdup (names->pdata[i]); - fi->full_name = g_strdup (names->pdata[i]); - fi->url = g_strdup_printf ("nntp://%s%s%s/%s", - url->user ? url->user : "", - url->user ? "@" : "", - url->host, (char *)names->pdata[i]); - /* FIXME */ - fi->message_count = fi->unread_message_count = -1; - - if (last) - last->sibling = fi; - else - groups = fi; - last = fi; - } - camel_nntp_newsrc_free_group_names (nntp_store->newsrc, names); - - return groups; - } - else { - /* getting a specific group */ - - fi = g_new0 (CamelFolderInfo, 1); - fi->name = g_strdup (top); - fi->full_name = g_strdup (top); - fi->url = g_strdup_printf ("nntp://%s/%s", url->host, top); - /* FIXME */ - fi->message_count = fi->unread_message_count = -1; - - return fi; - } -} - -static char * -nntp_store_get_root_folder_name (CamelStore *store, CamelException *ex) -{ - return g_strdup (""); -} - -static gboolean -nntp_store_folder_subscribed (CamelStore *store, const char *folder_name) -{ - CamelNNTPStore *nntp_store = CAMEL_NNTP_STORE (store); - - return camel_nntp_newsrc_group_is_subscribed (nntp_store->newsrc, folder_name); -} - -static void -nntp_store_subscribe_folder (CamelStore *store, const char *folder_name, - CamelException *ex) -{ - CamelNNTPStore *nntp_store = CAMEL_NNTP_STORE (store); - - camel_nntp_newsrc_subscribe_group (nntp_store->newsrc, folder_name); -} - -static void -nntp_store_unsubscribe_folder (CamelStore *store, const char *folder_name, - CamelException *ex) -{ - CamelNNTPStore *nntp_store = CAMEL_NNTP_STORE (store); - - camel_nntp_newsrc_unsubscribe_group (nntp_store->newsrc, folder_name); -} - -static void -finalize (CamelObject *object) -{ - CamelNNTPStore *nntp_store = CAMEL_NNTP_STORE (object); - if (nntp_store->newsrc) - camel_nntp_newsrc_write (nntp_store->newsrc); -} - -static void -camel_nntp_store_class_init (CamelNNTPStoreClass *camel_nntp_store_class) -{ - CamelStoreClass *camel_store_class = CAMEL_STORE_CLASS (camel_nntp_store_class); - CamelServiceClass *camel_service_class = CAMEL_SERVICE_CLASS (camel_nntp_store_class); - - remote_store_class = CAMEL_REMOTE_STORE_CLASS(camel_type_get_global_classfuncs - (camel_remote_store_get_type ())); - - service_class = CAMEL_SERVICE_CLASS (camel_type_get_global_classfuncs (camel_service_get_type ())); - - /* virtual method overload */ - camel_service_class->connect = nntp_store_connect; - camel_service_class->disconnect = nntp_store_disconnect; - camel_service_class->query_auth_types_generic = nntp_store_query_auth_types_generic; - camel_service_class->query_auth_types_connected = nntp_store_query_auth_types_connected; - camel_service_class->get_name = nntp_store_get_name; - - camel_store_class->get_folder = nntp_store_get_folder; - camel_store_class->get_root_folder_name = nntp_store_get_root_folder_name; - camel_store_class->get_folder_info = nntp_store_get_folder_info; - camel_store_class->free_folder_info = camel_store_free_folder_info_full; - - camel_store_class->folder_subscribed = nntp_store_folder_subscribed; - camel_store_class->subscribe_folder = nntp_store_subscribe_folder; - camel_store_class->unsubscribe_folder = nntp_store_unsubscribe_folder; -} - - - -static void -camel_nntp_store_init (gpointer object, gpointer klass) -{ - CamelRemoteStore *remote_store = CAMEL_REMOTE_STORE (object); - CamelStore *store = CAMEL_STORE (object); - - remote_store->default_port = NNTP_PORT; - - store->flags = CAMEL_STORE_SUBSCRIPTIONS; -} - -CamelType -camel_nntp_store_get_type (void) -{ - static CamelType camel_nntp_store_type = CAMEL_INVALID_TYPE; - - if (camel_nntp_store_type == CAMEL_INVALID_TYPE) { - camel_nntp_store_type = camel_type_register (CAMEL_REMOTE_STORE_TYPE, "CamelNNTPStore", - sizeof (CamelNNTPStore), - sizeof (CamelNNTPStoreClass), - (CamelObjectClassInitFunc) camel_nntp_store_class_init, - NULL, - (CamelObjectInitFunc) camel_nntp_store_init, - (CamelObjectFinalizeFunc) finalize); - } - - return camel_nntp_store_type; -} - - -/** - * camel_nntp_command: Send a command to a NNTP server. - * @store: the NNTP store - * @ret: a pointer to return the full server response in - * @fmt: a printf-style format string, followed by arguments - * - * This command sends the command specified by @fmt and the following - * arguments to the connected NNTP store specified by @store. It then - * reads the server's response and parses out the status code. If - * the caller passed a non-NULL pointer for @ret, camel_nntp_command - * will set it to point to an buffer containing the rest of the - * response from the NNTP server. (If @ret was passed but there was - * no extended response, @ret will be set to NULL.) The caller must - * free this buffer when it is done with it. - * - * Return value: the response code of the nntp command. - **/ -static int -camel_nntp_command_send_recv (CamelNNTPStore *store, CamelException *ex, char **ret, char *cmd) -{ - char *respbuf; - int resp_code; - gboolean again; - - do { - again = FALSE; - - /* Send the command */ - if (camel_remote_store_send_string (CAMEL_REMOTE_STORE (store), ex, cmd) < 0) { - return NNTP_PROTOCOL_ERROR; - } - - /* Read the response */ - if (camel_remote_store_recv_line (CAMEL_REMOTE_STORE (store), &respbuf, ex) < 0) { - if (ret) - *ret = g_strdup (g_strerror (errno)); - return NNTP_PROTOCOL_ERROR; - } - - resp_code = atoi (respbuf); - - /* this is kind of a gross hack, but since an auth challenge - can pop up at any time, and we want to shield this from our - callers, we handle authentication here. */ - if (resp_code == NNTP_AUTH_REQUIRED) { - resp_code = camel_nntp_auth_authenticate (store, ex); - if (resp_code != NNTP_AUTH_ACCEPTED) { - return resp_code; - } - - /* need to resend our command here */ - again = TRUE; - } - } while (again); - - if (ret) { - *ret = strchr (respbuf, ' '); - if (*ret) - *ret = g_strdup (*ret + 1); - } - g_free (respbuf); - - return resp_code; -} - -int -camel_nntp_command (CamelNNTPStore *store, CamelException *ex, char **ret, char *fmt, ...) -{ - char *cmdbuf; - va_list ap; - int resp_code; - char *real_fmt; - - real_fmt = g_strdup_printf ("%s\r\n", fmt); - - va_start (ap, fmt); - cmdbuf = g_strdup_vprintf (real_fmt, ap); - va_end (ap); - - g_free (real_fmt); - - resp_code = camel_nntp_command_send_recv (store, ex, ret, cmdbuf); - - g_free (cmdbuf); - - return resp_code; -} - -void -camel_nntp_store_subscribe_group (CamelStore *store, - const gchar *group_name) -{ - gchar *root_dir = camel_nntp_store_get_toplevel_dir(CAMEL_NNTP_STORE(store)); - char *ret = NULL; - CamelException *ex = camel_exception_new(); - - if (camel_exception_get_id (ex)) { - g_free (root_dir); - camel_exception_free (ex); - return; - } - - if (camel_nntp_command ( CAMEL_NNTP_STORE (store), - ex, &ret, "GROUP %s", group_name) == NNTP_GROUP_SELECTED) { - /* we create an empty summary file here, so that when - the group is opened we'll know we need to build it. */ - gchar *summary_file; - int fd; - summary_file = g_strdup_printf ("%s/%s-ev-summary", root_dir, group_name); - - fd = open (summary_file, O_CREAT | O_RDWR, 0666); - close (fd); - - g_free (summary_file); - } - if (ret) g_free (ret); - - g_free (root_dir); - camel_exception_free (ex); -} - -void -camel_nntp_store_unsubscribe_group (CamelStore *store, - const gchar *group_name) -{ - gchar *root_dir = camel_nntp_store_get_toplevel_dir(CAMEL_NNTP_STORE(store)); - gchar *summary_file; - - summary_file = g_strdup_printf ("%s/%s-ev-summary", root_dir, group_name); - if (g_file_exists (summary_file)) - unlink (summary_file); - g_free (summary_file); - - g_free (root_dir); -} - -GList * -camel_nntp_store_list_subscribed_groups(CamelStore *store) -{ - GList *group_name_list = NULL; - struct stat stat_buf; - gint stat_error = 0; - gchar *entry_name; - gchar *full_entry_name; - gchar *real_group_name; - struct dirent *dir_entry; - DIR *dir_handle; - gchar *root_dir = camel_nntp_store_get_toplevel_dir(CAMEL_NNTP_STORE(store)); - - dir_handle = opendir (root_dir); - g_return_val_if_fail (dir_handle, NULL); - - /* read the first entry in the directory */ - dir_entry = readdir (dir_handle); - while ((stat_error != -1) && (dir_entry != NULL)) { - - /* get the name of the next entry in the dir */ - entry_name = dir_entry->d_name; - full_entry_name = g_strdup_printf ("%s/%s", root_dir, entry_name); - stat_error = stat (full_entry_name, &stat_buf); - g_free (full_entry_name); - - /* is it a normal file ending in -ev-summary ? */ - if ((stat_error != -1) && S_ISREG (stat_buf.st_mode)) { - gboolean summary_suffix_found; - - real_group_name = string_prefix (entry_name, "-ev-summary", - &summary_suffix_found); - - if (summary_suffix_found) - /* add the folder name to the list */ - group_name_list = g_list_append (group_name_list, - real_group_name); - } - /* read next entry */ - dir_entry = readdir (dir_handle); - } - - closedir (dir_handle); - - return group_name_list; -} - -gchar * -camel_nntp_store_get_toplevel_dir (CamelNNTPStore *store) -{ - CamelURL *url = CAMEL_SERVICE (store)->url; - char *top_dir; - - g_assert(url != NULL); - - top_dir = g_strdup_printf( "%s/evolution/news/%s", - g_get_home_dir (), - url->host ); - - return top_dir; -} - -static gboolean -ensure_news_dir_exists (CamelNNTPStore *store) -{ - gchar *dir = camel_nntp_store_get_toplevel_dir (store); - - if (access (dir, F_OK) == 0) { - g_free (dir); - return TRUE; - } - - if (e_mkdir_hier (dir, S_IRWXU) == -1) { - g_free (dir); - return FALSE; - } - - return TRUE; -} diff --git a/camel/providers/nntp/camel-nntp-store.h b/camel/providers/nntp/camel-nntp-store.h deleted file mode 100644 index 0566967fd7..0000000000 --- a/camel/providers/nntp/camel-nntp-store.h +++ /dev/null @@ -1,113 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-nntp-store.h : class for an nntp store */ - -/* - * - * Copyright (C) 2000 Helix Code, Inc. <toshok@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_NNTP_STORE_H -#define CAMEL_NNTP_STORE_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include "camel-remote-store.h" -#include "camel-nntp-newsrc.h" -#include "camel-nntp-types.h" - -#define CAMEL_NNTP_STORE_TYPE (camel_nntp_store_get_type ()) -#define CAMEL_NNTP_STORE(obj) (CAMEL_CHECK_CAST((obj), CAMEL_NNTP_STORE_TYPE, CamelNNTPStore)) -#define CAMEL_NNTP_STORE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_NNTP_STORE_TYPE, CamelNNTPStoreClass)) -#define IS_CAMEL_NNTP_STORE(o) (CAMEL_CHECK_TYPE((o), CAMEL_NNTP_STORE_TYPE)) - - -enum { - CAMEL_NNTP_OVER_FROM, - CAMEL_NNTP_OVER_SUBJECT, - CAMEL_NNTP_OVER_DATE, - CAMEL_NNTP_OVER_MESSAGE_ID, - CAMEL_NNTP_OVER_REFERENCES, - CAMEL_NNTP_OVER_BYTES, - - CAMEL_NNTP_OVER_LAST -}; - -struct CamelNNTPOverField { - int index; - gboolean full; /* full in the OVER sense - the field name - precedes the ':' in the XOVER list. */ -}; - -struct CamelNNTPStore { - CamelRemoteStore parent_object; - -#define CAMEL_NNTP_EXT_SEARCH (1<<0) -#define CAMEL_NNTP_EXT_SETGET (1<<1) -#define CAMEL_NNTP_EXT_OVER (1<<2) -#define CAMEL_NNTP_EXT_XPATTEXT (1<<3) -#define CAMEL_NNTP_EXT_XACTIVE (1<<4) -#define CAMEL_NNTP_EXT_LISTMOTD (1<<5) -#define CAMEL_NNTP_EXT_LISTSUBSCR (1<<6) -#define CAMEL_NNTP_EXT_LISTPNAMES (1<<7) - guint32 extensions; - - gboolean posting_allowed; - - int num_overview_fields; - CamelNNTPOverField overview_field[ CAMEL_NNTP_OVER_LAST ]; - - CamelNNTPNewsrc *newsrc; - CamelNNTPGroupList *group_list; - -}; - -struct CamelNNTPStoreClass { - CamelRemoteStoreClass parent_class; - -}; - - -/* public methods */ -void camel_nntp_store_open (CamelNNTPStore *store, CamelException *ex); -void camel_nntp_store_close (CamelNNTPStore *store, gboolean expunge, - CamelException *ex); - -void camel_nntp_store_subscribe_group (CamelStore *store, const gchar *group_name); -void camel_nntp_store_unsubscribe_group (CamelStore *store, const gchar *group_name); -GList *camel_nntp_store_list_subscribed_groups(CamelStore *store); - -gchar *camel_nntp_store_get_toplevel_dir (CamelNNTPStore *store); - -/* support functions */ -int camel_nntp_command (CamelNNTPStore *store, CamelException *ex, char **ret, char *fmt, ...); - -/* Standard Camel function */ -CamelType camel_nntp_store_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_NNTP_STORE_H */ - - diff --git a/camel/providers/nntp/camel-nntp-types.h b/camel/providers/nntp/camel-nntp-types.h deleted file mode 100644 index b1d91779b1..0000000000 --- a/camel/providers/nntp/camel-nntp-types.h +++ /dev/null @@ -1,34 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-nntp-grouplist.h : getting/updating the list of newsgroups on the server. */ - -/* - * Author : Chris Toshok <toshok@helixcode.com> - * - * Copyright (C) 2000 Helix Code . - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef CAMEL_NNTP_TYPES_H -#define CAMEL_NNTP_TYPES_H 1 - -typedef struct CamelNNTPGroupList CamelNNTPGroupList; -typedef struct CamelNNTPGroupListEntry CamelNNTPGroupListEntry; -typedef struct CamelNNTPOverField CamelNNTPOverField; -typedef struct CamelNNTPStore CamelNNTPStore; -typedef struct CamelNNTPStoreClass CamelNNTPStoreClass; - -#endif /* CAMEL_NNTP_TYPES_H */ diff --git a/camel/providers/nntp/camel-nntp-utils.c b/camel/providers/nntp/camel-nntp-utils.c deleted file mode 100644 index e8ee9bb112..0000000000 --- a/camel/providers/nntp/camel-nntp-utils.c +++ /dev/null @@ -1,249 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-nntp-utils.c : utilities used by the nntp code. */ - -/* - * Author : Chris Toshok <toshok@helixcode.com> - * - * Copyright (C) 2000 Helix Code . - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "camel-folder-summary.h" -#include "camel-nntp-resp-codes.h" -#include "camel-nntp-folder.h" -#include "camel-nntp-store.h" -#include "camel-nntp-utils.h" -#include "camel-stream-mem.h" -#include "camel-exception.h" - -#include <stdlib.h> -#include <string.h> - -static void -get_XOVER_headers(CamelNNTPStore *nntp_store, CamelFolder *folder, - int first_message, int last_message, CamelException *ex) -{ - int status; - CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder); - - status = camel_nntp_command (nntp_store, ex, NULL, - "XOVER %d-%d", - first_message, - last_message); - - if (status == NNTP_DATA_FOLLOWS) { - gboolean done = FALSE; - - while (!done) { - char *line; - - if (camel_remote_store_recv_line (CAMEL_REMOTE_STORE (nntp_store), &line, ex) < 0) { - g_warning ("failed to recv_line while building OVER header list\n"); - break; - } - - if (*line == '.') { - done = TRUE; - g_print ("done\n"); - } - else { - CamelMessageInfo *new_info = g_new0(CamelMessageInfo, 1); - char **split_line = g_strsplit (line, "\t", 7); - char *subject, *from, *date, *message_id, *bytes; - - subject = split_line [nntp_store->overview_field [CAMEL_NNTP_OVER_SUBJECT].index]; - from = split_line [nntp_store->overview_field [CAMEL_NNTP_OVER_FROM].index]; - date = split_line [nntp_store->overview_field [CAMEL_NNTP_OVER_DATE].index]; - message_id = split_line [nntp_store->overview_field [CAMEL_NNTP_OVER_MESSAGE_ID].index]; - bytes = split_line [nntp_store->overview_field [CAMEL_NNTP_OVER_BYTES].index]; - - /* if the overview format flagged this - field as "full", skip over the - preceding field name and colon */ - if (nntp_store->overview_field [ CAMEL_NNTP_OVER_SUBJECT ].full) - subject += strlen ("Subject:"); - if (nntp_store->overview_field [ CAMEL_NNTP_OVER_FROM ].full) - from += strlen ("From:"); - if (nntp_store->overview_field [ CAMEL_NNTP_OVER_DATE ].full) - date += strlen ("Date:"); - if (nntp_store->overview_field [ CAMEL_NNTP_OVER_MESSAGE_ID ].full) - message_id += strlen ("Message-ID:"); - if (nntp_store->overview_field [ CAMEL_NNTP_OVER_BYTES ].full) - bytes += strlen ("Bytes:"); - - new_info->subject = g_strdup(subject); - new_info->from = g_strdup(from); - new_info->to = g_strdup(folder->name); - new_info->date_sent = header_decode_date(date, NULL); -#if 0 - /* XXX do we need to fill in both dates? */ - new_info->headers.date_received = g_strdup(date); -#endif - new_info->size = atoi(bytes); - new_info->uid = g_strdup_printf ("%s,%s", split_line[0], message_id); - new_info->message_id = g_strdup(message_id); - - if (camel_nntp_newsrc_article_is_read (nntp_store->newsrc, - folder->name, - atoi (split_line[0]))) - new_info->flags |= CAMEL_MESSAGE_SEEN; - - camel_folder_summary_add (nntp_folder->summary, new_info); - g_strfreev (split_line); - } - g_free (line); - } - } - else { - /* XXX */ - g_warning ("weird nntp response for XOVER: %d\n", status); - } -} - -#if 0 -static GArray* -get_HEAD_headers(CamelNNTPStore *nntp_store, CamelFolder *folder, - int first_message, int last_message, CamelException *ex) -{ - int i; - int status; - - for (i = first_message; i < last_message; i ++) { - status = camel_nntp_command (nntp_store, ex, NULL, - "HEAD %d", i); - - if (status == NNTP_HEAD_FOLLOWS) { - gboolean done = FALSE; - char *buf; - int buf_len; - int buf_alloc; - int h; - CamelStream *header_stream; - GArray *header_array; - CamelStream *nntp_istream; - CamelMessageInfo *new_info = g_new0(CamelMessageInfo, 1); - - buf_alloc = 2048; - buf_len = 0; - buf = g_malloc(buf_alloc); - done = FALSE; - - buf[0] = 0; - - nntp_istream = nntp_store->istream; - - while (!done) { - char *line; - int line_length; - - line = camel_stream_buffer_read_line ( - CAMEL_STREAM_BUFFER ( nntp_istream )); - line_length = strlen ( line ); - - if (*line == '.') { - done = TRUE; - } - else { - if (buf_len + line_length > buf_alloc) { - buf_alloc *= 2; - buf = g_realloc (buf, buf_alloc); - } - strcat(buf, line); - strcat(buf, "\n"); - buf_len += strlen(line); - g_free (line); - } - } - - /* create a stream from which to parse the headers */ - header_stream = camel_stream_mem_new_with_buffer(buf, - buf_len, - CAMEL_STREAM_MEM_READ); - - header_array = get_header_array_from_stream (header_stream); - - memset (&info, 0, sizeof(info)); - - for (h = 0; h < header_array->len; h ++) { - Rfc822Header *header = &((Rfc822Header*)header_array->data)[h]; - if (!g_strcasecmp(header->name, "From")) - new_info->from = g_strdup(header->value); - else if (!g_strcasecmp(header->name, "To")) - new_info->to = g_strdup(header->value); - else if (!g_strcasecmp(header->name, "Subject")) - new_info->subject = g_strdup(header->value); - else if (!g_strcasecmp(header->name, "Message-ID")) { - new_info->uid = g_strdup_printf("%d,%s", i, header->value); - new_info->message_id = g_strdup(header->value); - } - else if (!g_strcasecmp(header->name, "Date")) { - new_info->date_sent = header_decode_date (header->value); -#if 0 - new_info->date_sent = g_strdup(header->value); - new_info->date_received = g_strdup(header->value); -#endif - } - } - - camel_folder_summary_add (nntp_folder->summary, new_info); - } - else if (status == CAMEL_NNTP_FAIL) { - /* nasty things are afoot */ - g_warning ("failure doing HEAD\n"); - break; - } - } -} -#endif - -void -camel_nntp_get_headers (CamelStore *store, - CamelNNTPFolder *nntp_folder, - CamelException *ex) -{ - CamelNNTPStore *nntp_store = CAMEL_NNTP_STORE (store); - CamelFolder *folder = CAMEL_FOLDER (nntp_folder); - char *ret; - int first_message, nb_message, last_message; - int status; - - status = camel_nntp_command (nntp_store, ex, &ret, - "GROUP %s", folder->name); - - sscanf (ret, "%d %d %d", &nb_message, &first_message, &last_message); - g_free (ret); - - if (status == NNTP_NO_SUCH_GROUP) { - /* XXX throw invalid group exception */ - camel_exception_setv (ex, - CAMEL_EXCEPTION_FOLDER_INVALID, - "group %s not found on server", - folder->name); - return; - } - - - if (nntp_store->extensions & CAMEL_NNTP_EXT_OVER) { - get_XOVER_headers (nntp_store, folder, first_message, last_message, ex); - } - else { - g_warning ("need to fix get_HEAD_headers\n"); -#if 0 - get_HEAD_headers (nntp_store, folder, first_message, last_message, ex); -#endif - } -} diff --git a/camel/providers/nntp/camel-nntp-utils.h b/camel/providers/nntp/camel-nntp-utils.h deleted file mode 100644 index f28697c744..0000000000 --- a/camel/providers/nntp/camel-nntp-utils.h +++ /dev/null @@ -1,42 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-nntp-utils.h : Utilities for the NNTP provider */ - -/* - * - * Author : Chris Toshok <toshok@helixcode.com> - * - * Copyright (C) 1999 Helix Code . - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_NNTP_UTILS_H -#define CAMEL_NNTP_UTILS_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -void camel_nntp_get_headers (CamelStore *store, CamelNNTPFolder *nntp_folder, CamelException *ex); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_NNTP_UTILS_H */ diff --git a/camel/providers/nntp/libcamelnntp.urls b/camel/providers/nntp/libcamelnntp.urls deleted file mode 100644 index dee2e70f14..0000000000 --- a/camel/providers/nntp/libcamelnntp.urls +++ /dev/null @@ -1,2 +0,0 @@ -news -nntp diff --git a/camel/providers/nntp/test-newsrc.c b/camel/providers/nntp/test-newsrc.c deleted file mode 100644 index c4b985e565..0000000000 --- a/camel/providers/nntp/test-newsrc.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> -#include <glib.h> -#include "camel-nntp-newsrc.h" - -int -main(int argc, char *argv[]) -{ - CamelNNTPNewsrc *newsrc = camel_nntp_newsrc_read_for_server (argv[1]); - camel_nntp_newsrc_write_to_file (newsrc, stdout); -} diff --git a/camel/providers/pop3/.cvsignore b/camel/providers/pop3/.cvsignore deleted file mode 100644 index 7d926a5545..0000000000 --- a/camel/providers/pop3/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -Makefile -Makefile.in -.libs -.deps -*.lo -*.la diff --git a/camel/providers/pop3/Makefile.am b/camel/providers/pop3/Makefile.am deleted file mode 100644 index 608e640cd9..0000000000 --- a/camel/providers/pop3/Makefile.am +++ /dev/null @@ -1,36 +0,0 @@ -## Process this file with automake to produce Makefile.in - -libcamelpop3includedir = $(includedir)/camel - -providerdir = $(pkglibdir)/camel-providers/$(VERSION) - -provider_LTLIBRARIES = libcamelpop3.la -provider_DATA = libcamelpop3.urls - -INCLUDES = \ - -I.. \ - -I$(srcdir)/.. \ - -I$(srcdir)/../../.. \ - -I$(includedir) \ - -I$(top_srcdir)/intl \ - -I$(top_srcdir)/camel \ - -I$(top_srcdir)/e-util \ - $(KRB4_CFLAGS) \ - $(GTK_INCLUDEDIR) \ - -DG_LOG_DOMAIN=\"camel-pop3-provider\" - -libcamelpop3_la_SOURCES = \ - camel-pop3-folder.c \ - camel-pop3-provider.c \ - camel-pop3-store.c - -libcamelpop3include_HEADERS = \ - camel-pop3-folder.h \ - camel-pop3-store.h - - -libcamelpop3_la_LDFLAGS = $(KRB4_LDFLAGS) -version-info 0:0:0 - -libcamelpop3_la_LIBADD = $(top_builddir)/e-util/libeutil.la $(UNICODE_LIBS) - -EXTRA_DIST = libcamelpop3.urls diff --git a/camel/providers/pop3/camel-pop3-folder.c b/camel/providers/pop3/camel-pop3-folder.c deleted file mode 100644 index 5cc0609e01..0000000000 --- a/camel/providers/pop3/camel-pop3-folder.c +++ /dev/null @@ -1,332 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-pop3-folder.c : class for a pop3 folder */ - -/* - * Authors: - * Dan Winship <danw@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "camel-pop3-folder.h" -#include "camel-pop3-store.h" -#include "camel-exception.h" -#include "camel-stream-mem.h" -#include "camel-stream-filter.h" -#include "camel-mime-message.h" - -#include <stdlib.h> -#include <string.h> - -#define CF_CLASS(o) (CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(o))) -static CamelFolderClass *parent_class; - -static void pop3_finalize (CamelObject *object); - -static void pop3_refresh_info (CamelFolder *folder, CamelException *ex); -static void pop3_sync (CamelFolder *folder, gboolean expunge, - CamelException *ex); - -static gint pop3_get_message_count (CamelFolder *folder); -static GPtrArray *pop3_get_uids (CamelFolder *folder); -static CamelMimeMessage *pop3_get_message (CamelFolder *folder, - const char *uid, - CamelException *ex); -static void pop3_set_message_flags (CamelFolder *folder, const char *uid, - guint32 flags, guint32 set); - -static GPtrArray *parse_listing (int count, char *data); - -static void -camel_pop3_folder_class_init (CamelPop3FolderClass *camel_pop3_folder_class) -{ - CamelFolderClass *camel_folder_class = - CAMEL_FOLDER_CLASS (camel_pop3_folder_class); - - parent_class = CAMEL_FOLDER_CLASS(camel_type_get_global_classfuncs (camel_folder_get_type ())); - - /* virtual method overload */ - camel_folder_class->refresh_info = pop3_refresh_info; - camel_folder_class->sync = pop3_sync; - - camel_folder_class->get_message_count = pop3_get_message_count; - camel_folder_class->get_uids = pop3_get_uids; - camel_folder_class->free_uids = camel_folder_free_nop; - - camel_folder_class->get_message = pop3_get_message; - camel_folder_class->set_message_flags = pop3_set_message_flags; -} - -static void -camel_pop3_folder_init (gpointer object) -{ - CamelFolder *folder = CAMEL_FOLDER (object); - CamelPop3Folder *pop3_folder = CAMEL_POP3_FOLDER (object); - - folder->has_summary_capability = FALSE; - folder->has_search_capability = FALSE; - - pop3_folder->uids = NULL; - pop3_folder->flags = NULL; -} - -CamelType -camel_pop3_folder_get_type (void) -{ - static CamelType camel_pop3_folder_type = CAMEL_INVALID_TYPE; - - if (!camel_pop3_folder_type) { - camel_pop3_folder_type = camel_type_register (CAMEL_FOLDER_TYPE, "CamelPop3Folder", - sizeof (CamelPop3Folder), - sizeof (CamelPop3FolderClass), - (CamelObjectClassInitFunc) camel_pop3_folder_class_init, - NULL, - (CamelObjectInitFunc) camel_pop3_folder_init, - (CamelObjectFinalizeFunc) pop3_finalize); - } - - return camel_pop3_folder_type; -} - -void -pop3_finalize (CamelObject *object) -{ - CamelPop3Folder *pop3_folder = CAMEL_POP3_FOLDER (object); - - camel_folder_free_deep (NULL, pop3_folder->uids); - g_free (pop3_folder->flags); -} - -CamelFolder * -camel_pop3_folder_new (CamelStore *parent, CamelException *ex) -{ - CamelFolder *folder; - - folder = CAMEL_FOLDER (camel_object_new (CAMEL_POP3_FOLDER_TYPE)); - camel_folder_construct (folder, parent, "inbox", "inbox"); - - camel_folder_refresh_info (folder, ex); - if (camel_exception_is_set (ex)) { - camel_object_unref (CAMEL_OBJECT (folder)); - folder = NULL; - } - - return folder; -} - -static void -pop3_refresh_info (CamelFolder *folder, CamelException *ex) -{ - GPtrArray *uids; - int status, count; - char *data; - CamelPop3Folder *pop3_folder = (CamelPop3Folder *) folder; - CamelPop3Store *pop3_store = CAMEL_POP3_STORE (folder->parent_store); - - status = camel_pop3_command (pop3_store, &data, ex, "STAT"); - if (status != CAMEL_POP3_OK) - return; - - count = atoi (data); - g_free (data); - - if (pop3_store->supports_uidl != FALSE) { - status = camel_pop3_command (pop3_store, NULL, ex, "UIDL"); - switch (status) { - case CAMEL_POP3_ERR: - pop3_store->supports_uidl = FALSE; - break; - case CAMEL_POP3_FAIL: - return; - } - } - - if (pop3_store->supports_uidl == FALSE) { - int i; - - uids = g_ptr_array_new (); - g_ptr_array_set_size (uids, count); - - for (i = 0; i < count; i++) - uids->pdata[i] = g_strdup_printf ("%d", i + 1); - } else { - data = camel_pop3_command_get_additional_data (pop3_store, ex); - if (camel_exception_is_set (ex)) - return; - - uids = parse_listing (count, data); - g_free (data); - - if (!uids) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not open folder: " - "message listing was " - "incomplete.")); - return; - } - } - - pop3_folder->uids = uids; - pop3_folder->flags = g_new0 (guint32, uids->len); -} - -static void -pop3_sync (CamelFolder *folder, gboolean expunge, CamelException *ex) -{ - CamelPop3Folder *pop3_folder; - CamelPop3Store *pop3_store; - int i, status; - char *resp; - - if (!expunge) - return; - - pop3_folder = CAMEL_POP3_FOLDER (folder); - pop3_store = CAMEL_POP3_STORE (folder->parent_store); - - for (i = 0; i < pop3_folder->uids->len; i++) { - if (pop3_folder->flags[i] & CAMEL_MESSAGE_DELETED) { - status = camel_pop3_command (pop3_store, &resp, ex, - "DELE %d", i + 1); - if (status != CAMEL_POP3_OK) - return; - } - } - - camel_pop3_store_expunge (pop3_store, ex); -} - - -static GPtrArray * -parse_listing (int count, char *data) -{ - GPtrArray *ans; - char *p; - int index, len; - - ans = g_ptr_array_new (); - g_ptr_array_set_size (ans, count); - - p = data; - while (*p) { - index = strtoul (p, &p, 10); - len = strcspn (p, "\n"); - if (index <= count && *p == ' ') - ans->pdata[index - 1] = g_strndup (p + 1, len - 1); - p += len; - if (*p == '\n') - p++; - } - - for (index = 0; index < count; index++) { - if (ans->pdata[index] == NULL) { - g_ptr_array_free (ans, TRUE); - return NULL; - } - } - - return ans; -} - -static int -uid_to_number (CamelPop3Folder *pop3_folder, const char *uid) -{ - int i; - - for (i = 0; i < pop3_folder->uids->len; i++) { - if (!strcmp (uid, pop3_folder->uids->pdata[i])) - return i + 1; - } - - return -1; -} - - -static CamelMimeMessage * -pop3_get_message (CamelFolder *folder, const char *uid, CamelException *ex) -{ - int status, num; - char *result, *body; - CamelStream *msgstream; - CamelMimeMessage *msg; - - num = uid_to_number (CAMEL_POP3_FOLDER (folder), uid); - if (num == -1) { - camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID, - _("No message with uid %s"), uid); - return NULL; - } - - status = camel_pop3_command (CAMEL_POP3_STORE (folder->parent_store), - &result, ex, "RETR %d", num); - if (status != CAMEL_POP3_OK) - return NULL; - g_free (result); - - body = camel_pop3_command_get_additional_data (CAMEL_POP3_STORE (folder->parent_store), ex); - if (!body) { - CamelService *service = CAMEL_SERVICE (folder->parent_store); - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - _("Could not retrieve message from POP " - "server %s: %s"), service->url->host, - camel_exception_get_description (ex)); - return NULL; - } - - msgstream = camel_stream_mem_new_with_buffer (body, strlen (body)); - g_free (body); - - msg = camel_mime_message_new (); - camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (msg), - CAMEL_STREAM (msgstream)); - - camel_object_unref (CAMEL_OBJECT (msgstream)); - - return msg; -} - -static void -pop3_set_message_flags (CamelFolder *folder, const char *uid, - guint32 flags, guint32 set) -{ - CamelPop3Folder *pop3_folder = CAMEL_POP3_FOLDER (folder); - int num; - - num = uid_to_number (pop3_folder, uid); - if (num == -1) - return; - - pop3_folder->flags[num - 1] = - (pop3_folder->flags[num] & ~flags) | (set & flags); -} - -static gint -pop3_get_message_count (CamelFolder *folder) -{ - CamelPop3Folder *pop3_folder = CAMEL_POP3_FOLDER (folder); - - return pop3_folder->uids->len; -} - -static GPtrArray * -pop3_get_uids (CamelFolder *folder) -{ - CamelPop3Folder *pop3_folder = CAMEL_POP3_FOLDER (folder); - - return pop3_folder->uids; -} diff --git a/camel/providers/pop3/camel-pop3-folder.h b/camel/providers/pop3/camel-pop3-folder.h deleted file mode 100644 index b4cfd469b6..0000000000 --- a/camel/providers/pop3/camel-pop3-folder.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-pop3-folder.h : Class for a POP3 folder */ - -/* - * Author: - * Dan Winship <danw@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_POP3_FOLDER_H -#define CAMEL_POP3_FOLDER_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include "camel-folder.h" - -#define CAMEL_POP3_FOLDER_TYPE (camel_pop3_folder_get_type ()) -#define CAMEL_POP3_FOLDER(obj) (CAMEL_CHECK_CAST((obj), CAMEL_POP3_FOLDER_TYPE, CamelPop3Folder)) -#define CAMEL_POP3_FOLDER_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_POP3_FOLDER_TYPE, CamelPop3FolderClass)) -#define IS_CAMEL_POP3_FOLDER(o) (CAMEL_CHECK_TYPE((o), CAMEL_POP3_FOLDER_TYPE)) - - -typedef struct { - CamelFolder parent_object; - - GPtrArray *uids; - guint32 *flags; - -} CamelPop3Folder; - - - -typedef struct { - CamelFolderClass parent_class; - - /* Virtual methods */ - -} CamelPop3FolderClass; - - -/* public methods */ -CamelFolder *camel_pop3_folder_new (CamelStore *parent, CamelException *ex); - -/* Standard Camel function */ -CamelType camel_pop3_folder_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_POP3_FOLDER_H */ diff --git a/camel/providers/pop3/camel-pop3-provider.c b/camel/providers/pop3/camel-pop3-provider.c deleted file mode 100644 index 5af0dad73c..0000000000 --- a/camel/providers/pop3/camel-pop3-provider.c +++ /dev/null @@ -1,60 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-pop3-provider.c: pop3 provider registration code */ - -/* - * Authors : - * Dan Winship <danw@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "config.h" -#include "camel-pop3-store.h" -#include "camel-provider.h" -#include "camel-session.h" -#include "camel-url.h" - -static CamelProvider pop3_provider = { - "pop", - N_("POP"), - - N_("For connecting to POP servers. The POP protocol can also " - "be used to retrieve mail from certain web mail providers " - "and proprietary email systems."), - - "mail", - - CAMEL_PROVIDER_IS_REMOTE | CAMEL_PROVIDER_IS_SOURCE, - - CAMEL_URL_NEED_USER | CAMEL_URL_NEED_HOST | CAMEL_URL_ALLOW_AUTH, - - { 0, 0 }, - - NULL -}; - -void -camel_provider_module_init (CamelSession *session) -{ - pop3_provider.object_types[CAMEL_PROVIDER_STORE] = - camel_pop3_store_get_type(); - - pop3_provider.service_cache = g_hash_table_new (camel_url_hash, camel_url_equal); - - camel_session_register_provider (session, &pop3_provider); -} diff --git a/camel/providers/pop3/camel-pop3-store.c b/camel/providers/pop3/camel-pop3-store.c deleted file mode 100644 index bdcf7996e3..0000000000 --- a/camel/providers/pop3/camel-pop3-store.c +++ /dev/null @@ -1,700 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-pop3-store.c : class for a pop3 store */ - -/* - * Authors: - * Dan Winship <danw@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "config.h" - -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> - -#ifdef HAVE_KRB4 -/* Specified nowhere */ -#define KPOP_PORT 1109 - -#include <krb.h> -/* MIT krb4 des.h #defines _. Sigh. We don't need it. */ -#undef _ - -#ifdef NEED_KRB_SENDAUTH_PROTO -extern int krb_sendauth(long options, int fd, KTEXT ticket, char *service, - char *inst, char *realm, unsigned KRB4_32 checksum, - MSG_DAT *msg_data, CREDENTIALS *cred, - Key_schedule schedule, struct sockaddr_in *laddr, - struct sockaddr_in *faddr, char *version); -#endif -#endif - -#include "camel-pop3-store.h" -#include "camel-pop3-folder.h" -#include "camel-stream-buffer.h" -#include "camel-stream-fs.h" -#include "camel-session.h" -#include "camel-exception.h" -#include "camel-url.h" -#include "e-util/md5-utils.h" - -/* Specified in RFC 1939 */ -#define POP3_PORT 110 - -static CamelRemoteStoreClass *parent_class = NULL; - -static void finalize (CamelObject *object); - -static gboolean pop3_connect (CamelService *service, CamelException *ex); -static gboolean pop3_disconnect (CamelService *service, gboolean clean, CamelException *ex); -static GList *query_auth_types_connected (CamelService *service, CamelException *ex); -static GList *query_auth_types_generic (CamelService *service, CamelException *ex); - -static CamelFolder *get_folder (CamelStore *store, const char *folder_name, - guint32 flags, CamelException *ex); -static char *get_folder_name (CamelStore *store, const char *folder_name, - CamelException *ex); -static char *get_root_folder_name (CamelStore *store, CamelException *ex); - -static int pop3_get_response (CamelPop3Store *store, char **ret, CamelException *ex); - - -static void -camel_pop3_store_class_init (CamelPop3StoreClass *camel_pop3_store_class) -{ - CamelServiceClass *camel_service_class = - CAMEL_SERVICE_CLASS (camel_pop3_store_class); - CamelStoreClass *camel_store_class = - CAMEL_STORE_CLASS (camel_pop3_store_class); - /*CamelRemoteStoreClass *camel_remote_store_class = - * CAMEL_STORE_CLASS (camel_pop3_store_class); - */ - - parent_class = CAMEL_REMOTE_STORE_CLASS(camel_type_get_global_classfuncs - (camel_remote_store_get_type ())); - - /* virtual method overload */ - camel_service_class->query_auth_types_connected = query_auth_types_connected; - camel_service_class->query_auth_types_generic = query_auth_types_generic; - camel_service_class->connect = pop3_connect; - camel_service_class->disconnect = pop3_disconnect; - - camel_store_class->get_folder = get_folder; - camel_store_class->get_folder_name = get_folder_name; - camel_store_class->get_root_folder_name = get_root_folder_name; -} - - - -static void -camel_pop3_store_init (gpointer object, gpointer klass) -{ - CamelRemoteStore *remote_store = CAMEL_REMOTE_STORE (object); - - remote_store->default_port = 110; -} - -CamelType -camel_pop3_store_get_type (void) -{ - static CamelType camel_pop3_store_type = CAMEL_INVALID_TYPE; - - if (!camel_pop3_store_type) { - camel_pop3_store_type = camel_type_register (CAMEL_REMOTE_STORE_TYPE, "CamelPop3Store", - sizeof (CamelPop3Store), - sizeof (CamelPop3StoreClass), - (CamelObjectClassInitFunc) camel_pop3_store_class_init, - NULL, - (CamelObjectInitFunc) camel_pop3_store_init, - finalize); - } - - return camel_pop3_store_type; -} - -static void -finalize (CamelObject *object) -{ - CamelPop3Store *pop3_store = CAMEL_POP3_STORE (object); - - if (pop3_store->apop_timestamp) - g_free (pop3_store->apop_timestamp); -} - -static CamelServiceAuthType password_authtype = { - N_("Password"), - - N_("This option will connect to the POP server using a plaintext " - "password. This is the only option supported by many POP servers."), - - "", - TRUE -}; - -static CamelServiceAuthType apop_authtype = { - "APOP", - - N_("This option will connect to the POP server using an encrypted " - "password via the APOP protocol. This may not work for all users " - "even on servers that claim to support it."), - - "+APOP", - TRUE -}; - -#ifdef HAVE_KRB4 -static CamelServiceAuthType kpop_authtype = { - "Kerberos 4 (KPOP)", - - N_("This will connect to the POP server and use Kerberos 4 " - "to authenticate to it."), - - "+KPOP", - FALSE -}; -#endif - -static gboolean -connect_to_server (CamelService *service, /*gboolean real, */CamelException *ex) -{ - CamelPop3Store *store = CAMEL_POP3_STORE (service); - char *buf, *apoptime, *apopend; - gint status; -#ifdef HAVE_KRB4 - gboolean kpop = service->url->authmech && - !strcmp (service->url->authmech, "+KPOP"); -#endif - -#ifdef HAVE_KRB4 - if (kpop) { - KTEXT_ST ticket_st; - MSG_DAT msg_data; - CREDENTIALS cred; - Key_schedule schedule; - char *hostname; - struct hostent *h; - int fd; - - /* Need to copy hostname, because krb_realmofhost will - * call gethostbyname as well, and gethostbyname uses - * static storage. - */ - h = camel_service_gethost (service, ex); - hostname = g_strdup (h->h_name); - - fd = CAMEL_STREAM_FS (CAMEL_REMOTE_STORE (service)->ostream)->fd; - - status = krb_sendauth (0, fd, &ticket_st, "pop", hostname, - krb_realmofhost (hostname), 0, - &msg_data, &cred, schedule, - NULL, NULL, "KPOPV0.1"); - g_free (hostname); - if (status != KSUCCESS) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - _("Could not authenticate to " - "KPOP server: %s"), - krb_err_txt[status]); - return FALSE; - } - - if (!service->url->passwd) - service->url->passwd = g_strdup (service->url->user); - } -#endif /* HAVE_KRB4 */ - - /* Read the greeting, check status */ - status = pop3_get_response (store, &buf, ex); - if (status != CAMEL_POP3_OK) - return FALSE; - - apoptime = strchr (buf, '<'); - apopend = apoptime ? strchr (apoptime, '>') : NULL; - if (apopend) { - store->apop_timestamp = g_strndup (apoptime, - apopend - apoptime + 1); - memmove (apoptime, apopend + 1, strlen (apopend + 1)); - } - store->implementation = buf; - - /* Check extensions */ - store->login_delay = -1; - store->supports_top = -1; - store->supports_uidl = -1; - store->expires = -1; - - status = camel_pop3_command (store, NULL, ex, "CAPA"); - if (status == CAMEL_POP3_OK) { - char *p; - int len; - - buf = camel_pop3_command_get_additional_data (store, ex); - if (camel_exception_is_set (ex)) - return FALSE; - - p = buf; - while (*p) { - len = strcspn (p, "\n"); - if (!strncmp (p, "IMPLEMENTATION ", 15)) { - g_free (store->implementation); - store->implementation = - g_strndup (p + 15, len - 15); - } else if (len == 3 && !strncmp (p, "TOP", 3)) - store->supports_top = TRUE; - else if (len == 4 && !strncmp (p, "UIDL", 4)) - store->supports_uidl = TRUE; - else if (!strncmp (p, "LOGIN-DELAY ", 12)) - store->login_delay = atoi (p + 12); - else if (!strncmp (p, "EXPIRE NEVER", 12)) - store->expires = FALSE; - else if (!strncmp (p, "EXPIRE ", 7)) - store->expires = TRUE; - - p += len; - if (*p) - p++; - } - - g_free (buf); - } - - return TRUE; -} - -static GList * -query_auth_types_connected (CamelService *service, CamelException *ex) -{ - CamelPop3Store *store = CAMEL_POP3_STORE (service); - GList *ret = NULL; - gboolean passwd = TRUE, apop = TRUE; -#ifdef HAVE_KRB4 - gboolean kpop = TRUE; - int saved_port; -#endif - - ret = CAMEL_SERVICE_CLASS (parent_class)->query_auth_types_connected (service, ex); - - passwd = camel_service_connect (service, ex); - /*ignore the exception here; the server may just not support passwd */ - /*if (camel_exception_is_set (ex) != CAMEL_EXCEPTION_NONE)*/ - /*return NULL;*/ - - /* should we check apop too? */ - apop = store->apop_timestamp != NULL; - if (passwd) - camel_service_disconnect (service, TRUE, ex); - camel_exception_clear (ex); - -#ifdef HAVE_KRB4 - saved_port = service->url->port; - service->url->port = KPOP_PORT; - kpop = camel_service_connect (service, ex); - service->url->port = saved_port; - /*ignore the exception here; the server may just not support kpop */ - /*if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE)*/ - /*return NULL;*/ - - if (kpop) - camel_service_disconnect (service, TRUE, ex); - camel_exception_clear (ex); -#endif - - if (passwd) - ret = g_list_append (ret, &password_authtype); - if (apop) - ret = g_list_append (ret, &apop_authtype); -#ifdef HAVE_KRB4 - if (kpop) - ret = g_list_append (ret, &kpop_authtype); -#endif - - if (!ret) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - _("Could not connect to POP server on " - "%s."), service->url->host); - } - - return ret; -} - -static GList * -query_auth_types_generic (CamelService *service, CamelException *ex) -{ - GList *ret; - - ret = g_list_append (NULL, &password_authtype); - ret = g_list_append (ret, &apop_authtype); -#ifdef HAVE_KRB4 - ret = g_list_append (ret, &kpop_authtype); -#endif - - return ret; -} - -/** - * camel_pop3_store_expunge: - * @store: the store - * @ex: a CamelException - * - * Expunge messages from the store. This will result in the connection - * being closed, which may cause later commands to fail if they can't - * reconnect. - **/ -void -camel_pop3_store_expunge (CamelPop3Store *store, CamelException *ex) -{ - camel_pop3_command (store, NULL, ex, "QUIT"); - camel_service_disconnect (CAMEL_SERVICE (store), FALSE, ex); -} - - -static gboolean -pop3_try_authenticate (CamelService *service, gboolean kpop, - const char *errmsg, CamelException *ex) -{ - CamelPop3Store *store = (CamelPop3Store *)service; - int status; - char *msg; - - /* The KPOP code will have set the password to be the username - * in connect_to_server. Password and APOP are the only other - * cases, and they both need a password. So if there's no - * password stored, query for it. - */ - if (!service->url->passwd) { - char *prompt; - - prompt = g_strdup_printf (_("%sPlease enter the POP3 password " - "for %s@%s"), errmsg ? errmsg : "", - service->url->user, - service->url->host); - service->url->passwd = camel_session_query_authenticator ( - camel_service_get_session (service), - CAMEL_AUTHENTICATOR_ASK, prompt, TRUE, - service, "password", ex); - g_free (prompt); - if (!service->url->passwd) - return FALSE; - } - - if (!service->url->authmech || kpop) { - status = camel_pop3_command (store, &msg, ex, "USER %s", - service->url->user); - switch (status) { - case CAMEL_POP3_ERR: - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, - _("Unable to connect to POP " - "server.\nError sending " - "username: %s"), - msg ? msg : _("(Unknown)")); - g_free (msg); - /*fallll*/ - case CAMEL_POP3_FAIL: - return FALSE; - } - g_free (msg); - - status = camel_pop3_command (store, &msg, ex, "PASS %s", - service->url->passwd); - } else if (!strcmp (service->url->authmech, "+APOP") - && store->apop_timestamp) { - char *secret, md5asc[33], *d; - unsigned char md5sum[16], *s; - - secret = g_strdup_printf ("%s%s", store->apop_timestamp, - service->url->passwd); - md5_get_digest (secret, strlen (secret), md5sum); - g_free (secret); - - for (s = md5sum, d = md5asc; d < md5asc + 32; s++, d += 2) - sprintf (d, "%.2x", *s); - - status = camel_pop3_command (store, &msg, ex, "APOP %s %s", - service->url->user, md5asc); - } else { - camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, - _("Unable to connect to POP server.\n" - "No support for requested " - "authentication mechanism.")); - return FALSE; - } - - if (status == CAMEL_POP3_ERR) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, - _("Unable to connect to POP server.\n" - "Error sending password: %s"), - msg ? msg : _("(Unknown)")); - } - - g_free (msg); - return camel_exception_is_set (ex); -} - -static gboolean -pop3_connect (CamelService *service, CamelException *ex) -{ - char *errbuf = NULL; - gboolean tryagain, kpop = FALSE; - gboolean res; - -#ifdef HAVE_KRB4 - gboolean set_port = FALSE; - - kpop = (service->url->authmech && - !strcmp (service->url->authmech, "+KPOP")); - - if (kpop && service->url->port == 0) { - set_port = TRUE; - service->url->port = KPOP_PORT; - } -#endif - - res = CAMEL_SERVICE_CLASS (parent_class)->connect (service, ex); - -#ifdef HAVE_KRB4 - /* This is veeery nasty. When we set the port, we're changing the - * hash value of our URL. service_cache_remove() gets called when - * we're done checking the mail, but the hash table lookup fails - * because the url port has changed. Then, a finalized instance of - * the CamelService is stuck in the hash table, and the next time - * we try to look up the service, with a URL of port 0, we look - * up the freed service and a segfault results. - */ - - if (kpop && set_port) - service->url->port = 0; -#endif - - if (res == FALSE) - return FALSE; - - /*FIXME integrate these functions */ - if (!connect_to_server (service, ex)) - return FALSE; - - camel_exception_clear (ex); - do { - if (camel_exception_is_set (ex)) { - errbuf = g_strdup_printf ( - "%s\n\n", - camel_exception_get_description (ex)); - camel_exception_clear (ex); - - /* Uncache the password before prompting again. */ - camel_session_query_authenticator ( - camel_service_get_session (service), - CAMEL_AUTHENTICATOR_TELL, NULL, TRUE, service, - "password", ex); - g_free (service->url->passwd); - service->url->passwd = NULL; - } - - tryagain = pop3_try_authenticate (service, kpop, errbuf, ex); - g_free (errbuf); - } while (tryagain); - - if (camel_exception_is_set (ex)) - return FALSE; - - return TRUE; -} - -static gboolean -pop3_disconnect (CamelService *service, gboolean clean, CamelException *ex) -{ - CamelPop3Store *store = CAMEL_POP3_STORE (service); - - if (clean) - camel_pop3_command (store, NULL, ex, "QUIT"); - - if (!CAMEL_SERVICE_CLASS (parent_class)->disconnect (service, clean, ex)) - return FALSE; - - return TRUE; -} - -static CamelFolder * -get_folder (CamelStore *store, const char *folder_name, - guint32 flags, CamelException *ex) -{ - return camel_pop3_folder_new (store, ex); -} - -static char * -get_folder_name (CamelStore *store, const char *folder_name, - CamelException *ex) -{ - if (!g_strcasecmp (folder_name, "inbox")) - return g_strdup ("inbox"); - else { - camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_INVALID, - _("No such folder `%s'."), folder_name); - return NULL; - } -} - -static char * -get_root_folder_name (CamelStore *store, CamelException *ex) -{ - return g_strdup ("inbox"); -} - - -/** - * camel_pop3_command: Send a command to a POP3 server. - * @store: the POP3 store - * @ret: a pointer to return the full server response in - * @fmt: a printf-style format string, followed by arguments - * - * This command sends the command specified by @fmt and the following - * arguments to the connected POP3 store specified by @store. It then - * reads the server's response and parses out the status code. If - * the caller passed a non-NULL pointer for @ret, camel_pop3_command - * will set it to point to an buffer containing the rest of the - * response from the POP3 server. (If @ret was passed but there was - * no extended response, @ret will be set to NULL.) The caller must - * free this buffer when it is done with it. - * - * Return value: one of CAMEL_POP3_OK (command executed successfully), - * CAMEL_POP3_ERR (command encounted an error), or CAMEL_POP3_FAIL - * (a protocol-level error occurred, and Camel is uncertain of the - * result of the command.) - **/ -int -camel_pop3_command (CamelPop3Store *store, char **ret, CamelException *ex, char *fmt, ...) -{ - char *cmdbuf; - va_list ap; - - va_start (ap, fmt); - cmdbuf = g_strdup_vprintf (fmt, ap); - va_end (ap); - - /* Send the command */ - if (camel_remote_store_send_string (CAMEL_REMOTE_STORE (store), ex, "%s\r\n", cmdbuf) < 0) { - g_free (cmdbuf); - if (ret) - *ret = NULL; - return CAMEL_POP3_FAIL; - } - g_free (cmdbuf); - - return pop3_get_response (store, ret, ex); -} - -static int -pop3_get_response (CamelPop3Store *store, char **ret, CamelException *ex) -{ - char *respbuf; - int status; - - if (camel_remote_store_recv_line (CAMEL_REMOTE_STORE (store), &respbuf, ex) < 0) { - if (ret) - *ret = NULL; - return CAMEL_POP3_FAIL; - } - - if (!strncmp (respbuf, "+OK", 3)) - status = CAMEL_POP3_OK; - else if (!strncmp (respbuf, "-ERR", 4)) - status = CAMEL_POP3_ERR; - else - status = CAMEL_POP3_FAIL; - - if (ret) { - if (status != CAMEL_POP3_FAIL) { - *ret = strchr (respbuf, ' '); - if (*ret) - *ret = g_strdup (*ret + 1); - } else - *ret = NULL; - } - g_free (respbuf); - - return status; -} - -/** - * camel_pop3_command_get_additional_data: get "additional data" from - * a POP3 command. - * @store: the POP3 store - * - * This command gets the additional data returned by "multi-line" POP - * commands, such as LIST, RETR, TOP, and UIDL. This command _must_ - * be called after a successful (CAMEL_POP3_OK) call to - * camel_pop3_command for a command that has a multi-line response. - * The returned data is un-byte-stuffed, and has lines termined by - * newlines rather than CR/LF pairs. - * - * Return value: the data, which the caller must free. - **/ -char * -camel_pop3_command_get_additional_data (CamelPop3Store *store, CamelException *ex) -{ - GPtrArray *data; - char *buf, *p; - int i, len = 0, status = CAMEL_POP3_OK; - - data = g_ptr_array_new (); - while (1) { - if (camel_remote_store_recv_line (CAMEL_REMOTE_STORE (store), &buf, ex) < 0) { - status = CAMEL_POP3_FAIL; - break; - } - - if (!strcmp (buf, ".")) - break; - - g_ptr_array_add (data, buf); - len += strlen (buf) + 1; - } - - if (buf) - g_free (buf); - - if (status == CAMEL_POP3_OK) { - buf = g_malloc0 (len + 1); - - for (i = 0, p = buf; i < data->len; i++) { - char *ptr, *datap; - - datap = (char *) data->pdata[i]; - ptr = (*datap == '.') ? datap + 1 : datap; - len = strlen (ptr); - memcpy (p, ptr, len); - p += len; - *p++ = '\n'; - } - *p = '\0'; - } else - buf = NULL; - - for (i = 0; i < data->len; i++) - g_free (data->pdata[i]); - g_ptr_array_free (data, TRUE); - - return buf; -} - diff --git a/camel/providers/pop3/camel-pop3-store.h b/camel/providers/pop3/camel-pop3-store.h deleted file mode 100644 index cfa28f313f..0000000000 --- a/camel/providers/pop3/camel-pop3-store.h +++ /dev/null @@ -1,80 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-pop3-store.h : class for an pop3 store */ - -/* - * Authors: - * Dan Winship <danw@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_POP3_STORE_H -#define CAMEL_POP3_STORE_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include "camel-types.h" -#include "camel-remote-store.h" - -#define CAMEL_POP3_STORE_TYPE (camel_pop3_store_get_type ()) -#define CAMEL_POP3_STORE(obj) (CAMEL_CHECK_CAST((obj), CAMEL_POP3_STORE_TYPE, CamelPop3Store)) -#define CAMEL_POP3_STORE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_POP3_STORE_TYPE, CamelPop3StoreClass)) -#define IS_CAMEL_POP3_STORE(o) (CAMEL_CHECK_TYPE((o), CAMEL_POP3_STORE_TYPE)) - - -typedef struct { - CamelRemoteStore parent_object; - - char *apop_timestamp, *implementation; - gboolean supports_top, supports_uidl, expires; - int login_delay; - -} CamelPop3Store; - - - -typedef struct { - CamelRemoteStoreClass parent_class; - -} CamelPop3StoreClass; - - -/* public methods */ -void camel_pop3_store_expunge (CamelPop3Store *store, CamelException *ex); - -/* support functions */ -enum { CAMEL_POP3_OK, CAMEL_POP3_ERR, CAMEL_POP3_FAIL }; -int camel_pop3_command (CamelPop3Store *store, char **ret, CamelException *ex, char *fmt, ...); -char *camel_pop3_command_get_additional_data (CamelPop3Store *store, - CamelException *ex); - -/* Standard Camel function */ -CamelType camel_pop3_store_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_POP3_STORE_H */ - - diff --git a/camel/providers/pop3/libcamelpop3.urls b/camel/providers/pop3/libcamelpop3.urls deleted file mode 100644 index 7fffa4d861..0000000000 --- a/camel/providers/pop3/libcamelpop3.urls +++ /dev/null @@ -1 +0,0 @@ -pop diff --git a/camel/providers/sendmail/.cvsignore b/camel/providers/sendmail/.cvsignore deleted file mode 100644 index cacc3c5d5f..0000000000 --- a/camel/providers/sendmail/.cvsignore +++ /dev/null @@ -1,7 +0,0 @@ -Makefile -Makefile.in -.deps -.libs -*.lo -*.la -*.o diff --git a/camel/providers/sendmail/Makefile.am b/camel/providers/sendmail/Makefile.am deleted file mode 100644 index 965f56afb8..0000000000 --- a/camel/providers/sendmail/Makefile.am +++ /dev/null @@ -1,29 +0,0 @@ -## Process this file with automake to produce Makefile.in - -libcamelsendmailincludedir = $(includedir)/camel - - -providerdir = $(pkglibdir)/camel-providers/$(VERSION) - -provider_LTLIBRARIES = libcamelsendmail.la -provider_DATA = libcamelsendmail.urls - -INCLUDES = \ - -I.. \ - -I$(srcdir)/.. \ - -I$(srcdir)/../../.. \ - -I$(includedir) \ - -I$(top_srcdir)/intl \ - $(GTK_INCLUDEDIR) -I$(top_srcdir)/camel \ - -DG_LOG_DOMAIN=\"camel-sendmail-provider\" - -libcamelsendmail_la_SOURCES = \ - camel-sendmail-provider.c \ - camel-sendmail-transport.c - -libcamelsendmailinclude_HEADERS = \ - camel-sendmail-transport.h - -libcamelsendmail_la_LDFLAGS = -version-info 0:0:0 - -EXTRA_DIST = libcamelsendmail.urls diff --git a/camel/providers/sendmail/camel-sendmail-provider.c b/camel/providers/sendmail/camel-sendmail-provider.c deleted file mode 100644 index d0e40b4cf8..0000000000 --- a/camel/providers/sendmail/camel-sendmail-provider.c +++ /dev/null @@ -1,62 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-sendmail-provider.c: sendmail provider registration code */ - -/* - * Authors : - * Dan Winship <danw@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "config.h" -#include "camel-provider.h" -#include "camel-sendmail-transport.h" -#include "camel-session.h" -#include "camel-url.h" - -static CamelProvider sendmail_provider = { - "sendmail", - N_("Sendmail"), - - N_("For delivering mail by passing it to the \"sendmail\" program " - "on the local system."), - - "mail", - - 0, - - 0, - - { 0, 0 }, - - NULL -}; - -void -camel_provider_module_init (CamelSession *session) -{ - sendmail_provider.object_types[CAMEL_PROVIDER_TRANSPORT] = - camel_sendmail_transport_get_type(); - - sendmail_provider.service_cache = g_hash_table_new (camel_url_hash, camel_url_equal); - - camel_session_register_provider (session, &sendmail_provider); -} - - - diff --git a/camel/providers/sendmail/camel-sendmail-transport.c b/camel/providers/sendmail/camel-sendmail-transport.c deleted file mode 100644 index 137c1d32a9..0000000000 --- a/camel/providers/sendmail/camel-sendmail-transport.c +++ /dev/null @@ -1,223 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-sendmail-transport.c: Sendmail-based transport class. */ - -/* - * - * Author : - * Dan Winship <danw@helixcode.com> - * - * Copyright 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> - -#include <errno.h> -#include <fcntl.h> -#include <signal.h> -#include <sys/wait.h> -#include <unistd.h> -#include <string.h> - -#include "camel-sendmail-transport.h" -#include "camel-mime-message.h" -#include "camel-data-wrapper.h" -#include "camel-stream-fs.h" -#include "camel-exception.h" - -static char *get_name (CamelService *service, gboolean brief); - -static gboolean _can_send (CamelTransport *transport, CamelMedium *message); -static gboolean _send (CamelTransport *transport, CamelMedium *message, - CamelException *ex); -static gboolean _send_to (CamelTransport *transport, CamelMedium *message, - GList *recipients, CamelException *ex); - - -static void -camel_sendmail_transport_class_init (CamelSendmailTransportClass *camel_sendmail_transport_class) -{ - CamelTransportClass *camel_transport_class = - CAMEL_TRANSPORT_CLASS (camel_sendmail_transport_class); - CamelServiceClass *camel_service_class = - CAMEL_SERVICE_CLASS (camel_sendmail_transport_class); - - /* virtual method overload */ - camel_service_class->get_name = get_name; - - camel_transport_class->can_send = _can_send; - camel_transport_class->send = _send; - camel_transport_class->send_to = _send_to; -} - -CamelType -camel_sendmail_transport_get_type (void) -{ - static CamelType camel_sendmail_transport_type = CAMEL_INVALID_TYPE; - - if (camel_sendmail_transport_type == CAMEL_INVALID_TYPE) { - camel_sendmail_transport_type = camel_type_register (CAMEL_TRANSPORT_TYPE, "CamelSendmailTransport", - sizeof (CamelSendmailTransport), - sizeof (CamelSendmailTransportClass), - (CamelObjectClassInitFunc) camel_sendmail_transport_class_init, - NULL, - (CamelObjectInitFunc) NULL, - NULL); - } - - return camel_sendmail_transport_type; -} - - -static gboolean -_can_send (CamelTransport *transport, CamelMedium *message) -{ - return CAMEL_IS_MIME_MESSAGE (message); -} - - -static gboolean -_send_internal (CamelMedium *message, char **argv, CamelException *ex) -{ - int fd[2], nullfd, wstat; - sigset_t mask, omask; - CamelStream *out; - pid_t pid; - - g_assert (CAMEL_IS_MIME_MESSAGE (message)); - - if (pipe (fd) == -1) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not create pipe to sendmail: " - "%s: mail not sent"), - g_strerror (errno)); - return FALSE; - } - - /* Block SIGCHLD so the calling application doesn't notice - * sendmail exiting before we do. - */ - sigemptyset (&mask); - sigaddset (&mask, SIGCHLD); - sigprocmask (SIG_BLOCK, &mask, &omask); - - pid = fork (); - switch (pid) { - case -1: - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not fork sendmail: " - "%s: mail not sent"), - g_strerror (errno)); - sigprocmask (SIG_SETMASK, &omask, NULL); - return FALSE; - - case 0: - /* Child process */ - nullfd = open ("/dev/null", O_RDWR); - dup2 (fd[0], STDIN_FILENO); - dup2 (nullfd, STDOUT_FILENO); - dup2 (nullfd, STDERR_FILENO); - close (nullfd); - close (fd[1]); - - execv (SENDMAIL_PATH, argv); - _exit (255); - } - - /* Parent process. Write the message out. */ - close (fd[0]); - out = camel_stream_fs_new_with_fd (fd[1]); - if (camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (message), out) == -1 - || camel_stream_close(out) == -1) { - camel_object_unref (CAMEL_OBJECT (out)); - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not send message: %s"), - strerror(errno)); - return FALSE; - } - camel_object_unref (CAMEL_OBJECT (out)); - - /* Wait for sendmail to exit. */ - while (waitpid (pid, &wstat, 0) == -1 && errno == EINTR) - ; - sigprocmask (SIG_SETMASK, &omask, NULL); - - if (!WIFEXITED (wstat)) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("sendmail exited with signal %s: " - "mail not sent."), - g_strsignal (WTERMSIG (wstat))); - return FALSE; - } else if (WEXITSTATUS (wstat) != 0) { - if (WEXITSTATUS (wstat) == 255) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not execute %s: " - "mail not sent."), - SENDMAIL_PATH); - } else { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("sendmail exited with status " - "%d: mail not sent."), - WEXITSTATUS (wstat)); - } - return FALSE; - } - - return TRUE; -} - -static gboolean -_send_to (CamelTransport *transport, CamelMedium *message, - GList *recipients, CamelException *ex) -{ - GList *r; - char **argv; - int i, len; - gboolean status; - - len = g_list_length (recipients); - argv = g_malloc ((len + 4) * sizeof (char *)); - argv[0] = "sendmail"; - argv[1] = "-i"; - argv[2] = "--"; - - for (i = 1, r = recipients; i <= len; i++, r = r->next) - argv[i + 2] = r->data; - argv[i + 2] = NULL; - - status = _send_internal (message, argv, ex); - g_free (argv); - return status; -} - -static gboolean -_send (CamelTransport *transport, CamelMedium *message, - CamelException *ex) -{ - char *argv[4] = { "sendmail", "-t", "-i", NULL }; - - return _send_internal (message, argv, ex); -} - -static char * -get_name (CamelService *service, gboolean brief) -{ - if (brief) - return g_strdup (_("sendmail")); - else - return g_strdup (_("Mail delivery via the sendmail program")); -} diff --git a/camel/providers/sendmail/camel-sendmail-transport.h b/camel/providers/sendmail/camel-sendmail-transport.h deleted file mode 100644 index bb5dca071b..0000000000 --- a/camel/providers/sendmail/camel-sendmail-transport.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-sendmail-transport.h: Sendmail-based transport class */ - -/* - * - * Author : - * Dan Winship <danw@helixcode.com> - * - * Copyright 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_SENDMAIL_TRANSPORT_H -#define CAMEL_SENDMAIL_TRANSPORT_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include "camel-transport.h" - -#define CAMEL_SENDMAIL_TRANSPORT_TYPE (camel_sendmail_transport_get_type ()) -#define CAMEL_SENDMAIL_TRANSPORT(obj) (CAMEL_CHECK_CAST((obj), CAMEL_SENDMAIL_TRANSPORT_TYPE, CamelSendmailTransport)) -#define CAMEL_SENDMAIL_TRANSPORT_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_SENDMAIL_TRANSPORT_TYPE, CamelSendmailTransportClass)) -#define CAMEL_IS_SENDMAIL_TRANSPORT(o) (CAMEL_CHECK_TYPE((o), CAMEL_SENDMAIL_TRANSPORT_TYPE)) - - -typedef struct { - CamelTransport parent_object; - -} CamelSendmailTransport; - - -typedef struct { - CamelTransportClass parent_class; - -} CamelSendmailTransportClass; - - -/* Standard Camel function */ -CamelType camel_sendmail_transport_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_SENDMAIL_TRANSPORT_H */ diff --git a/camel/providers/sendmail/libcamelsendmail.urls b/camel/providers/sendmail/libcamelsendmail.urls deleted file mode 100644 index ccad52828e..0000000000 --- a/camel/providers/sendmail/libcamelsendmail.urls +++ /dev/null @@ -1 +0,0 @@ -sendmail diff --git a/camel/providers/smtp/.cvsignore b/camel/providers/smtp/.cvsignore deleted file mode 100644 index 09980ae6ba..0000000000 --- a/camel/providers/smtp/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -.deps -.libs -Makefile -Makefile.in -*.lo -*.la diff --git a/camel/providers/smtp/Makefile.am b/camel/providers/smtp/Makefile.am deleted file mode 100644 index 734a4e5128..0000000000 --- a/camel/providers/smtp/Makefile.am +++ /dev/null @@ -1,33 +0,0 @@ -## Process this file with automake to produce Makefile.in - -libcamelsmtpincludedir = $(includedir)/camel - -providerdir = $(pkglibdir)/camel-providers/$(VERSION) - -provider_LTLIBRARIES = libcamelsmtp.la -provider_DATA = libcamelsmtp.urls - -INCLUDES = \ - -I.. \ - -I$(srcdir)/.. \ - -I$(srcdir)/../../.. \ - -I$(includedir) \ - -I$(top_srcdir)/intl \ - -I$(top_srcdir)/camel \ - -I$(top_srcdir)/e-util \ - $(GTK_INCLUDEDIR) \ - -DG_LOG_DOMAIN=\"camel-smtp-provider\" - -libcamelsmtp_la_SOURCES = \ - camel-smtp-provider.c \ - camel-smtp-transport.c - -libcamelsmtpinclude_HEADERS = \ - camel-smtp-transport.h - - -libcamelsmtp_la_LDFLAGS = -version-info 0:0:0 - -libcamelsmtp_la_LIBADD = $(top_builddir)/e-util/libeutil.la $(UNICODE_LIBS) - -EXTRA_DIST = libcamelsmtp.urls diff --git a/camel/providers/smtp/camel-smtp-provider.c b/camel/providers/smtp/camel-smtp-provider.c deleted file mode 100644 index 6d94536937..0000000000 --- a/camel/providers/smtp/camel-smtp-provider.c +++ /dev/null @@ -1,62 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-smtp-provider.c: smtp provider registration code */ - -/* - * Authors : - * Jeffrey Stedfast <fejj@stampede.org> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "config.h" -#include "camel-smtp-transport.h" -#include "camel-provider.h" -#include "camel-session.h" -#include "camel-url.h" - -static CamelProvider smtp_provider = { - "smtp", - "SMTP", - - N_("For delivering mail by connecting to a remote mailhub " - "using SMTP."), - - "mail", - - CAMEL_PROVIDER_IS_REMOTE, - - CAMEL_URL_NEED_HOST, - - { 0, 0 }, - - NULL -}; - -void -camel_provider_module_init (CamelSession *session) -{ - smtp_provider.object_types[CAMEL_PROVIDER_TRANSPORT] = - camel_smtp_transport_get_type(); - - smtp_provider.service_cache = g_hash_table_new (camel_url_hash, camel_url_equal); - - camel_session_register_provider (session, &smtp_provider); -} - - - diff --git a/camel/providers/smtp/camel-smtp-transport.c b/camel/providers/smtp/camel-smtp-transport.c deleted file mode 100644 index 6fa39bb930..0000000000 --- a/camel/providers/smtp/camel-smtp-transport.c +++ /dev/null @@ -1,788 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-smtp-transport.c : class for a smtp transport */ - -/* - * Authors: Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "config.h" - -#include <sys/param.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <unistd.h> -#undef MIN -#undef MAX -#include "camel-mime-filter-crlf.h" -#include "camel-mime-filter-linewrap.h" -#include "camel-stream-filter.h" -#include "camel-smtp-transport.h" -#include "camel-mime-message.h" -#include "camel-multipart.h" -#include "camel-mime-part.h" -#include "camel-stream-buffer.h" -#include "camel-stream-fs.h" -#include "camel-session.h" -#include "camel-exception.h" - -#define d(x) x - -/* Specified in RFC 821 */ -#define SMTP_PORT 25 - -/* camel smtp transport class prototypes */ -static gboolean _can_send (CamelTransport *transport, CamelMedium *message); -static gboolean _send (CamelTransport *transport, CamelMedium *message, CamelException *ex); -static gboolean _send_to (CamelTransport *transport, CamelMedium *message, GList *recipients, CamelException *ex); - -/* support prototypes */ -static gboolean smtp_connect (CamelService *service, CamelException *ex); -static gboolean smtp_disconnect (CamelService *service, gboolean clean, CamelException *ex); -static GList *esmtp_get_authtypes(gchar *buffer); -static GList *query_auth_types_connected (CamelService *service, CamelException *ex); -static GList *query_auth_types_generic (CamelService *service, CamelException *ex); -static void free_auth_types (CamelService *service, GList *authtypes); -static char *get_name (CamelService *service, gboolean brief); - -static gboolean smtp_helo (CamelSmtpTransport *transport, CamelException *ex); -static gboolean smtp_mail (CamelSmtpTransport *transport, const char *sender, - gboolean has_8bit_parts, CamelException *ex); -static gboolean smtp_rcpt (CamelSmtpTransport *transport, const char *recipient, CamelException *ex); -static gboolean smtp_data (CamelSmtpTransport *transport, CamelMedium *message, - gboolean has_8bit_parts, CamelException *ex); -static gboolean smtp_rset (CamelSmtpTransport *transport, CamelException *ex); -static gboolean smtp_quit (CamelSmtpTransport *transport, CamelException *ex); - -/* private data members */ -static CamelServiceClass *service_class = NULL; - -static void -camel_smtp_transport_class_init (CamelSmtpTransportClass *camel_smtp_transport_class) -{ - CamelTransportClass *camel_transport_class = - CAMEL_TRANSPORT_CLASS (camel_smtp_transport_class); - CamelServiceClass *camel_service_class = - CAMEL_SERVICE_CLASS (camel_smtp_transport_class); - - service_class = CAMEL_SERVICE_CLASS (camel_type_get_global_classfuncs (camel_service_get_type ())); - - /* virtual method overload */ - camel_service_class->connect = smtp_connect; - camel_service_class->disconnect = smtp_disconnect; - camel_service_class->query_auth_types_generic = query_auth_types_generic; - camel_service_class->query_auth_types_connected = query_auth_types_connected; - camel_service_class->free_auth_types = free_auth_types; - camel_service_class->get_name = get_name; - - camel_transport_class->can_send = _can_send; - camel_transport_class->send = _send; - camel_transport_class->send_to = _send_to; -} - -static void -camel_smtp_transport_init (gpointer object) -{ - CamelTransport *transport = CAMEL_TRANSPORT (object); - - transport->supports_8bit = FALSE; -} - -CamelType -camel_smtp_transport_get_type (void) -{ - static CamelType camel_smtp_transport_type = CAMEL_INVALID_TYPE; - - if (camel_smtp_transport_type == CAMEL_INVALID_TYPE) { - camel_smtp_transport_type = - camel_type_register (CAMEL_TRANSPORT_TYPE, "CamelSmtpTransport", - sizeof (CamelSmtpTransport), - sizeof (CamelSmtpTransportClass), - (CamelObjectClassInitFunc) camel_smtp_transport_class_init, - NULL, - (CamelObjectInitFunc) camel_smtp_transport_init, - NULL); - } - - return camel_smtp_transport_type; -} - -static gboolean -smtp_connect (CamelService *service, CamelException *ex) -{ - CamelSmtpTransport *transport = CAMEL_SMTP_TRANSPORT (service); - struct hostent *h; - struct sockaddr_in sin; - gint fd, num, i; - guint32 addrlen; - gchar *pass = NULL, *respbuf = NULL; - - if (!service_class->connect (service, ex)) - return FALSE; - - h = camel_service_gethost (service, ex); - if (!h) - return FALSE; - - /* set some smtp transport defaults */ - transport->is_esmtp = FALSE; - transport->esmtp_supported_authtypes = NULL; - CAMEL_TRANSPORT (transport)->supports_8bit = FALSE; - - sin.sin_family = h->h_addrtype; - sin.sin_port = htons (service->url->port ? service->url->port : SMTP_PORT); - memcpy (&sin.sin_addr, h->h_addr, sizeof (sin.sin_addr)); - - fd = socket (h->h_addrtype, SOCK_STREAM, 0); - if (fd == -1 || connect (fd, (struct sockaddr *)&sin, sizeof (sin)) == -1) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - "Could not connect to %s (port %d): %s", - service->url->host, - service->url->port ? service->url->port : SMTP_PORT, - strerror (errno)); - if (fd > -1) - close (fd); - g_free (pass); - return FALSE; - } - - /* get the localaddr - needed later by smtp_helo */ - addrlen = sizeof (transport->localaddr); - getsockname (fd, (struct sockaddr*)&transport->localaddr, &addrlen); - - transport->ostream = camel_stream_fs_new_with_fd (fd); - transport->istream = camel_stream_buffer_new (transport->ostream, - CAMEL_STREAM_BUFFER_READ); - - /* Read the greeting, note whether the server is ESMTP or not. */ - do { - /* Check for "220" */ - g_free (respbuf); - respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (transport->istream)); - if (!respbuf || strncmp (respbuf, "220", 3)) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "Welcome response error: " - "%s: possibly non-fatal", - g_strerror (errno)); - return FALSE; - } - if (strstr (respbuf, "ESMTP")) - transport->is_esmtp = TRUE; - } while (*(respbuf+3) == '-'); /* if we got "220-" then loop again */ - g_free (respbuf); - - /* send HELO (or EHLO, depending on the service type) */ - if (!transport->is_esmtp) { - /* If we did not auto-detect ESMTP, we should still send EHLO */ - transport->is_esmtp = TRUE; - if (!smtp_helo (transport, ex)) { - /* Okay, apprently this server doesn't support ESMTP */ - transport->is_esmtp = FALSE; - smtp_helo (transport, ex); - } - } else { - smtp_helo (transport, ex); - } - - /* check to see if AUTH is required, if so...then AUTH ourselves */ - if (transport->is_esmtp && transport->esmtp_supported_authtypes) { - /* not really supported yet, but we can at least show what auth types are supported */ - d(fprintf (stderr, "camel-smtp-transport::connect(): %s requires AUTH\n", service->url->host)); - num = g_list_length (transport->esmtp_supported_authtypes); - - for (i = 0; i < num; i++) - d(fprintf (stderr, "\nSupported AUTH: %s\n\n", - (gchar *) g_list_nth_data (transport->esmtp_supported_authtypes, i))); - - g_list_free (transport->esmtp_supported_authtypes); - transport->esmtp_supported_authtypes = NULL; - } else { - d(fprintf (stderr, "\ncamel-smtp-transport::connect(): provider does not use AUTH\n\n")); - } - - return TRUE; -} - -static gboolean -smtp_disconnect (CamelService *service, gboolean clean, CamelException *ex) -{ - CamelSmtpTransport *transport = CAMEL_SMTP_TRANSPORT (service); - - /*if (!service->connected) - * return TRUE; - */ - - if (clean) { - /* send the QUIT command to the SMTP server */ - smtp_quit (transport, ex); - } - - if (!service_class->disconnect (service, clean, ex)) - return FALSE; - - g_free (transport->esmtp_supported_authtypes); - transport->esmtp_supported_authtypes = NULL; - camel_object_unref (CAMEL_OBJECT (transport->ostream)); - camel_object_unref (CAMEL_OBJECT (transport->istream)); - transport->ostream = NULL; - transport->istream = NULL; - - return TRUE; -} - -static GList * -esmtp_get_authtypes (gchar *buffer) -{ - GList *ret = NULL; - gchar *start, *end; - - /* advance to the first token */ - for (start = buffer; *start == ' ' || *start == '='; start++); - - for ( ; *start; ) { - /* advance to the end of the token */ - for (end = start; *end && *end != ' '; end++); - - ret = g_list_append (ret, g_strndup (start, end - start)); - - /* advance to the next token */ - for (start = end; *start == ' '; start++); - } - - return ret; -} - -/* FIXME: use these? */ -#ifdef notyet -static CamelServiceAuthType no_authtype = { - "No authentication required", - - "This option will connect to the SMTP server without using any " - "kind of authentication. This should be fine for connecting to " - "most SMTP servers." - - "", - FALSE -}; - -static CamelServiceAuthType cram_md5_authtype = { - "CRAM-MD5", - - "This option will connect to the SMTP server using CRAM-MD5 " - "authentication.", - - "CRAM-MD5", - TRUE -}; -#endif - -static GList * -query_auth_types_connected (CamelService *service, CamelException *ex) -{ - /* FIXME: Re-enable this when auth types are actually - * implemented. - */ - - return NULL; -} - -static GList * -query_auth_types_generic (CamelService *service, CamelException *ex) -{ - /* FIXME: Re-enable this when auth types are actually - * implemented. - */ - - return NULL; -} - -static void -free_auth_types (CamelService *service, GList *authtypes) -{ - g_list_free (authtypes); -} - -static char * -get_name (CamelService *service, gboolean brief) -{ - if (brief) - return g_strdup_printf ("SMTP server %s", service->url->host); - else { - return g_strdup_printf ("SMTP mail delivery via %s", - service->url->host); - } -} - -static gboolean -_can_send (CamelTransport *transport, CamelMedium *message) -{ - return CAMEL_IS_MIME_MESSAGE (message); -} - -static gboolean -_send_to (CamelTransport *transport, CamelMedium *message, - GList *recipients, CamelException *ex) -{ - CamelSmtpTransport *smtp_transport = CAMEL_SMTP_TRANSPORT (transport); - CamelInternetAddress *cia; - char *recipient, *sender; - const char *addr; - gboolean has_8bit_parts; - GList *r; - - sender = g_strdup (camel_mime_message_get_from (CAMEL_MIME_MESSAGE (message))); - if (!sender) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "Cannot send message: " - "sender address not defined."); - return FALSE; - } - - cia = camel_internet_address_new (); - camel_address_decode (CAMEL_ADDRESS (cia), sender); - g_free (sender); - - if (!camel_internet_address_get (cia, 0, NULL, &addr)) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "Cannot send message: " - "sender address not valid."); - return FALSE; - } - - /* find out if the message has 8bit mime parts */ - has_8bit_parts = camel_mime_message_has_8bit_parts (CAMEL_MIME_MESSAGE (message)); - - /* rfc1652 (8BITMIME) requires that you notify the ESMTP daemon that - you'll be sending an 8bit mime message at "MAIL FROM:" time. */ - smtp_mail (smtp_transport, addr, has_8bit_parts, ex); - - if (!recipients) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "Cannot send message: " - "no recipients defined."); - return FALSE; - } - - for (r = recipients; r; r = r->next) { - recipient = (char *) r->data; - if (!smtp_rcpt (smtp_transport, recipient, ex)) { - g_free (recipient); - return FALSE; - } - g_free (recipient); - } - - /* passing in has_8bit_parts saves time as we don't have to - recurse through the message all over again if the user is - not sending 8bit mime parts */ - if (!smtp_data (smtp_transport, message, has_8bit_parts, ex)) - return FALSE; - - /* reset the service for our next transfer session */ - smtp_rset (smtp_transport, ex); - - return TRUE; -} - -static gboolean -_send (CamelTransport *transport, CamelMedium *message, CamelException *ex) -{ - const CamelInternetAddress *to, *cc, *bcc; - GList *recipients = NULL; - guint index, len; - - to = camel_mime_message_get_recipients (CAMEL_MIME_MESSAGE (message), CAMEL_RECIPIENT_TYPE_TO); - cc = camel_mime_message_get_recipients (CAMEL_MIME_MESSAGE (message), CAMEL_RECIPIENT_TYPE_CC); - bcc = camel_mime_message_get_recipients (CAMEL_MIME_MESSAGE (message), CAMEL_RECIPIENT_TYPE_BCC); - - /* get all of the To addresses into our recipient list */ - len = CAMEL_ADDRESS (to)->addresses->len; - for (index = 0; index < len; index++) { - const char *addr; - - if (camel_internet_address_get (to, index, NULL, &addr)) - recipients = g_list_append (recipients, g_strdup (addr)); - } - - /* get all of the Cc addresses into our recipient list */ - len = CAMEL_ADDRESS (cc)->addresses->len; - for (index = 0; index < len; index++) { - const char *addr; - - if (camel_internet_address_get (cc, index, NULL, &addr)) - recipients = g_list_append (recipients, g_strdup (addr)); - } - - /* get all of the Bcc addresses into our recipient list */ - len = CAMEL_ADDRESS (bcc)->addresses->len; - for (index = 0; index < len; index++) { - const char *addr; - - if (camel_internet_address_get (bcc, index, NULL, &addr)) - recipients = g_list_append (recipients, g_strdup (addr)); - } - - return _send_to (transport, message, recipients, ex); -} - -static gboolean -smtp_helo (CamelSmtpTransport *transport, CamelException *ex) -{ - /* say hello to the server */ - gchar *cmdbuf, *respbuf = NULL; - struct hostent *host; - - /* get the local host name */ - host = gethostbyaddr ((gchar *)&transport->localaddr.sin_addr, sizeof (transport->localaddr.sin_addr), AF_INET); - - /* hiya server! how are you today? */ - if (transport->is_esmtp) { - if (host && host->h_name) - cmdbuf = g_strdup_printf ("EHLO %s\r\n", host->h_name); - else - cmdbuf = g_strdup_printf ("EHLO [%s]\r\n", inet_ntoa (transport->localaddr.sin_addr)); - } else { - if (host && host->h_name) - cmdbuf = g_strdup_printf ("HELO %s\r\n", host->h_name); - else - cmdbuf = g_strdup_printf ("HELO [%s]\r\n", inet_ntoa (transport->localaddr.sin_addr)); - } - - d(fprintf (stderr, "sending : %s", cmdbuf)); - if (camel_stream_write (transport->ostream, cmdbuf, strlen (cmdbuf)) == -1) { - g_free (cmdbuf); - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "HELO request timed out: " - "%s: non-fatal", - g_strerror (errno)); - return FALSE; - } - g_free (cmdbuf); - - do { - /* Check for "250" */ - g_free (respbuf); - respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (transport->istream)); - - d(fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)")); - - if (!respbuf || strncmp (respbuf, "250", 3)) { - g_free (respbuf); - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "HELO response error: " - "%s: non-fatal", - g_strerror (errno)); - return FALSE; - } - - if (strstr (respbuf, "8BITMIME")) { - d(fprintf (stderr, "This server supports 8bit\n")); - CAMEL_TRANSPORT (transport)->supports_8bit = TRUE; - } - - if (transport->is_esmtp && strstr (respbuf, "AUTH")) { - /* parse for supported AUTH types */ - char *auths = strstr (respbuf, "AUTH") + 4; - - transport->esmtp_supported_authtypes = esmtp_get_authtypes (auths); - } - } while (*(respbuf+3) == '-'); /* if we got "250-" then loop again */ - g_free (respbuf); - - return TRUE; -} - -static gboolean -smtp_mail (CamelSmtpTransport *transport, const char *sender, gboolean has_8bit_parts, CamelException *ex) -{ - /* we gotta tell the smtp server who we are. (our email addy) */ - gchar *cmdbuf, *respbuf = NULL; - - /* enclose address in <>'s since some SMTP daemons *require* that */ - if (CAMEL_TRANSPORT (transport)->supports_8bit && has_8bit_parts) - cmdbuf = g_strdup_printf ("MAIL FROM: <%s> BODY=8BITMIME\r\n", sender); - else - cmdbuf = g_strdup_printf ("MAIL FROM: <%s>\r\n", sender); - - d(fprintf (stderr, "sending : %s", cmdbuf)); - - if (camel_stream_write (transport->ostream, cmdbuf, strlen (cmdbuf)) == -1) { - g_free (cmdbuf); - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "MAIL FROM request timed out: " - "%s: mail not sent", - g_strerror (errno)); - return FALSE; - } - g_free (cmdbuf); - - do { - /* Check for "250 Sender OK..." */ - g_free (respbuf); - respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (transport->istream)); - - d(fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)")); - - if (!respbuf || strncmp (respbuf, "250", 3)) { - g_free (respbuf); - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "MAIL FROM response error: " - "%s: mail not sent", - g_strerror (errno)); - return FALSE; - } - } while (*(respbuf+3) == '-'); /* if we got "250-" then loop again */ - g_free (respbuf); - - return TRUE; -} - -static gboolean -smtp_rcpt (CamelSmtpTransport *transport, const char *recipient, CamelException *ex) -{ - /* we gotta tell the smtp server who we are going to be sending - * our email to */ - gchar *cmdbuf, *respbuf = NULL; - - /* enclose address in <>'s since some SMTP daemons *require* that */ - cmdbuf = g_strdup_printf ("RCPT TO: <%s>\r\n", recipient); - - d(fprintf (stderr, "sending : %s", cmdbuf)); - - if (camel_stream_write (transport->ostream, cmdbuf, strlen (cmdbuf)) == -1) { - g_free (cmdbuf); - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "RCPT TO request timed out: " - "%s: mail not sent", - g_strerror (errno)); - return FALSE; - } - g_free (cmdbuf); - - do { - /* Check for "250 Sender OK..." */ - g_free (respbuf); - respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (transport->istream)); - - d(fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)")); - - if (!respbuf || strncmp (respbuf, "250", 3)) { - g_free (respbuf); - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "RCPT TO response error: " - "%s: mail not sent", - g_strerror (errno)); - return FALSE; - } - } while (*(respbuf+3) == '-'); /* if we got "250-" then loop again */ - g_free (respbuf); - - return TRUE; -} - -static gboolean -smtp_data (CamelSmtpTransport *transport, CamelMedium *message, gboolean has_8bit_parts, CamelException *ex) -{ - /* now we can actually send what's important :p */ - gchar *cmdbuf, *respbuf = NULL; - CamelStreamFilter *filtered_stream; - CamelMimeFilter *crlffilter, *lwfilter; - gint crlfid, lwid; - - - /* if the message contains 8bit mime parts and the server - doesn't support it, encode 8bit parts to the best - encoding. */ - if (has_8bit_parts && !CAMEL_TRANSPORT (transport)->supports_8bit) - camel_mime_message_encode_8bit_parts (CAMEL_MIME_MESSAGE (message)); - - cmdbuf = g_strdup ("DATA\r\n"); - - d(fprintf (stderr, "sending : %s", cmdbuf)); - - if (camel_stream_write (transport->ostream, cmdbuf, strlen (cmdbuf)) == -1) { - g_free (cmdbuf); - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "DATA request timed out: " - "%s: mail not sent", - g_strerror (errno)); - return FALSE; - } - g_free (cmdbuf); - - respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (transport->istream)); - - d(fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)")); - - if (!respbuf || strncmp (respbuf, "354", 3)) { - /* we should have gotten instructions on how to use the DATA command: - * 354 Enter mail, end with "." on a line by itself - */ - g_free (respbuf); - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "DATA response error: " - "%s: mail not sent", - g_strerror (errno)); - return FALSE; - } - - g_free (respbuf); - respbuf = NULL; - - /* setup stream filtering */ - lwfilter = camel_mime_filter_linewrap_new (998, 998, '\t'); - crlffilter = camel_mime_filter_crlf_new (CAMEL_MIME_FILTER_CRLF_ENCODE, CAMEL_MIME_FILTER_CRLF_MODE_CRLF_DOTS); - - filtered_stream = camel_stream_filter_new_with_stream (transport->ostream); - lwid = camel_stream_filter_add (filtered_stream, CAMEL_MIME_FILTER (lwfilter)); - crlfid = camel_stream_filter_add (filtered_stream, CAMEL_MIME_FILTER (crlffilter)); - - if (camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (message), CAMEL_STREAM (filtered_stream)) == -1) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "DATA send timed out: message termination: " - "%s: mail not sent", - g_strerror (errno)); - return FALSE; - } - - camel_stream_filter_remove (filtered_stream, lwid); - camel_stream_filter_remove (filtered_stream, crlfid); - camel_stream_flush (CAMEL_STREAM (filtered_stream)); - camel_object_unref (CAMEL_OBJECT (filtered_stream)); - - /* terminate the message body */ - - d(fprintf (stderr, "sending : \\r\\n.\\r\\n\n")); - - if (camel_stream_write (transport->ostream, "\r\n.\r\n", 5) == -1) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "DATA send timed out: message termination: " - "%s: mail not sent", - g_strerror (errno)); - return FALSE; - } - - do { - /* Check for "250 Sender OK..." */ - g_free (respbuf); - respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (transport->istream)); - - d(fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)")); - - if (!respbuf || strncmp (respbuf, "250", 3)) { - g_free (respbuf); - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "DATA response error: message termination: " - "%s: mail not sent", - g_strerror (errno)); - return FALSE; - } - } while (*(respbuf+3) == '-'); /* if we got "250-" then loop again */ - g_free (respbuf); - - return TRUE; -} - -static gboolean -smtp_rset (CamelSmtpTransport *transport, CamelException *ex) -{ - /* we are going to reset the smtp server (just to be nice) */ - gchar *cmdbuf, *respbuf = NULL; - - cmdbuf = g_strdup ("RSET\r\n"); - - d(fprintf (stderr, "sending : %s", cmdbuf)); - - if (camel_stream_write (transport->ostream, cmdbuf, strlen (cmdbuf)) == -1) { - g_free (cmdbuf); - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "RSET request timed out: " - "%s", - g_strerror (errno)); - return FALSE; - } - g_free (cmdbuf); - - do { - /* Check for "250" */ - g_free (respbuf); - respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (transport->istream)); - - d(fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)")); - - if (!respbuf || strncmp (respbuf, "250", 3)) { - g_free (respbuf); - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "RSET response error: %s", - g_strerror (errno)); - return FALSE; - } - } while (*(respbuf+3) == '-'); /* if we got "250-" then loop again */ - g_free (respbuf); - - return TRUE; -} - -static gboolean -smtp_quit (CamelSmtpTransport *transport, CamelException *ex) -{ - /* we are going to reset the smtp server (just to be nice) */ - gchar *cmdbuf, *respbuf = NULL; - - cmdbuf = g_strdup ("QUIT\r\n"); - - d(fprintf (stderr, "sending : %s", cmdbuf)); - - if (camel_stream_write (transport->ostream, cmdbuf, strlen (cmdbuf)) == -1) { - g_free (cmdbuf); - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "QUIT request timed out: " - "%s: non-fatal", - g_strerror (errno)); - return FALSE; - } - g_free (cmdbuf); - - do { - /* Check for "221" */ - g_free (respbuf); - respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (transport->istream)); - - d(fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)")); - - if (!respbuf || strncmp (respbuf, "221", 3)) { - g_free (respbuf); - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - "QUIT response error: " - "%s: non-fatal", - g_strerror (errno)); - return FALSE; - } - } while (*(respbuf+3) == '-'); /* if we got "221-" then loop again */ - g_free (respbuf); - - return TRUE; -} diff --git a/camel/providers/smtp/camel-smtp-transport.h b/camel/providers/smtp/camel-smtp-transport.h deleted file mode 100644 index b880230add..0000000000 --- a/camel/providers/smtp/camel-smtp-transport.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-smtp-transport.h : class for an smtp transfer */ - -/* - * Authors: - * Jeffrey Stedfast <fejj@stampede.org> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_SMTP_TRANSPORT_H -#define CAMEL_SMTP_TRANSPORT_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - - -#include <sys/param.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include "camel-transport.h" - -#define CAMEL_SMTP_TRANSPORT_TYPE (camel_smtp_transport_get_type ()) -#define CAMEL_SMTP_TRANSPORT(obj) (CAMEL_CHECK_CAST((obj), CAMEL_SMTP_TRANSPORT_TYPE, CamelSmtpTransport)) -#define CAMEL_SMTP_TRANSPORT_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_SMTP_TRANSPORT_TYPE, CamelSmtpTransportClass)) -#define IS_CAMEL_SMTP_TRANSPORT(o) (CAMEL_CHECK_TYPE((o), CAMEL_SMTP_TRANSPORT_TYPE)) - - -typedef struct { - CamelTransport parent_object; - - CamelStream *istream, *ostream; - - gboolean is_esmtp; - - struct sockaddr_in localaddr; - - GList *esmtp_supported_authtypes; - -} CamelSmtpTransport; - - - -typedef struct { - CamelTransportClass parent_class; - -} CamelSmtpTransportClass; - - -/* Standard Camel function */ -CamelType camel_smtp_transport_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_SMTP_TRANSPORT_H */ - - diff --git a/camel/providers/smtp/libcamelsmtp.urls b/camel/providers/smtp/libcamelsmtp.urls deleted file mode 100644 index ec2fc0fc16..0000000000 --- a/camel/providers/smtp/libcamelsmtp.urls +++ /dev/null @@ -1 +0,0 @@ -smtp diff --git a/camel/providers/vee/.cvsignore b/camel/providers/vee/.cvsignore deleted file mode 100644 index fd6b811c68..0000000000 --- a/camel/providers/vee/.cvsignore +++ /dev/null @@ -1,7 +0,0 @@ -.deps -Makefile -Makefile.in -.libs -.deps -*.lo -*.la diff --git a/camel/providers/vee/Makefile.am b/camel/providers/vee/Makefile.am deleted file mode 100644 index 6c0693b02d..0000000000 --- a/camel/providers/vee/Makefile.am +++ /dev/null @@ -1,37 +0,0 @@ -## Process this file with automake to produce Makefile.in - -libcamelveeincludedir = $(includedir)/camel - - -providerdir = $(pkglibdir)/camel-providers/$(VERSION) - -provider_LTLIBRARIES = libcamelvee.la -provider_DATA = libcamelvee.urls - -INCLUDES = -I.. \ - -I$(srcdir)/.. \ - -I$(top_srcdir)/camel \ - -I$(top_srcdir)/intl \ - -I$(top_srcdir)/libibex \ - -I$(top_srcdir)/e-util \ - -I$(top_srcdir) \ - -I$(includedir) \ - $(GTK_INCLUDEDIR) \ - -DG_LOG_DOMAIN=\"camel-vee-provider\" - -libcamelvee_la_SOURCES = \ - camel-vee-folder.c \ - camel-vee-provider.c \ - camel-vee-store.c - -libcamelveeinclude_HEADERS = \ - camel-vee-folder.h \ - camel-vee-store.h - -libcamelvee_la_LDFLAGS = -version-info 0:0:0 - -libcamelvee_la_LIBADD = $(top_builddir)/e-util/libeutil.la $(top_builddir)/libibex/libibex.la $(UNICODE_LIBS) -#libcamelvee_la_LIBADD = $(top_builddir)/libibex/libibex.la $(UNICODE_LIBS) - -EXTRA_DIST = libcamelvee.urls - diff --git a/camel/providers/vee/camel-vee-folder.c b/camel/providers/vee/camel-vee-folder.c deleted file mode 100644 index da47761754..0000000000 --- a/camel/providers/vee/camel-vee-folder.c +++ /dev/null @@ -1,524 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * Jeffrey Stedfast <fejj@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "camel-exception.h" -#include "camel-vee-folder.h" -#include "camel-folder-summary.h" -#include "camel-mime-message.h" - -#include <string.h> - -/* our message info includes the parent folder */ -typedef struct _CamelVeeMessageInfo { - CamelMessageInfo info; - CamelFolder *folder; -} CamelVeeMessageInfo; - -struct _CamelVeeFolderPrivate { - GList *folders; -}; - -#define _PRIVATE(o) (((CamelVeeFolder *)(o))->priv) - -static void vee_sync (CamelFolder *folder, gboolean expunge, CamelException *ex); - -static GPtrArray *vee_get_uids (CamelFolder *folder); -GPtrArray *vee_get_summary (CamelFolder *folder); - -static gint vee_get_message_count (CamelFolder *folder); -static gint vee_get_unread_message_count (CamelFolder *folder); -static CamelMimeMessage *vee_get_message (CamelFolder *folder, const gchar *uid, CamelException *ex); - -static const CamelMessageInfo *vee_get_message_info (CamelFolder *folder, const char *uid); -static GPtrArray *vee_search_by_expression(CamelFolder *folder, const char *expression, CamelException *ex); - -static guint32 vee_get_message_flags (CamelFolder *folder, const char *uid); -static void vee_set_message_flags (CamelFolder *folder, const char *uid, guint32 flags, guint32 set); -static gboolean vee_get_message_user_flag (CamelFolder *folder, const char *uid, const char *name); -static void vee_set_message_user_flag (CamelFolder *folder, const char *uid, const char *name, gboolean value); - - -static void camel_vee_folder_class_init (CamelVeeFolderClass *klass); -static void camel_vee_folder_init (CamelVeeFolder *obj); -static void camel_vee_folder_finalise (CamelObject *obj); - -static void vee_folder_build(CamelVeeFolder *vf, CamelException *ex); -static void vee_folder_build_folder(CamelVeeFolder *vf, CamelFolder *source, CamelException *ex); - -static CamelFolderClass *camel_vee_folder_parent; - -CamelType -camel_vee_folder_get_type (void) -{ - static CamelType type = CAMEL_INVALID_TYPE; - - if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register (camel_folder_get_type (), "CamelVeeFolder", - sizeof (CamelVeeFolder), - sizeof (CamelVeeFolderClass), - (CamelObjectClassInitFunc) camel_vee_folder_class_init, - NULL, - (CamelObjectInitFunc) camel_vee_folder_init, - (CamelObjectFinalizeFunc) camel_vee_folder_finalise); - } - - return type; -} - -static void -camel_vee_folder_class_init (CamelVeeFolderClass *klass) -{ - CamelFolderClass *folder_class = (CamelFolderClass *) klass; - - camel_vee_folder_parent = CAMEL_FOLDER_CLASS(camel_type_get_global_classfuncs (camel_folder_get_type ())); - - folder_class->sync = vee_sync; - - folder_class->get_uids = vee_get_uids; - folder_class->free_uids = camel_folder_free_deep; - folder_class->get_summary = vee_get_summary; - folder_class->free_summary = camel_folder_free_nop; - folder_class->get_message = vee_get_message; - - folder_class->get_message_info = vee_get_message_info; - - folder_class->get_message_count = vee_get_message_count; - folder_class->get_unread_message_count = vee_get_unread_message_count; - folder_class->search_by_expression = vee_search_by_expression; - - folder_class->get_message_flags = vee_get_message_flags; - folder_class->set_message_flags = vee_set_message_flags; - folder_class->get_message_user_flag = vee_get_message_user_flag; - folder_class->set_message_user_flag = vee_set_message_user_flag; -} - -static void -camel_vee_folder_init (CamelVeeFolder *obj) -{ - struct _CamelVeeFolderPrivate *p; - CamelFolder *folder = (CamelFolder *)obj; - - p = _PRIVATE(obj) = g_malloc0(sizeof(*p)); - - folder->has_summary_capability = TRUE; - folder->has_search_capability = TRUE; - - /* FIXME: what to do about user flags if the subfolder doesn't support them? */ - folder->permanent_flags = CAMEL_MESSAGE_ANSWERED | - CAMEL_MESSAGE_DELETED | - CAMEL_MESSAGE_DRAFT | - CAMEL_MESSAGE_FLAGGED | - CAMEL_MESSAGE_SEEN; -} - -static void -camel_vee_folder_finalise (CamelObject *obj) -{ - CamelVeeFolder *vf = (CamelVeeFolder *)obj; - struct _CamelVeeFolderPrivate *p = _PRIVATE(vf); - GList *node; - - node = p->folders; - while (node) { - CamelFolder *f = node->data; - camel_object_unref((CamelObject *)f); - node = g_list_next(node); - } -} - -/** - * camel_vee_folder_new: - * @parent_store: the parent CamelVeeStore - * @name: the vfolder name - * @ex: a CamelException - * - * Create a new CamelVeeFolder object. - * - * Return value: A new CamelVeeFolder widget. - **/ -CamelFolder * -camel_vee_folder_new (CamelStore *parent_store, const char *name, - CamelException *ex) -{ - CamelFolder *folder; - CamelVeeFolder *vf; - char *namepart, *searchpart; - - folder = CAMEL_FOLDER (camel_object_new (camel_vee_folder_get_type())); - vf = (CamelVeeFolder *)folder; - - camel_folder_construct (folder, parent_store, name, name); - - namepart = g_strdup(name); - searchpart = strchr(namepart, '?'); - if (searchpart == NULL) { - /* no search, no result! */ - searchpart = "(body-contains \"=some-invalid_string-sequence=xx\")"; - } else { - *searchpart++ = 0; - } - - vf->messages = g_ptr_array_new(); - vf->messages_uid = g_hash_table_new(g_str_hash, g_str_equal); - - vf->expression = g_strdup(searchpart); - vf->vname = namepart; - - vee_folder_build(vf, ex); - if (camel_exception_is_set (ex)) { - camel_object_unref (CAMEL_OBJECT (folder)); - return NULL; - } - - return folder; -} - -static void -folder_changed(CamelFolder *sub, gpointer type, CamelVeeFolder *vf) -{ - CamelException *ex; - - ex = camel_exception_new(); - vee_folder_build_folder(vf, sub, ex); - camel_exception_free(ex); - /* FIXME: should only raise follow-on event if the result changed */ - camel_object_trigger_event( CAMEL_OBJECT(vf), "folder_changed", GINT_TO_POINTER(0)); -} - -/* track flag changes in the summary */ -static void -message_changed(CamelFolder *f, const char *uid, CamelVeeFolder *mf) -{ - const CamelMessageInfo *info; - CamelMessageInfo *vinfo; - CamelFlag *flag; - char *vuid; - - info = camel_folder_get_message_info(f, uid); - - vuid = g_strdup_printf("%p:%s", f, uid); - vinfo = (CamelMessageInfo *)vee_get_message_info((CamelFolder *)mf, vuid); - if (info && vinfo) { - vinfo->flags = info->flags; - camel_flag_list_free(&vinfo->user_flags); - flag = info->user_flags; - while (flag) { - camel_flag_set(&vinfo->user_flags, flag->name, TRUE); - flag = flag->next; - } - camel_object_trigger_event( CAMEL_OBJECT(mf), "message_changed", vinfo->uid); - } - g_free(vuid); -} - -void -camel_vee_folder_add_folder(CamelVeeFolder *vf, CamelFolder *sub) -{ - struct _CamelVeeFolderPrivate *p = _PRIVATE(vf); - CamelException *ex; - - camel_object_ref((CamelObject *)sub); - p->folders = g_list_append(p->folders, sub); - - camel_object_hook_event ((CamelObject *)sub, "folder_changed", (CamelObjectEventHookFunc) folder_changed, vf); - camel_object_hook_event ((CamelObject *)sub, "message_changed", (CamelObjectEventHookFunc) message_changed, vf); - - ex = camel_exception_new(); - vee_folder_build_folder(vf, sub, ex); - camel_exception_free(ex); - /* FIXME: should only raise follow-on event if the result changed */ - camel_object_trigger_event( CAMEL_OBJECT(vf), "folder_changed", GINT_TO_POINTER(0)); -} - - -static void -vee_sync (CamelFolder *folder, gboolean expunge, CamelException *ex) -{ - ; -} - -static gint vee_get_message_count (CamelFolder *folder) -{ - CamelVeeFolder *vf = (CamelVeeFolder *)folder; - - return vf->messages->len; -} - -static gint -vee_get_unread_message_count (CamelFolder *folder) -{ - CamelVeeFolder *vee_folder = CAMEL_VEE_FOLDER (folder); - CamelMessageInfo *info; - GPtrArray *infolist; - gint i, count = 0; - - g_return_val_if_fail (folder != NULL, -1); - - infolist = vee_folder->messages; - - for (i = 0; i < infolist->len; i++) { - info = (CamelMessageInfo *) g_ptr_array_index (infolist, i); - if (!(info->flags & CAMEL_MESSAGE_SEEN)) - count++; - } - - return count; -} - -static gboolean -get_real_message(CamelFolder *folder, const char *uid, CamelFolder **out_folder, const char **out_uid) -{ - CamelVeeMessageInfo *mi; - - mi = (CamelVeeMessageInfo *)vee_get_message_info(folder, uid); - g_return_val_if_fail(mi != NULL, FALSE); - - *out_folder = mi->folder; - *out_uid = strchr(mi->info.uid, ':')+1; - return TRUE; -} - -static CamelMimeMessage *vee_get_message(CamelFolder *folder, const gchar *uid, CamelException *ex) -{ - const char *real_uid; - CamelFolder *real_folder; - - if (!get_real_message(folder, uid, &real_folder, &real_uid)) { - camel_exception_setv(ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID, - "No such message %s in %s", uid, - folder->name); - return NULL; - } - - return camel_folder_get_message (real_folder, real_uid, ex); -} - -GPtrArray *vee_get_summary(CamelFolder *folder) -{ - CamelVeeFolder *vf = (CamelVeeFolder *)folder; - - return vf->messages; -} - -static const CamelMessageInfo *vee_get_message_info(CamelFolder *f, const char *uid) -{ - CamelVeeFolder *vf = (CamelVeeFolder *)f; - - return g_hash_table_lookup(vf->messages_uid, uid); -} - -static GPtrArray *vee_get_uids (CamelFolder *folder) -{ - GPtrArray *result; - int i; - CamelVeeFolder *vf = (CamelVeeFolder *)folder; - - result = g_ptr_array_new (); - g_ptr_array_set_size (result, vf->messages->len); - for (i=0;i<vf->messages->len;i++) { - CamelMessageInfo *mi = g_ptr_array_index(vf->messages, i); - result->pdata[i] = g_strdup(mi->uid); - } - - return result; -} - -static GPtrArray * -vee_search_by_expression(CamelFolder *folder, const char *expression, CamelException *ex) -{ - GList *node; - GPtrArray *matches, *result = g_ptr_array_new (); - char *expr; - CamelVeeFolder *vf = (CamelVeeFolder *)folder; - struct _CamelVeeFolderPrivate *p = _PRIVATE(vf); - - expr = g_strdup_printf("(and %s %s)", vf->expression, expression); - node = p->folders; - while (node) { - CamelFolder *f = node->data; - int i; - - matches = camel_folder_search_by_expression(f, expression, ex); - for (i = 0; i < matches->len; i++) { - char *uid = matches->pdata[i]; - g_ptr_array_add(result, g_strdup_printf("%p:%s", f, uid)); - } - camel_folder_search_free(f, matches); - node = g_list_next(node); - } - return result; -} - -static guint32 -vee_get_message_flags(CamelFolder *folder, const char *uid) -{ - const char *real_uid; - CamelFolder *real_folder; - - if (!get_real_message (folder, uid, &real_folder, &real_uid)) - return 0; - - return camel_folder_get_message_flags(real_folder, real_uid); -} - -static void -vee_set_message_flags(CamelFolder *folder, const char *uid, guint32 flags, guint32 set) -{ - const char *real_uid; - CamelFolder *real_folder; - - if (!get_real_message(folder, uid, &real_folder, &real_uid)) - return; - - camel_folder_set_message_flags(real_folder, real_uid, flags, set); -} - -static gboolean -vee_get_message_user_flag(CamelFolder *folder, const char *uid, const char *name) -{ - const char *real_uid; - CamelFolder *real_folder; - - if (!get_real_message(folder, uid, &real_folder, &real_uid)) - return FALSE; - - return camel_folder_get_message_user_flag(real_folder, real_uid, name); -} - -static void -vee_set_message_user_flag(CamelFolder *folder, const char *uid, - const char *name, gboolean value) -{ - const char *real_uid; - CamelFolder *real_folder; - - if (!get_real_message(folder, uid, &real_folder, &real_uid)) - return; - - return camel_folder_set_message_user_flag(real_folder, real_uid, name, value); -} - - -/* - need incremental update, based on folder. - Need to watch folders for changes and update accordingly. -*/ - -/* this does most of the vfolder magic */ -static void -vee_folder_build(CamelVeeFolder *vf, CamelException *ex) -{ - struct _CamelVeeFolderPrivate *p = _PRIVATE(vf); - GList *node; - int i; - GPtrArray *messages; - GHashTable *messages_uid; - - for (i=0;i<vf->messages->len;i++) { - CamelMessageInfo *mi = g_ptr_array_index(vf->messages, i); - camel_message_info_free(mi); - } - - messages = g_ptr_array_new(); - messages_uid = g_hash_table_new(g_str_hash, g_str_equal); - - node = p->folders; - while (node) { - GPtrArray *matches; - CamelFolder *f = node->data; - CamelVeeMessageInfo *mi; - const CamelMessageInfo *info; - int i; - - matches = camel_folder_search_by_expression(f, vf->expression, ex); - for (i = 0; i < matches->len; i++) { - info = camel_folder_get_message_info(f, matches->pdata[i]); - if (info) { - mi = g_malloc0(sizeof(*mi)); - camel_message_info_dup_to(info, (CamelMessageInfo *)mi); - g_free (mi->info.uid); - mi->info.uid = g_strdup_printf("%p:%s", f, info->uid); - mi->folder = f; - g_ptr_array_add(messages, mi); - g_hash_table_insert(messages_uid, mi->info.uid, mi); - } - } - camel_folder_search_free(f, matches); - node = g_list_next(node); - } - - g_ptr_array_free(vf->messages, TRUE); - vf->messages = messages; - g_hash_table_destroy(vf->messages_uid); - vf->messages_uid = messages_uid; -} - - -/* build query contents for a single folder */ -static void -vee_folder_build_folder(CamelVeeFolder *vf, CamelFolder *source, CamelException *ex) -{ - GPtrArray *matches; - CamelFolder *f = source; - CamelVeeMessageInfo *mi; - const CamelMessageInfo *info; - - GPtrArray *messages; - GHashTable *messages_uid; - int i; - - for (i=0;i<vf->messages->len;i++) { - CamelVeeMessageInfo *mi = g_ptr_array_index(vf->messages, i); - if (mi->folder == source) { - g_hash_table_remove(vf->messages_uid, mi->info.uid); - g_ptr_array_remove_index_fast(vf->messages, i); - - camel_message_info_free((CamelMessageInfo *)mi); - i--; - } - } - - messages = vf->messages; - messages_uid = vf->messages_uid; - - matches = camel_folder_search_by_expression(f, vf->expression, ex); - for (i = 0; i < matches->len; i++) { - info = camel_folder_get_message_info(f, matches->pdata[i]); - if (info) { - mi = g_malloc0(sizeof(*mi)); - camel_message_info_dup_to(info, (CamelMessageInfo*)mi); - g_free (mi->info.uid); - mi->info.uid = g_strdup_printf("%p:%s", f, info->uid); - mi->folder = f; - g_ptr_array_add(messages, mi); - g_hash_table_insert(messages_uid, mi->info.uid, mi); - } - } - camel_folder_search_free(f, matches); -} - - -/* - - (match-folder "folder1" "folder2") - - */ diff --git a/camel/providers/vee/camel-vee-folder.h b/camel/providers/vee/camel-vee-folder.h deleted file mode 100644 index 2263854912..0000000000 --- a/camel/providers/vee/camel-vee-folder.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef _CAMEL_VEE_FOLDER_H -#define _CAMEL_VEE_FOLDER_H - -#include <camel/camel-folder.h> - -#define CAMEL_VEE_FOLDER(obj) CAMEL_CHECK_CAST (obj, camel_vee_folder_get_type (), CamelVeeFolder) -#define CAMEL_VEE_FOLDER_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_vee_folder_get_type (), CamelVeeFolderClass) -#define IS_CAMEL_VEE_FOLDER(obj) CAMEL_CHECK_TYPE (obj, camel_vee_folder_get_type ()) - -typedef struct _CamelVeeFolder CamelVeeFolder; -typedef struct _CamelVeeFolderClass CamelVeeFolderClass; - -struct _CamelVeeFolder { - CamelFolder parent; - - struct _CamelVeeFolderPrivate *priv; - - char *expression; /* query expression */ - char *vname; /* local name */ - CamelFolder *local; /* local storage for folder */ - - /* FIXME: Move this to a summary object??? */ - GPtrArray *messages; /* message info's */ - GHashTable *messages_uid; -}; - -struct _CamelVeeFolderClass { - CamelFolderClass parent_class; -}; - -guint camel_vee_folder_get_type (void); -CamelFolder *camel_vee_folder_new (CamelStore *parent_store, - const char *name, - CamelException *ex); - -void camel_vee_folder_add_folder(CamelVeeFolder *vf, CamelFolder *sub); - -#endif /* ! _CAMEL_VEE_FOLDER_H */ diff --git a/camel/providers/vee/camel-vee-provider.c b/camel/providers/vee/camel-vee-provider.c deleted file mode 100644 index 4588fb77d3..0000000000 --- a/camel/providers/vee/camel-vee-provider.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "config.h" -#include "camel-vee-store.h" -#include "camel-provider.h" -#include "camel-session.h" -#include "camel-url.h" - -static CamelProvider vee_provider = { - "vfolder", - N_("Virtual folder email provider"), - - N_("For reading mail as a query of another set of folders"), - - "vfolder", - - 0, - - 0, - - { 0, 0 }, - - NULL -}; - -void -camel_provider_module_init (CamelSession *session) -{ - vee_provider.object_types[CAMEL_PROVIDER_STORE] = - camel_vee_store_get_type(); - - vee_provider.service_cache = g_hash_table_new (camel_url_hash, camel_url_equal); - - camel_session_register_provider (session, &vee_provider); -} diff --git a/camel/providers/vee/camel-vee-store.c b/camel/providers/vee/camel-vee-store.c deleted file mode 100644 index 7acc127542..0000000000 --- a/camel/providers/vee/camel-vee-store.c +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "camel-vee-store.h" -#include "camel-vee-folder.h" - -static CamelFolder *vee_get_folder (CamelStore *store, const char *folder_name, guint32 flags, CamelException *ex); -static char *vee_get_folder_name (CamelStore *store, const char *folder_name, CamelException *ex); - -struct _CamelVeeStorePrivate { -}; - -#define _PRIVATE(o) (((CamelVeeStore *)(o))->priv) - -static void camel_vee_store_class_init (CamelVeeStoreClass *klass); -static void camel_vee_store_init (CamelVeeStore *obj); - -static CamelStoreClass *camel_vee_store_parent; - -CamelType -camel_vee_store_get_type (void) -{ - static CamelType type = CAMEL_INVALID_TYPE; - - if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register (camel_store_get_type (), "CamelVeeStore", - sizeof (CamelVeeStore), - sizeof (CamelVeeStoreClass), - (CamelObjectClassInitFunc) camel_vee_store_class_init, - NULL, - (CamelObjectInitFunc) camel_vee_store_init, - NULL); - } - - return type; -} - -static void - -camel_vee_store_class_init (CamelVeeStoreClass *klass) -{ - CamelStoreClass *store_class = (CamelStoreClass *) klass; - - camel_vee_store_parent = CAMEL_STORE_CLASS(camel_type_get_global_classfuncs (camel_store_get_type ())); - - /* virtual method overload */ - store_class->get_folder = vee_get_folder; - store_class->get_folder_name = vee_get_folder_name; -} - -static void -camel_vee_store_init (CamelVeeStore *obj) -{ - struct _CamelVeeStorePrivate *p; - - p = _PRIVATE(obj) = g_malloc0(sizeof(*p)); -} - -/** - * camel_vee_store_new: - * - * Create a new CamelVeeStore object. - * - * Return value: A new CamelVeeStore widget. - **/ -CamelVeeStore * -camel_vee_store_new (void) -{ - CamelVeeStore *new = CAMEL_VEE_STORE ( camel_object_new (camel_vee_store_get_type ())); - return new; -} - -static CamelFolder * -vee_get_folder (CamelStore *store, const char *folder_name, guint32 flags, CamelException *ex) -{ - return camel_vee_folder_new (store, folder_name, ex); -} - -static char * -vee_get_folder_name (CamelStore *store, const char *folder_name, CamelException *ex) -{ - return g_strdup(folder_name); -} - diff --git a/camel/providers/vee/camel-vee-store.h b/camel/providers/vee/camel-vee-store.h deleted file mode 100644 index d4ed7a0610..0000000000 --- a/camel/providers/vee/camel-vee-store.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Michael Zucchi <notzed@helixcode.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef _CAMEL_VEE_STORE_H -#define _CAMEL_VEE_STORE_H - -#include <camel/camel-store.h> - -#define CAMEL_VEE_STORE(obj) CAMEL_CHECK_CAST (obj, camel_vee_store_get_type (), CamelVeeStore) -#define CAMEL_VEE_STORE_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_vee_store_get_type (), CamelVeeStoreClass) -#define IS_CAMEL_VEE_STORE(obj) CAMEL_CHECK_TYPE (obj, camel_vee_store_get_type ()) - -typedef struct _CamelVeeStore CamelVeeStore; -typedef struct _CamelVeeStoreClass CamelVeeStoreClass; - -struct _CamelVeeStore { - CamelStore parent; - - struct _CamelVeeStorePrivate *priv; -}; - -struct _CamelVeeStoreClass { - CamelStoreClass parent_class; -}; - -guint camel_vee_store_get_type (void); -CamelVeeStore *camel_vee_store_new (void); - -#endif /* ! _CAMEL_VEE_STORE_H */ diff --git a/camel/providers/vee/libcamelvee.urls b/camel/providers/vee/libcamelvee.urls deleted file mode 100644 index 6fa58dadb5..0000000000 --- a/camel/providers/vee/libcamelvee.urls +++ /dev/null @@ -1 +0,0 @@ -vfolder diff --git a/camel/string-utils.c b/camel/string-utils.c deleted file mode 100644 index 023aee16af..0000000000 --- a/camel/string-utils.c +++ /dev/null @@ -1,206 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* string-util : utilities for gchar* strings */ - -/* - * - * Authors: Bertrand Guiheneuf <bertrand@helixcode.com> - * Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> -#include "string-utils.h" -#include "string.h" - -gboolean -string_equal_for_glist (gconstpointer v, gconstpointer v2) -{ - return (!strcmp ( ((const gchar *)v), ((const gchar*)v2))) == 0; -} - -/* utility func : frees a gchar element in a GList */ -static void -__string_list_free_string (gpointer data, gpointer user_data) -{ - gchar *string = (gchar *)data; - g_free (string); -} - -void -string_list_free (GList *string_list) -{ - if (string_list == NULL) return; - - g_list_foreach (string_list, __string_list_free_string, NULL); - g_list_free (string_list); -} - -GList * -string_split (const gchar *string, char sep, const gchar *trim_chars, StringTrimOption trim_options) -{ - GList *result = NULL; - gint first, last, pos; - gchar *new_string; - - g_assert (string); - - first = 0; - last = strlen(string) - 1; - - /* strip leading and trailing separators */ - while ( (first<=last) && (string[first]==sep) ) - first++; - while ( (first<=last) && (string[last]==sep) ) - last--; - - - while (first<=last) { - pos = first; - /* find next separator */ - while ((pos<=last) && (string[pos]!=sep)) pos++; - if (first != pos) { - new_string = g_strndup (string+first, pos-first); - /* could do trimming in line to speed up this code */ - if (trim_chars) string_trim (new_string, trim_chars, trim_options); - result = g_list_append (result, new_string); - } - first = pos + 1; - } - - return result; -} - -void -string_trim (gchar *string, const gchar *trim_chars, StringTrimOption options) -{ - gint first_ok; - gint last_ok; - guint length; - - g_return_if_fail (string); - length = strlen (string); - if (length==0) - return; - - first_ok = 0; - last_ok = length - 1; - - if (options & STRING_TRIM_STRIP_LEADING) - while ( (first_ok <= last_ok) && (strchr (trim_chars, string[first_ok])!=NULL) ) - first_ok++; - - if (options & STRING_TRIM_STRIP_TRAILING) - while ( (first_ok <= last_ok) && (strchr (trim_chars, string[last_ok])!=NULL) ) - last_ok--; - - if (first_ok > 0) - memmove (string, string+first_ok, last_ok - first_ok + 1); - string[last_ok - first_ok +1] = '\0'; - -} - - -/** - * remove_suffix: remove a suffix from a string - * @s: the string to remove the suffix from. - * @suffix: the suffix to remove - * @suffix_found : suffix found flag - * - * Remove a suffix from a string. If the - * string ends with the full suffix, a copy - * of the string without the suffix is returned and - * @suffix_found is set to %TRUE. - * Otherwise, NULL is returned and - * @suffix_found is set to %FALSE. - * - * Return value: an allocated copy of the string without the suffix or NULL if the suffix was not found. - **/ -gchar * -string_prefix (const gchar *s, const gchar *suffix, gboolean *suffix_found) -{ - guint s_len, suf_len; - guint suffix_pos; - char *result_string; - - g_assert (s); - g_assert (suffix); - g_assert (suffix_found); - - s_len = strlen (s); - suf_len = strlen (suffix); - - /* if the string is shorter than the suffix, do nothing */ - if (s_len < suf_len) { - *suffix_found = FALSE; - return NULL; - } - - /* theoretical position of the prefix */ - suffix_pos = s_len - suf_len; - - /* compare the right hand side of the string with the suffix */ - if (!strncmp (s+suffix_pos, suffix, suf_len)) { - - /* if the suffix matches, check that there are - characters before */ - if (suffix_pos == 0) { - result_string = NULL; - *suffix_found = TRUE; - } else { - result_string = g_strndup (s, suffix_pos); - *suffix_found = TRUE; - } - - } else { - result_string = NULL; - *suffix_found = FALSE; - } - - return result_string; -} - -void -string_unquote (gchar *string) -{ - /* if the string is quoted, unquote it */ - - g_return_if_fail (string != NULL); - - if (*string == '"' && *(string + strlen (string) - 1) == '"') { - *(string + strlen (string) - 1) = '\0'; - if (*string) - memmove (string, string+1, strlen (string)); - } -} - -gchar * -strip (gchar *string, gchar c) -{ - /* strip all occurances of c from the string */ - gchar *src, *dst; - - g_return_val_if_fail (string != NULL, NULL); - - for (src = dst = string; *src; src++) - if (*src != c) - *dst++ = *src; - *dst = '\0'; - - return string; -} diff --git a/camel/string-utils.h b/camel/string-utils.h deleted file mode 100644 index 1556faa1df..0000000000 --- a/camel/string-utils.h +++ /dev/null @@ -1,68 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* string-util : utilities for normal gchar * strings */ - -/* - * - * Authors: Bertrand Guiheneuf <bertrand@helixcode.com> - * Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - - -#ifndef STRING_UTIL_H -#define STRING_UTIL_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <glib.h> - -typedef enum { - STRING_TRIM_NONE = 0, - STRING_TRIM_STRIP_TRAILING = 1, - STRING_TRIM_STRIP_LEADING = 2 -} StringTrimOption; - - - -gboolean string_equal_for_glist (gconstpointer v, gconstpointer v2); - -void string_list_free (GList *string_list); - -GList *string_split (const gchar *string, char sep, - const gchar *trim_chars, StringTrimOption trim_options); -void string_trim (gchar *string, const gchar *chars, - StringTrimOption options); - -gchar *string_prefix (const gchar *s, const gchar *suffix, - gboolean *suffix_found); - -void string_unquote (gchar *string); - -gchar *strip (gchar *string, gchar c); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* STRING_UTIL_H */ |