| Chuck Hagenbuch <chuck@horde.org> |
| Andrew Skalski <askalski@chekinc.com> |
| Hartmut Holzgraefe <hartmut@six.de> |
+ | Jani Taskinen <sniper@iki.fi> |
| PHP 4.0 updates: Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
PART *mypart=NULL, *toppart=NULL, *part;
PARAMETER *param;
char tmp[8*MAILTMPLEN], *mystring=NULL, *t, *tempstring;
-
int myargc = ZEND_NUM_ARGS();
+
if (myargc != 2 || zend_get_parameters_ex(myargc, &envelope, &body) == FAILURE) {
ZEND_WRONG_PARAM_COUNT();
}
-
- convert_to_writable_array_ex(envelope);
- convert_to_writable_array_ex(body);
+
+ if ((*envelope)->type != IS_ARRAY) {
+ php_error(E_WARNING, "IMAP: Expected Array as envelope parameter");
+ RETURN_FALSE;
+ }
+
+ if ((*body)->type != IS_ARRAY) {
+ php_error(E_WARNING, "IMAP: Expected Array as body parameter");
+ RETURN_FALSE;
+ }
+
env=mail_newenvelope();
if (zend_hash_find(Z_ARRVAL_PP(envelope), "remail", sizeof("remail"), (void **) &pvalue)== SUCCESS) {
convert_to_string_ex(pvalue);
convert_to_string_ex(pvalue);
env->message_id=cpystr(Z_STRVAL_PP(pvalue));
}
-
+
zend_hash_internal_pointer_reset(Z_ARRVAL_PP(body));
- for (;;) {
- if (zend_hash_get_current_data(Z_ARRVAL_PP(body), (void **) &data)==FAILURE) {
- break;
+ zend_hash_get_current_data(Z_ARRVAL_PP(body), (void **) &data);
+ zend_hash_get_current_key(Z_ARRVAL_PP(body), &key, &ind);
+
+ if (Z_TYPE_PP(data) == IS_ARRAY) {
+ bod=mail_newbody();
+ topbod=bod;
+
+ if (zend_hash_find(Z_ARRVAL_PP(data), "type", sizeof("type"), (void **) &pvalue)== SUCCESS) {
+ convert_to_long_ex(pvalue);
+ bod->type = (short) Z_LVAL_PP(pvalue);
+ }
+ if (zend_hash_find(Z_ARRVAL_PP(data), "encoding", sizeof("encoding"), (void **) &pvalue)== SUCCESS) {
+ convert_to_long_ex(pvalue);
+ bod->encoding = (short) Z_LVAL_PP(pvalue);
+ }
+ if (zend_hash_find(Z_ARRVAL_PP(data), "subtype", sizeof("subtype"), (void **) &pvalue)== SUCCESS) {
+ convert_to_string_ex(pvalue);
+ bod->subtype = cpystr(Z_STRVAL_PP(pvalue));
+ }
+ if (zend_hash_find(Z_ARRVAL_PP(data), "id", sizeof("id"), (void **) &pvalue)== SUCCESS) {
+ convert_to_string_ex(pvalue);
+ bod->id = cpystr(Z_STRVAL_PP(pvalue));
+ }
+ if (zend_hash_find(Z_ARRVAL_PP(data), "contents.data", sizeof("contents.data"), (void **) &pvalue)== SUCCESS) {
+ convert_to_string_ex(pvalue);
+ bod->contents.text.data = (char *) fs_get(Z_STRLEN_PP(pvalue));
+ memcpy(bod->contents.text.data, Z_STRVAL_PP(pvalue), Z_STRLEN_PP(pvalue)+1);
+ bod->contents.text.size = Z_STRLEN_PP(pvalue);
}
- zend_hash_get_current_key(Z_ARRVAL_PP(body), &key, &ind);
+ if (zend_hash_find(Z_ARRVAL_PP(data), "lines", sizeof("lines"), (void **) &pvalue)== SUCCESS) {
+ convert_to_long_ex(pvalue);
+ bod->size.lines = Z_LVAL_PP(pvalue);
+ }
+ if (zend_hash_find(Z_ARRVAL_PP(data), "bytes", sizeof("bytes"), (void **) &pvalue)== SUCCESS) {
+ convert_to_long_ex(pvalue);
+ bod->size.bytes = Z_LVAL_PP(pvalue);
+ }
+ if (zend_hash_find(Z_ARRVAL_PP(data), "md5", sizeof("md5"), (void **) &pvalue)== SUCCESS) {
+ convert_to_string_ex(pvalue);
+ bod->md5 = cpystr(Z_STRVAL_PP(pvalue));
+ }
+ }
+
+ zend_hash_move_forward(Z_ARRVAL_PP(body));
+
+ while(zend_hash_get_current_data(Z_ARRVAL_PP(body), (void **) &data) == SUCCESS) {
+ zend_hash_get_current_key(Z_ARRVAL_PP(body), &key, &ind);
if (Z_TYPE_PP(data) == IS_ARRAY) {
- bod=mail_newbody();
- topbod=bod;
+ if (!toppart) {
+ bod->nested.part=mail_newbody_part();
+ mypart=bod->nested.part;
+ toppart=mypart;
+ bod=&mypart->body;
+ } else {
+ mypart->next=mail_newbody_part();
+ mypart=mypart->next;
+ bod=&mypart->body;
+ }
+
if (zend_hash_find(Z_ARRVAL_PP(data), "type", sizeof("type"), (void **) &pvalue)== SUCCESS) {
convert_to_long_ex(pvalue);
bod->type = (short) Z_LVAL_PP(pvalue);
}
if (zend_hash_find(Z_ARRVAL_PP(data), "subtype", sizeof("subtype"), (void **) &pvalue)== SUCCESS) {
convert_to_string_ex(pvalue);
- bod->subtype = cpystr(Z_STRVAL_PP(pvalue));
+ bod->subtype = cpystr(Z_STRVAL_PP(pvalue));
}
if (zend_hash_find(Z_ARRVAL_PP(data), "id", sizeof("id"), (void **) &pvalue)== SUCCESS) {
convert_to_string_ex(pvalue);
convert_to_string_ex(pvalue);
bod->md5 = cpystr(Z_STRVAL_PP(pvalue));
}
- }
- zend_hash_move_forward(Z_ARRVAL_PP(body));
- if (!toppart) {
- bod->nested.part=mail_newbody_part();
- mypart=bod->nested.part;
- toppart=mypart;
- bod=&mypart->body;
- } else {
- mypart->next=mail_newbody_part();
- mypart=mypart->next;
- bod=&mypart->body;
+
+ zend_hash_move_forward(Z_ARRVAL_PP(body));
}
}
strcpy(mystring, tmp);
bod=topbod;
- switch (bod->type) {
- case TYPEMULTIPART: /* multipart gets special handling */
- part = bod->nested.part; /* first body part */
- /* find cookie */
+
+ if (bod && bod->type == TYPEMULTIPART) {
+
+ /* first body part */
+ part = bod->nested.part;
+
+ /* find cookie */
for (param = bod->parameter; param && !cookie; param = param->next) {
if (!strcmp (param->attribute, "BOUNDARY")) {
cookie = param->value;
}
}
+
+ /* yucky default */
if (!cookie) {
- cookie = "-"; /* yucky default */
+ cookie = "-";
}
- do { /* for each part */
- /* build cookie */
+
+ /* for each part */
+ do {
+ /* build cookie */
sprintf (t=tmp, "--%s\015\012", cookie);
- /* append mini-header */
+
+ /* append mini-header */
rfc822_write_body_header(&t, &part->body);
- strcat (t, "\015\012"); /* write terminating blank line */
- /* output cookie, mini-header, and contents */
+
+ /* write terminating blank line */
+ strcat (t, "\015\012");
+
+ /* output cookie, mini-header, and contents */
tempstring=emalloc(strlen(mystring)+strlen(tmp)+1);
strcpy(tempstring,mystring);
efree(mystring);
efree(mystring);
mystring=tempstring;
strcat(mystring,tmp);
- break;
- default: /* all else is text now */
+
+ } else if(bod) {
+
tempstring=emalloc(strlen(bod->contents.text.data)+strlen(mystring)+1);
strcpy(tempstring,mystring);
efree(mystring);
mystring=tempstring;
strcat(mystring, bod->contents.text.data);
- break;
+
+ } else {
+ efree(mystring);
+ RETURN_FALSE;
}
- RETURN_STRINGL(mystring,strlen(mystring), 1);
+ RETVAL_STRINGL(mystring,strlen(mystring), 1);
+ efree(tempstring);
+
}
/* }}} */