MmsTransaction* mms_transaction_create(char* gateway, int gateway_port, char* mmsc, int mmsc_port, int timeout_usec) { MmsTransaction* thiz = NULL; mms_return_val_if_fail(mmsc != NULL && mmsc_port > 0, NULL); mms_return_val_if_fail(gateway != NULL && gateway_port > 0, NULL); thiz = (MmsTransaction*)mms_calloc(1, sizeof(MmsTransaction)); if(thiz != NULL) { thiz->recv_mms = mms_create(); thiz->resp_header = mms_header_create(mms_header_unpack_item, mms_header_pack_item); mms_header_set_unpack_end_at_content_type(thiz->resp_header, 1); if ((thiz->http_trans = http_transaction_create(gateway, gateway_port, timeout_usec)) != NULL) { http_transaction_set_header(thiz->http_trans, "User-Agent", MMS_USER_AGENT); http_transaction_set_header(thiz->http_trans, "Accept", "*/*"); http_transaction_set_header(thiz->http_trans, "Accept-Language", "zh"); http_transaction_set_header(thiz->http_trans, "Profile", "http://www.htcmms.com.tw/gen/wizard-1.0.xml"); http_transaction_set_header(thiz->http_trans, "Content-Type", "application/vnd.wap.mms-message"); http_transaction_set_header(thiz->http_trans, "Accept-Charset", "ISO-8859-1"); http_transaction_set_header(thiz->http_trans, "Progma", "no-cache"); } else { mms_transaction_destroy (thiz); thiz = NULL; } } return thiz; }
static void test_send(char* host, int port, char* url, char* filename) { char* buffer = NULL; size_t length = 0; Mms* mms = NULL; MmsHeader* header = NULL; MmsTransaction* thiz = NULL; MmsInputBuffer* input = NULL; if((buffer = mms_read_binary_file(filename, &length)) != NULL) { mms = mms_create(); input = mms_input_buffer_create(buffer, length); mms_unpack(mms, input); mms_dump(mms, NULL); mms_fix_nokia(mms); thiz = mms_transaction_create(host, port, "mmsc.monternet.com", 80, 0); mms_transaction_send(thiz, url, mms, &header); MMS_PRINTF("HTTP/1.1 %d\n", mms_transaction_get_resp_code(thiz)); mms_header_dump(header, NULL); mms_input_buffer_destroy(input); mms_destroy(mms); mms_free(buffer); mms_transaction_destroy(thiz); } return; }
/* Code mainly written by Nicolas BENOIT */ static int run_launch_mms(MMSDownloadStruct* pStruct) { lien_back* back = pStruct->pBack; httrackp* opt = pStruct->pOpt; /* */ char url[HTS_URLMAXSIZE*2]; char catbuff[CATBUFF_SIZE]; char catbuff2[CATBUFF_SIZE]; MMS *mms; FILE *f; ssize_t len_written; uint64_t total_len_written; int delay = opt->mms_maxtime; time_t end = time(NULL) + delay; short checkPending = 0; ssize_t existingSize = fsize(back->url_sav); // effacer strcpybuff(back->r.msg,""); back->status=STATUS_FTP_TRANSFER; back->r.statuscode=HTTP_OK; back->r.size=0; /* Create file */ if (existingSize > 0) { /* back->r.out = fileappend(back->url_sav); */ (void) unlink(fconcat(catbuff,back->url_sav, ".old")); if (rename(fconcat(catbuff,back->url_sav, ""), fconcat(catbuff2,back->url_sav, ".old")) == 0) { checkPending = 1; } back->r.out = filecreate(&pStruct->pOpt->state.strc, back->url_sav); } else { back->r.out = filecreate(&pStruct->pOpt->state.strc, back->url_sav); } if ((f = back->r.out) != NULL) { // create mms resource strcpybuff(url, back->url_adr); /* mms:// */ strcatbuff(url, back->url_fil); if ( ( mms = mms_create( url, f, NULL, 0, 1 ) ) != NULL ) { if ( mms_connect ( mms ) == 0 ) { if ( mms_handshake ( mms ) == 0 ) { if ( ( len_written = mms_write_stream_header ( mms ) ) != -1 ) { total_len_written = len_written; HTS_STAT.HTS_TOTAL_RECV += len_written; /* not modified */ if (checkPending) { if (mms->is_live != MMS_LIVE && mms->expected_file_size == existingSize + 50 /* Why 50 additional bytes declared ?? */ ) // abort download { fclose(back->r.out); f = back->r.out = NULL; if (unlink(fconcat(catbuff, back->url_sav, "")) == 0 && rename(fconcat(catbuff, back->url_sav, ".old"), fconcat(catbuff2, back->url_sav, "")) == 0) { back->r.notmodified = 1; back->r.statuscode = HTTP_OK; strcpybuff(back->r.msg, "Not modified"); } else { back->r.statuscode = HTTP_INTERNAL_SERVER_ERROR; strcpybuff(back->r.msg, "Unable to rename previous file (not updated)"); } } else { (void) unlink(fconcat(catbuff, back->url_sav, ".old")); } } /* begin rip */ if ( f != NULL && mms_begin_rip ( mms ) == 0 ) { if ( mms->is_live != MMS_LIVE ) { back->r.totalsize = mms->expected_file_size; back->r.totalsize -= 50; /* Why 50 additional bytes declared ?? */ } else back->r.totalsize = -1; /* Start download */ while ( !stop_mms(back) ) { len_written = mms_write_stream_data ( mms ); if ( len_written == 0 ) { break; } else if ( len_written == -1 ) { back->r.statuscode = HTTP_INTERNAL_SERVER_ERROR; strcpybuff(back->r.msg, "Unable to write stream data"); break; } total_len_written += len_written; back->r.size = total_len_written; HTS_STAT.HTS_TOTAL_RECV += len_written; fflush ( f ); if ( delay != 0 && end <= time(NULL) ) { delay = -1; back->r.statuscode = HTTP_OK; strcpybuff(back->r.msg, "Download interrupted"); break; } } // while back->r.statuscode = HTTP_OK; /* Finished */ } else if (f != NULL) { back->r.statuscode = HTTP_INTERNAL_SERVER_ERROR; strcpybuff(back->r.msg, "Can not begin ripping"); } } else { back->r.statuscode = HTTP_INTERNAL_SERVER_ERROR; strcpybuff(back->r.msg, "Can not write stream header"); } } else { back->r.statuscode = HTTP_INTERNAL_SERVER_ERROR; strcpybuff(back->r.msg, "Can not handshake"); } mms_disconnect ( mms ); } else { back->r.statuscode = HTTP_INTERNAL_SERVER_ERROR; strcpybuff(back->r.msg, "Can not connect"); } mms_destroy ( mms ); } else { back->r.statuscode = HTTP_INTERNAL_SERVER_ERROR; strcpybuff(back->r.msg, "Can not create mms resource"); } } else { back->r.statuscode = HTTP_INTERNAL_SERVER_ERROR; strcpybuff(back->r.msg, "Unable to open local output file"); } return 0; }