Esempio n. 1
0
static size_t header_callback(void *ptr, size_t size, size_t rmemb, void *stream) {     
	DownloadInfo *downloadInfo = (DownloadInfo*)stream;
	char *str = (char*)ptr;
	//printf("%s\n", str);
	is_get_header = true;
	if (!downloadInfo->GetFileName() && strstr(str, "Content-Disposition")) {
		char *src = strstr(str, "filename=");
		int length = strlen(src) - 8;
		char *urlcode_filename = new char[length];
		ZeroMemory(urlcode_filename, length);
		strcpy_s(urlcode_filename, length, (src + 9));
		WCHAR* fileName = UrlDecode(urlcode_filename);
		delete[] urlcode_filename;
		downloadInfo->SetFileName(fileName);
	} else if (strstr(str, "Content-Length")) {
		int length = strlen(str) - 15;
		char *filesize = new char[length];
		strcpy_s(filesize, length, str + 16);
		FILE_LENGTH size = StringToFileLength(filesize);
		delete[] filesize;
		downloadInfo->SetFileSize(size);
	}

	return rmemb * size;
}
bool PackagesInfo::Parse(wxMemoryInputStream& inputStream, muThread_Updater* thread)
{
	m_thread = thread;

	/*wxTextInputStream textStream( inputStream );
	do
	{
		wxString line = textStream.ReadLine();
		wxLogVerbose(line);
	}
	while(textStream.GetChar() != 0);*/

	TiXmlDocument doc;
	doc.Parse(static_cast<char*>(inputStream.GetInputStreamBuffer()->GetBufferStart()));
	TiXmlHandle docHandle( doc.RootElement() );

	// Read format version
	ParseString(docHandle.FirstChild("format").FirstChild("revision").ToElement()).ToLong(&m_fileFormat);

	// Read format compatible
	ParseString(docHandle.FirstChild("format").FirstChild("compatible").ToElement()).ToLong(&m_compatibleFormat);

	// Read update version
	ParseString(docHandle.FirstChild("info").FirstChild("version").ToElement()).ToLong(&m_updateVersion);

	// Read update changelog
	m_changelog = ParseString(docHandle.FirstChild("info").FirstChild("changelog").ToElement());

	// Read packages
	for( TiXmlNode* node = docHandle.FirstChild("package").ToNode(); node; node=node->NextSibling("package") )
	{
		thread->PostProgress(wxT("Package"));
		DownloadInfo info;
		if( info.Parse(node, thread) )
		{
			m_downloads.push_back(info);
			thread->PostProgress(wxT("Package parsed."));
		}
		else
		{
			thread->PostProgress(wxT("Package FAILED!"));
		}
	}

	return true;
}
Esempio n. 3
0
static size_t write_callback(void *ptr, size_t size, size_t nmemb, void *stream) {
	int len = size * nmemb;
	int written = len;
	DownloadInfo *downloadinfo = (DownloadInfo*)stream;
	if (!fp) {
		TCHAR* filePath = downloadinfo->get_temp_file_path();
		if (_taccess(filePath, 0) == -1 || downloadinfo->downloadType != 0) {
			_tfopen_s(&fp, filePath, _T("wb"));
		} else {
			_tfopen_s(&fp, filePath, _T("ab"));
		}
	}

	if (fp) {
		fwrite(ptr, size, nmemb, fp);
	}
	return written;
}
void DownloadDataViewModel::GetValue(wxVariant& variant,
		const wxDataViewItem& item, unsigned int column) const {

	DownloadInfo * downloadInfo = static_cast<DownloadInfo*>(item.GetID());

	wxASSERT(downloadInfo != nullptr);

	const int MB = 1024 * 1024;

	switch(column)
	{
	case NAME:
		variant = wxVariant(downloadInfo->GetName());
		break;

	case STATUS:
		if (downloadInfo->IsFinished()) {
			variant = wxVariant(wxString(_("complete")));
		} else {
			variant = wxVariant(wxString(_("downloading")));
		}
		break;

	case P_COMPLETE:
		if (downloadInfo->GetSize() < 1) { /* Prevent from division by zero */
			variant = wxVariant(wxString(_T("Indeterminate")));
		} else {
			variant = wxVariant(wxString::Format(wxT("%i%%"), downloadInfo->GetProgressPercent()));
		}
		break;

	case SPEED:
		//TODO: implement
		variant = wxVariant(wxEmptyString);
		break;

	case ETA:
		//TODO: implement
		variant = wxVariant(wxEmptyString);
		break;

	case FILESIZE:
		variant = wxVariant(downloadInfo->GetSize() > 0 ? wxString::Format(wxT("%i"), downloadInfo->GetSize() / MB) : wxString(_T("0")));
		break;

	case DEFAULT_COLUMN:
		//Do nothing
		break;

	default:
		wxASSERT(false);
		break;
	}
}
Esempio n. 5
0
void DownloadDataViewModel::GetValue(wxVariant& variant,
		const wxDataViewItem& item, unsigned int column) const {

	DownloadInfo * downloadInfo = static_cast<DownloadInfo*>(item.GetID());

	wxASSERT(downloadInfo != nullptr);

    /* In case if wxGTK will try to render invalid item */
    if (downloadInfo == nullptr || ContainsItem(*downloadInfo) == false) {
        variant = wxVariant(wxEmptyString);
        return;
    }

	const int MB = 1024 * 1024;

	switch(column)
	{
	case NAME:
		variant = wxVariant(downloadInfo->GetName());
		break;

	case STATUS:
		if (downloadInfo->IsFinished()) {
			variant = wxVariant(wxString(_("complete")));
		} else {
			variant = wxVariant(wxString(_("downloading")));
		}
		break;

	case P_COMPLETE:
		variant = wxVariant(wxString::Format(wxT("%i%%"), downloadInfo->GetProgressPercent()));
		break;

	case SPEED:
		//TODO: implement
		variant = wxVariant(wxEmptyString);
		break;

	case ETA:
		//TODO: implement
		variant = wxVariant(wxEmptyString);
		break;

	case FILESIZE:
		variant = wxVariant(downloadInfo->GetSize() > 0 ? wxString::Format(wxT("%i"), downloadInfo->GetSize() / MB) : wxString(_T("0")));
		break;

	case DEFAULT_COLUMN:
		//Do nothing
		break;

	default:
		wxASSERT(false);
		break;
	}
}
Esempio n. 6
0
static int xferinfo(void *p, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) {
	if (!is_get_header) {
		return 0;
	}
	DownloadInfo *myp = (DownloadInfo *)p;
	double curtime = 0;
	curtime = myp->get_cur_run_time();
	static FILE_LENGTH prvious_download = 0;
	if (myp->GetFileSize() == 0) {
		//if (myp->check_progress_time(curtime)) {

		//	std::cout << BuildProgressResponseJson(myp, speed, myp->GetDownloadedSize(), myp->GetFileSize(), curtime) << std::endl;
		//}
		if (myp->downloadType == 0) {
			return 0;
		}
	}
	if (myp->check_progress_time(curtime)) {
		myp->SetLastRunTime(curtime);
		FILE_LENGTH speed = 0;
		if (myp->IsBreakPointDownload()) {
			speed = dlnow - prvious_download;
			prvious_download = dlnow;
			myp->SetDownloadedSize(speed + myp->GetDownloadedSize());
		} else {
			//if (myp->downloadType == 0) {
			if (myp->downloadType == 0) {
				speed = dlnow - myp->GetDownloadedSize();
				myp->SetDownloadedSize(dlnow);
			} else {
				double size_downloaded = 0;
				curl_easy_getinfo(myp->GetCurl(), CURLINFO_SIZE_DOWNLOAD, &size_downloaded);
				speed = size_downloaded - myp ->GetDownloadedSize();
				myp->SetDownloadedSize(size_downloaded);
			}
		}

		if (speed == 0) {
			receive_no_data_times++;
			if (receive_no_data_times > RECEIVE_NO_DATA_TIME_OUT) {
				Log(_T("超过%d次速度为0"), RECEIVE_NO_DATA_TIME_OUT);
				if (!CheckNetWorkWell()) { //网络不通
					time_out_times++;
					Log(_T("%s time_out_times:%d"), _T("测试网络,网络未联通"), time_out_times);
					if (time_out_times > 2) {//联系9个周期没有接受到数据
						Log(_T("%s time_out_times:%d"), _T("网络连续3个周期未联通,退出下载"), time_out_times);
						prvious_download = 0;
						RECEIVE_NO_DATA_TIME_OUT = 3;
						return 1; //退出
					} else {
						receive_no_data_times = 0;//在尝试一次
						RECEIVE_NO_DATA_TIME_OUT += 2;
						Log(_T("%s %d"), _T("在尝试一次"), receive_no_data_times);
					}
				} else {//网络连通 但是连续多次没接受到数据
					Log(_T("%s"), _T("测试网络,联通,需要重新启动下载"));
					is_need_reload = true;
					prvious_download = 0;
					RECEIVE_NO_DATA_TIME_OUT = 3;
					return 1;
				}
			}
		} else {
			receive_no_data_times = 0;
			time_out_times = 0;
		}
		std::cout << BuildProgressResponseJson(myp, speed, myp->GetDownloadedSize(), myp->GetFileSize(), curtime) << std::endl;
		//fprintf(stdout, BuildProgressResponseJson(speed,dlnow,myp->GetFileSize(),curtime));
	}
	return 0;
}
Esempio n. 7
0
int downloadFile(TCHAR *inUrl, TCHAR *filepath, TCHAR *uuid, TCHAR *file_name) {
	int download_result = 0;
	char* url = WcharToChar_New(inUrl);
	TCHAR *doc_id = GetDocId(url);
	int downloadType = GetDownloadType(url);
	char* char_uuid = WcharToChar_New(uuid);
	DownloadInfo *downloadInfo = new DownloadInfo(url, filepath, doc_id);
	downloadInfo->downloadType = downloadType;
	//LOGI("%d\n", downloadType);
	downloadInfo->SetUUid(char_uuid);
	if (_taccess_s(filepath, 0) != 0) { //如果文件夹不存在
		int res = CreateMultiplePath(filepath);
		if (res == 0) {
			Log(_T("%s, %s"), _T("文件夹不存在,创建文件夹失败"), filepath);
			fprintf(stdout, "%s\n", BuildFailedResponseJson(downloadInfo, 4, _T("create floder failed")).c_str());
			delete[] url;
			delete[] char_uuid;
			download_result = -1;
			return download_result;
		}
	}
	if (file_name) {
		int length = _tcslen(file_name) + 1;
		TCHAR *fileName = new TCHAR[length];
		_tcscpy_s(fileName, length, file_name);
		downloadInfo->SetFileName(fileName);
	}

	while (1) {
		Log(_T("%s %s"), _T("开始下载"), inUrl);
		if (DownLoad(url, downloadInfo)) {
			if (fp)
				fclose(fp);
			if (downloadInfo->RenameFileAfterDownload() == 0) {
				fprintf(stdout, "%s\n", BuildSuccessResponseJson(downloadInfo).c_str());
				break;
			} else {
				download_result = -1;
				fprintf(stdout, "%s\n", BuildRenameFailedJson(downloadInfo).c_str());
				break;
			}
		} else {
			Log(_T("%s %d"), _T("下载失败,判断是否需要重新下载"), is_need_reload);
			if (is_need_reload) {//重新连接 下载
				delete downloadInfo;
				if (fp) {
					fclose(fp);
					fp = NULL;
				}
				doc_id = GetDocId(url);
				downloadInfo = new DownloadInfo(url, filepath, doc_id);
				downloadInfo->SetUUid(char_uuid);
				downloadInfo->downloadType = downloadType;
				if (file_name) {
					int length = _tcslen(file_name) + 1;
					TCHAR *fileName = new TCHAR[length];
					_tcscpy_s(fileName, length, file_name);
					downloadInfo->SetFileName(fileName);
				}
				receive_no_data_times = 0;
				is_need_reload = false;
				time_out_times = 0;
			} else {
				fprintf(stdout, "%s\n", BuildFailedResponseJson(downloadInfo).c_str());
				download_result = -1;
				break;
			}
		}
	}
	if (downloadInfo)
		delete downloadInfo;
	if (url)
		delete[] url;
	if (char_uuid)
		delete[] char_uuid;
	return download_result;
}