static Octstr *mm7http_send(MmscGrp *mmc, Octstr *from, Octstr *to, MmsMsg *m, Octstr **error, int *retry) { Octstr *ret = NULL; int mtype = mms_messagetype(m); int hstatus = HTTP_OK; List *rh, *ph = NULL; Octstr *body = NULL, *rbody = NULL; Octstr *mms; MIMEEntity *form_data = make_multipart_formdata(); mms_info(0, "MM7", mmc->id, "MMSBox: Send [http] to MMC[%s], msg type [%s], from %s, to %s", mmc ? octstr_get_cstr(mmc->id) : "", mms_message_type_to_cstr(mtype), octstr_get_cstr(from), octstr_get_cstr(to)); mms = mms_tobinary(m); add_multipart_form_field(form_data, "to", "text/plain", NULL, to); add_multipart_form_field(form_data, "from", "text/plain", NULL, from); add_multipart_form_field(form_data, "mms", "application/vnd.wap.mms-message", NULL, mms); rh = mime_entity_headers(form_data); body = mime_entity_body(form_data); hstatus = mmsbox_url_fetch_content(HTTP_METHOD_POST, mmc->mmsc_url, rh, body, &ph, &rbody); if (http_status_class(hstatus) != HTTP_STATUS_SUCCESSFUL) { *error = octstr_format("Failed to contact MMC[url=%S] => HTTP returned status = %d !", mmc->mmsc_url, hstatus); } else { ret = rbody ? octstr_duplicate(rbody) : NULL; if (ret) octstr_strip_blanks(ret); } *retry = (ret == NULL && (http_status_class(hstatus) == HTTP_STATUS_SERVER_ERROR || hstatus < 0)); if (ret) mms_log2("Sent", from, to, -1, ret, NULL, mmc->id, "MMSBox", NULL, NULL); http_destroy_headers(rh); octstr_destroy(body); http_destroy_headers(ph); octstr_destroy(rbody); octstr_destroy(mms); mime_entity_destroy(form_data); return ret; }
int operate_single_mime(Octstr *p_psoHdrs, MIMEEntity *p_psoMIME, const char *p_pszWebDir) { int iRetVal = 0; Octstr *psoHdrName = NULL, *psoHdrValue = NULL; Octstr *psoMIMEOStr = NULL, *psoFileName = NULL; List *psoHdrList = NULL; int iFile = -1; if(psoMIMEOStr) { octstr_destroy(psoMIMEOStr); } /* выбираем необходимые заголовки */ psoHdrList = mime_entity_headers(p_psoMIME); /* Content-type */ psoHdrName = octstr_create("Content-type"); psoHdrValue = http_header_value(psoHdrList, psoHdrName); if(0 == strncasecmp("application/smil", octstr_get_cstr(psoHdrValue), 16)) { goto done; } octstr_format_append(p_psoHdrs, "\r\n"); octstr_format_append(p_psoHdrs, "\r\n%S;%S", psoHdrName, psoHdrValue); octstr_truncate(psoHdrName, 0); /* Content-location */ octstr_append_cstr(psoHdrName, "Content-location"); psoHdrValue = http_header_value(psoHdrList, psoHdrName); octstr_format_append(p_psoHdrs, "\r\n%S;%S", psoHdrName, psoHdrValue); octstr_truncate(psoHdrName, 0); /**/ /* формируем имя файла */ psoFileName = octstr_create(p_pszWebDir); if('/' != octstr_get_char(psoFileName, octstr_len(psoFileName) - 1)) { octstr_append_char(psoFileName, '/'); } octstr_append(psoFileName, psoHdrValue); /* создаем файл */ iFile = open(octstr_get_cstr(psoFileName), O_CREAT | O_EXCL | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); if(0 > iFile) { if(errno != EEXIST) { iRetVal = 7; goto done; } } psoMIMEOStr = mime_entity_body(p_psoMIME); octstr_base64_to_binary(psoMIMEOStr); if(octstr_len(psoMIMEOStr) != write(iFile, octstr_get_cstr(psoMIMEOStr), octstr_len(psoMIMEOStr))) { iRetVal = 8; goto done; } done: if(psoHdrName) { octstr_destroy(psoHdrName); } if(psoFileName) { octstr_destroy(psoFileName); } if(0 < iFile) { close(iFile); } return iRetVal; }