Here is my attempt at a unified diff against the current CVS. Let me
know if I need to do anything differently.
-Brad
---------------------- diff for php_imap.c -----------------------
--- php_imap.c
+++ php_imap.c Tue Feb 26 23:00:58 2002
@@ -91,6 +91,7 @@
PHP_FE(imap_bodystruct,
NULL)
PHP_FE(imap_fetchbody,
NULL)
PHP_FE(imap_fetchheader,
NULL)
+
PHP_FE(imap_fetch_header,
NULL)
PHP_FE(imap_fetchstructure,
NULL)
PHP_FE(imap_expunge,
NULL)
PHP_FE(imap_delete,
NULL)
@@ -2582,6 +2583,99 @@
RETVAL_STRING(mail_fetchheader_full(imap_le_struct->imap_stream,
Z_LVAL_PP(msgno), NIL, NIL, (myargc == 3 ? Z_LVAL_PP(flags) : NIL)), 1);
}
/* }}} */
+
+
+
+/* {{{ proto string imap_fetch_header(int stream_id, int msg_no [,
string section [, array lines [, int options]]])
+ Get the (optionally filtered) header for a given section of a
message */
+PHP_FUNCTION(imap_fetch_header)
+{
+/*
+ NOTE: You need to explicitly set FT_PEEK to not mark message as READ
when calling this function.
+ Empty strings are ignored in the lines array.
+*/
+ zval **streamind, **msgno, **sec = NIL, **lines = NIL, **flags,
**tmp;
+ int i, ind, ind_type, msgindex;
+ pils *imap_le_struct;
+ int myargc = ZEND_NUM_ARGS();
+ HashPosition pos;
+ STRINGLIST *cur_lines = NIL, *cur;
+
+ if (myargc < 2 ||
+ myargc > 5 ||
+ zend_get_parameters_ex(myargc, &streamind, &msgno, &sec,
&lines, &flags) == FAILURE)
+ {
+ ZEND_WRONG_PARAM_COUNT();
+ } //if
+
+ convert_to_long_ex(streamind);
+ convert_to_long_ex(msgno);
+
+ if (myargc > 2) {
+ convert_to_string_ex(sec);
+ } //if
+
+ /* Convert the <lines> array to a STRINGLIST */
+ if (myargc > 3) {
+ convert_to_array_ex(lines);
+
+ zend_hash_internal_pointer_reset_ex((*lines)->value.ht,
&pos);
+ while
(zend_hash_get_current_data_ex((*lines)->value.ht, (void **) &tmp, &pos)
== SUCCESS) {
+ convert_to_string_ex(tmp);
+
+ // Only add to the filter list if not an empty
string
+ if (*Z_STRVAL_PP(tmp)) {
+ if (cur_lines) {
+ cur->next =
mail_newstringlist();
+ cur = cur->next;
+ } else {
+ cur_lines =
mail_newstringlist();
+ cur = cur_lines;
+ } //if
+
+ cur->LSIZE = (*tmp)->value.str.len;
+ cur->LTEXT = (char*)
cpystr((*tmp)->value.str.val);
+ } //if
+
+ zend_hash_move_forward_ex((*lines)->value.ht,
&pos);
+ } //while
+ } //if
+
+ if (myargc == 5) {
+ convert_to_long_ex(flags);
+ } //if
+ ind = Z_LVAL_PP(streamind);
+
+ imap_le_struct = (pils *) zend_list_find(ind, &ind_type);
+// if (!imap_le_struct || !IS_STREAM(ind_type)) {
+ if (!imap_le_struct) {
+ php_error(E_WARNING, "Unable to find stream pointer");
+ RETURN_FALSE;
+ } //if
+
+ if ((myargc == 5) && (Z_LVAL_PP(flags) & FT_UID)) {
+ /* This should be cached; if it causes an extra RTT to the
+ IMAP server, then that's the price we pay for making sure
+ we don't crash. */
+ msgindex = mail_msgno(imap_le_struct->imap_stream,
Z_LVAL_PP(msgno));
+ } else {
+ msgindex = Z_LVAL_PP(msgno);
+ } //if
+ if ((msgindex < 1) || ((unsigned) msgindex >
imap_le_struct->imap_stream->nmsgs)) {
+ php_error(E_WARNING, "Bad message number");
+ RETURN_FALSE;
+ } //if
+
+ /* Perform the header fetch */
+ RETVAL_STRING(mail_fetch_header(imap_le_struct->imap_stream,
Z_LVAL_PP(msgno), Z_STRVAL_PP(sec),
+ cur_lines, NIL, myargc==5 ?
Z_LVAL_PP(flags) : NIL), 1);
+
+ /* Free the temporary string list */
+ mail_free_stringlist(&cur_lines);
+} // PHP_FUNCTION(imap_fetch_header)
+/* }}} */
+
+
/* {{{ proto int imap_uid(int stream_id, int msg_no)
Get the unique message id associated with a standard sequential
message number */
---------------------- diff for php_imap.h -----------------------
--- php_imap.h
+++ php_imap.h Tue Feb 26 23:01:17 2002
@@ -149,6 +149,7 @@
PHP_FUNCTION(imap_setflag_full);
PHP_FUNCTION(imap_clearflag_full);
PHP_FUNCTION(imap_sort);
+PHP_FUNCTION(imap_fetch_header);
PHP_FUNCTION(imap_fetchheader);
PHP_FUNCTION(imap_fetchtext);
PHP_FUNCTION(imap_uid);
--- php_imap.c
+++ php_imap.c Tue Feb 26 23:00:58 2002
@@ -91,6 +91,7 @@
PHP_FE(imap_bodystruct, NULL)
PHP_FE(imap_fetchbody, NULL)
PHP_FE(imap_fetchheader, NULL)
+ PHP_FE(imap_fetch_header, NULL)
PHP_FE(imap_fetchstructure, NULL)
PHP_FE(imap_expunge, NULL)
PHP_FE(imap_delete,
NULL)
@@ -2582,6 +2583,99 @@
RETVAL_STRING(mail_fetchheader_full(imap_le_struct->imap_stream,
Z_LVAL_PP(msgno), NIL, NIL, (myargc == 3 ? Z_LVAL_PP(flags) : NIL)), 1);
}
/* }}} */
+
+
+
+/* {{{ proto string imap_fetch_header(int stream_id, int msg_no [, string section [,
+array lines [, int options]]])
+ Get the (optionally filtered) header for a given section of a message */
+PHP_FUNCTION(imap_fetch_header)
+{
+/*
+ NOTE: You need to explicitly set FT_PEEK to not mark message as READ when calling
+this function.
+ Empty strings are ignored in the lines array.
+*/
+ zval **streamind, **msgno, **sec = NIL, **lines = NIL, **flags, **tmp;
+ int i, ind, ind_type, msgindex;
+ pils *imap_le_struct;
+ int myargc = ZEND_NUM_ARGS();
+ HashPosition pos;
+ STRINGLIST *cur_lines = NIL, *cur;
+
+ if (myargc < 2 ||
+ myargc > 5 ||
+ zend_get_parameters_ex(myargc, &streamind, &msgno, &sec, &lines, &flags)
+== FAILURE)
+ {
+ ZEND_WRONG_PARAM_COUNT();
+ } //if
+
+ convert_to_long_ex(streamind);
+ convert_to_long_ex(msgno);
+
+ if (myargc > 2) {
+ convert_to_string_ex(sec);
+ } //if
+
+ /* Convert the <lines> array to a STRINGLIST */
+ if (myargc > 3) {
+ convert_to_array_ex(lines);
+
+ zend_hash_internal_pointer_reset_ex((*lines)->value.ht, &pos);
+ while (zend_hash_get_current_data_ex((*lines)->value.ht, (void **)
+&tmp, &pos) == SUCCESS) {
+ convert_to_string_ex(tmp);
+
+ // Only add to the filter list if not an empty string
+ if (*Z_STRVAL_PP(tmp)) {
+ if (cur_lines) {
+ cur->next = mail_newstringlist();
+ cur = cur->next;
+ } else {
+ cur_lines = mail_newstringlist();
+ cur = cur_lines;
+ } //if
+
+ cur->LSIZE = (*tmp)->value.str.len;
+ cur->LTEXT = (char*) cpystr((*tmp)->value.str.val);
+ } //if
+
+ zend_hash_move_forward_ex((*lines)->value.ht, &pos);
+ } //while
+ } //if
+
+ if (myargc == 5) {
+ convert_to_long_ex(flags);
+ } //if
+ ind = Z_LVAL_PP(streamind);
+
+ imap_le_struct = (pils *) zend_list_find(ind, &ind_type);
+// if (!imap_le_struct || !IS_STREAM(ind_type)) {
+ if (!imap_le_struct) {
+ php_error(E_WARNING, "Unable to find stream pointer");
+ RETURN_FALSE;
+ } //if
+
+ if ((myargc == 5) && (Z_LVAL_PP(flags) & FT_UID)) {
+ /* This should be cached; if it causes an extra RTT to the
+ IMAP server, then that's the price we pay for making sure
+ we don't crash. */
+ msgindex = mail_msgno(imap_le_struct->imap_stream, Z_LVAL_PP(msgno));
+ } else {
+ msgindex = Z_LVAL_PP(msgno);
+ } //if
+ if ((msgindex < 1) || ((unsigned) msgindex >
+imap_le_struct->imap_stream->nmsgs)) {
+ php_error(E_WARNING, "Bad message number");
+ RETURN_FALSE;
+ } //if
+
+ /* Perform the header fetch */
+ RETVAL_STRING(mail_fetch_header(imap_le_struct->imap_stream,
+Z_LVAL_PP(msgno), Z_STRVAL_PP(sec),
+ cur_lines, NIL, myargc==5 ? Z_LVAL_PP(flags)
+: NIL), 1);
+
+ /* Free the temporary string list */
+ mail_free_stringlist(&cur_lines);
+} // PHP_FUNCTION(imap_fetch_header)
+/* }}} */
+
+
/* {{{ proto int imap_uid(int stream_id, int msg_no)
Get the unique message id associated with a standard sequential message number */
--- php_imap.h
+++ php_imap.h Tue Feb 26 23:01:17 2002
@@ -149,6 +149,7 @@
PHP_FUNCTION(imap_setflag_full);
PHP_FUNCTION(imap_clearflag_full);
PHP_FUNCTION(imap_sort);
+PHP_FUNCTION(imap_fetch_header);
PHP_FUNCTION(imap_fetchheader);
PHP_FUNCTION(imap_fetchtext);
PHP_FUNCTION(imap_uid);
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php