Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
/* 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;
}