Re: Patch: Add INTERNALDATE to imap_append()

From: Date: Wed, 21 Oct 2009 16:44:21 +0000
Subject: Re: Patch: Add INTERNALDATE to imap_append()
References: 1 2 3  Groups: php.internals 
Request: Send a blank email to internals+get-45858@lists.php.net to get a copy of this message
1. Top-posting is considered evil. 2. Look harder, timelib_* has several functions for this, be creative.. 3. Tabs instead of spaces, NO C++ comments! --Jani On 10/21/2009 06:37 PM, Nick Fortenberry wrote:
Hey Jani, We looked through the date library but it doesn't look like there are any functions to verify that a date is in a certain format. Unless we are mistaken, it looks like the only way to verify this would be to use a regex. Also, we read through CODING_STANDARDS and it said to be generous with whitespace and brackets. Were you referring to something in particular with regards to whitespace? Thanks, Nick -----Original Message----- From: "Jani Taskinen"<jani.taskinen@iki.fi> Sent: Wednesday, October 21, 2009 2:55am To: "Nick Fortenberry"<nick@mailtrust.com> Cc: internals@lists.php.net Subject: Re: [PHP-DEV] Patch: Add INTERNALDATE to imap_append() On 10/21/2009 01:10 AM, Nick Fortenberry wrote:
Hey everyone, Jake Levitt and I created this patch which adds the option to set a message's INTERNALDATE when appending it to a mail server using imap. Any chance we can get this included into the php 5.3 and 6 development branches? The diff below was done against the php-src/branches/PHP_5_3 branch. If you guys need me to apply the changes to a different branch or snapshot, please let me know. Here's the svn diff (done in my repo).. if you need something else please let me know:
There are several problems with it. Whitespace and C++ comments being the least. :) We have ext/date which is always there, I suggest you use those functions to handle dates instead of flaky regexps. --Jani
Index: ext/imap/php_imap.c ===================================================================
--- ext/imap/php_imap.c        (revision 3405)
+++ ext/imap/php_imap.c        (revision 3406)
@@ -41,6 +41,7 @@ #include "ext/standard/info.h" #include "ext/standard/file.h" #include "ext/standard/php_smart_str.h" +#include "ext/pcre/php_pcre.h" #ifdef ERROR #undef ERROR @@ -118,6 +119,7 @@
         ZEND_ARG_INFO(0, folder)
         ZEND_ARG_INFO(0, message)
         ZEND_ARG_INFO(0, options)
+        ZEND_ARG_INFO(0, date)
ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_imap_num_msg, 0, 0, 1) @@ -1270,20 +1272,43 @@ PHP_FUNCTION(imap_append) {
         zval *streamind;
-        char *folder, *message, *flags = NULL;
-        int folder_len, message_len, flags_len = 0;
+        char *folder, *message, *date = NULL, *flags = NULL;
+        int folder_len, message_len, date_len = 0, flags_len = 0;
         pils *imap_le_struct;
         STRING st;
-        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss|s",&streamind,&folder,&folder_len,&message,&message_len,&flags,&flags_len) == FAILURE) {
+        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss|ss",&streamind,&folder,&folder_len,&message,&message_len,&flags,&flags_len,&date,&date_len) == FAILURE) {
                 return;
         }
+        char* regex = "/[ 0-3][0-9]-((Jan)|(Feb)|(Mar)|(Apr)|(May)|(Jun)|(Jul)|(Aug)|(Sep)|(Oct)|(Nov)|(Dec))-[0-9]{4} [0-2][0-9]:[0-5][0-9]:[0-5][0-9] [+-][0-9]{4}/";
+        int regex_len = strlen(regex);
+        pcre_cache_entry *pce;                                //Compiled regex
+        zval *subpats = NULL;                                //Parts (not used)
+        long regex_flags = 0;                                //Flags (not used)
+        long start_offset = 0;                                //Start offset (not used)
+        int global = 0;
+
+        if (date) {
+                //Make sure the given date string matches the RFC specified format
+                if ((pce = pcre_get_compiled_regex_cache(regex, regex_len TSRMLS_CC)) == NULL) {
+                        RETURN_FALSE;
+                }
+
+                php_pcre_match_impl(pce, date, date_len, return_value, subpats, global,
+                        0, regex_flags, start_offset TSRMLS_CC);
+
+                if (!Z_LVAL_P(return_value)) {
+                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "internal date not correctly formatted");
+                        date = NULL;
+                }
+        }
+
         ZEND_FETCH_RESOURCE(imap_le_struct, pils *,&streamind, -1, "imap", le_imap);
         INIT (&st, mail_string, (void *) message, message_len);
-        if (mail_append_full(imap_le_struct->imap_stream, folder, (flags ? flags : NIL), NIL,&st)) {
+        if (mail_append_full(imap_le_struct->imap_stream, folder, (flags ? flags : NIL), (date ? date : NIL),&st)) {
                 RETURN_TRUE;
         } else {
                 RETURN_FALSE;
Thanks, - Nick Fortenberry


« previous php.internals (#45858) next »