亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? recvdlg.cpp

?? spring+hibenate+struts開發
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
	FD_SET(fileObj->conInfo->sd, &rfd);

	for (int waitCnt=0; waitCnt < 120 && fileObj->hThread != NULL; waitCnt++)
	{
		tv.tv_sec = 1, tv.tv_usec = 0;
		if ((sock_ret = ::select(fileObj->conInfo->sd + 1, &rfd, NULL, NULL, &tv)) > 0)
		{
			waitCnt = 0;
			if ((recvDlg->*RecvFileFunc)() != TRUE)
				break;
			if (fileObj->status == FS_COMPLETE)
				break;
		}
		else if (sock_ret == 0) {
			FD_ZERO(&rfd);
			FD_SET(fileObj->conInfo->sd, &rfd);
			fileObj->conInfo->lastTick = ::GetTickCount();
			recvDlg->PostMessage(WM_RECVDLG_FILEBUTTON, 0, 0);
		}
		else if (sock_ret == SOCKET_ERROR) {
			break;
		}
	}
	recvDlg->CloseRecvFile(fileObj->status == FS_COMPLETE ? TRUE : FALSE);
	if (fileObj->status != FS_COMPLETE)
		fileObj->status = FS_ERROR;

	recvDlg->PostMessage(WM_TCPEVENT, fileObj->conInfo->sd, FD_CLOSE);
	::ExitThread(0);
	return	0;
}

BOOL TRecvDlg::CloseRecvFile(BOOL setAttr)
{
	if (fileObj->hFile != INVALID_HANDLE_VALUE)
	{
		if (setAttr)
		{
			FILETIME	ft;
			UnixTime2FileTime(fileObj->curFileInfo.Mtime(), &ft);
#if 1	// 巄掕張抲乮protocol format 曄峏偺壜擻惈乯
			if (fileObj->isDir || (fileObj->curFileInfo.Mtime() & 0xffffff00))
#endif
				::SetFileTime(fileObj->hFile, NULL, &ft, &ft);
		}
		fileObj->totalTrans += fileObj->offset;
		fileObj->totalFiles++;
		fileObj->offset = fileObj->woffset = 0;

		::CloseHandle(fileObj->hFile);
		fileObj->hFile = INVALID_HANDLE_VALUE;
	}
	return	TRUE;
}

BOOL DecodeDirEntry(char *buf, FileInfo *info)
{
	char	*tok, *ptr, *p;

	ConvertShareMsgEscape(buf);	// "::" -> ';'

	if ((tok = separate_token(buf, ':', &p)) == NULL)	// header size
		return	FALSE;

	if ((tok = separate_token(NULL, ':', &p)) == NULL)	// fname
		return	FALSE;
	info->SetFnameExt(tok);
	while ((ptr = strchr(tok, '?')) != NULL)	// UNICODE 傑偱偺巄掕
		*ptr = '_';

	if (strlen(tok) >= MAX_PATH)
		return	FALSE;

	if ((tok = separate_token(NULL, ':', &p)) == NULL)	// size
		return	FALSE;
	info->SetSize(hex2ll(tok));

	if ((tok = separate_token(NULL, ':', &p)) == NULL)	// attr
		return	FALSE;
	info->SetAttr(strtoul(tok, 0, 16));

	while ((tok = separate_token(NULL, ':', &p)) != NULL)	// exattr
	{
		if ((ptr = strchr(tok, '=')) == NULL)
			continue;
		*ptr = 0;

		UINT	exattr = strtoul(tok, 0, 16);
		UINT	val = strtoul(ptr + 1, 0, 16);

		switch (exattr) {
		case IPMSG_FILE_MTIME:		info->SetMtime(val); break;
//		case IPMSG_FILE_CREATETIME:	info->SetCrtime(val); break;	尰忬偱偼巊傢側偄
//		case IPMSG_FILE_ATIME:		info->SetAtime(val); break;		尰忬偱偼巊傢側偄
		default: break;
		}
	}
	return	TRUE;
}

BOOL TRecvDlg::RecvDirFile(void)
{
#define BIG_ALLOC	50
#define PEEK_SIZE	8

	if (fileObj->status == FS_DIRFILESTART || fileObj->status == FS_TRANSINFO)
	{
		int		size;
		if (fileObj->infoLen == 0)
		{
			if ((size = ::recv(fileObj->conInfo->sd, fileObj->info + (int)fileObj->offset, PEEK_SIZE - (int)fileObj->offset, 0)) <= 0)
				return	FALSE;
			if ((fileObj->offset += size) < PEEK_SIZE)
				return	TRUE;
			fileObj->info[fileObj->offset] = 0;
			if ((fileObj->infoLen = strtoul(fileObj->info, 0, 16)) >= sizeof(fileObj->info) -1 || fileObj->infoLen <= 0)
				return	FALSE;	// too big or small
		}
		if (fileObj->offset < fileObj->infoLen)
		{
			if ((size = ::recv(fileObj->conInfo->sd, fileObj->info + (int)fileObj->offset, fileObj->infoLen - (int)fileObj->offset, 0)) <= 0)
				return	FALSE;
			fileObj->offset += size;
		}
		if (fileObj->offset == fileObj->infoLen)
		{
			fileObj->info[fileObj->infoLen] = 0;
			if (DecodeDirEntry(fileObj->info, &fileObj->curFileInfo) == FALSE)
				return	FALSE;	// Illegal entry
			fileObj->offset = fileObj->infoLen = 0;	// 弶婜壔

			if (GET_MODE(fileObj->curFileInfo.Attr()) == IPMSG_FILE_DIR)
			{
				char	buf[MAX_BUF];
				const char *fname = fileObj->dirCnt == 0 ? fileObj->fileInfo->Fname() : fileObj->curFileInfo.Fname();

				if (MakePath(buf, fileObj->path, fname) >= MAX_PATH)
					return	MessageBox(buf, PATHTOOLONG_MSGSTR), FALSE;
				if (IsSafePath(buf, fname) == FALSE)
					return	FALSE;

				if (::CreateDirectory(buf, NULL) == FALSE)
					return	FALSE;
				strncpyz(fileObj->path, buf, MAX_PATH);
				fileObj->dirCnt++;
			}
			else if (GET_MODE(fileObj->curFileInfo.Attr()) == IPMSG_FILE_RETPARENT)
			{
				if (fileObj->curFileInfo.Mtime())	// directory 偺 time stamp 傪偁傢偣傞(NT宯偺傒)
				{
					FILETIME	ft;
					HANDLE		hFile;
					UnixTime2FileTime(fileObj->curFileInfo.Mtime(), &ft);
					if ((hFile = ::CreateFile(fileObj->path, GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)) != INVALID_HANDLE_VALUE)
					{
						::SetFileTime(hFile, NULL, NULL, &ft);
						::CloseHandle(hFile);
					}
				}
				if (fileObj->curFileInfo.Attr() & IPMSG_FILE_RONLYOPT)
					::SetFileAttributes(fileObj->path, FILE_ATTRIBUTE_READONLY);
				if (--fileObj->dirCnt <= 0)
				{
					fileObj->status = FS_COMPLETE;
					return	TRUE;
				}
				if (PathToDir(fileObj->path, fileObj->path) == FALSE)
					return	FALSE;
			}
			else {
				if (fileObj->dirCnt == 0)
					return	FALSE;
				
				if (fileObj->curFileInfo.Size() == 0)	// 0byte file
				{
					if (OpenRecvFile())		// 0byte偺応崌偼嶌惉幐攕傪柍帇
						CloseRecvFile(TRUE);
				}
				fileObj->status = fileObj->curFileInfo.Size() ? FS_TRANSFILE : FS_TRANSINFO;
			}
			return	TRUE;
		}
	}

	if (fileObj->status == FS_TRANSFILE)
	{
		if (RecvFile() != TRUE)
		{
			CloseRecvFile();
			return	FALSE;
		}
		if (fileObj->status == FS_ENDFILE)
		{
			CloseRecvFile(TRUE);
			fileObj->status = FS_TRANSINFO;
		}
	}

	return	TRUE;
}

BOOL TRecvDlg::OpenRecvFile(void)
{
	char	path[MAX_BUF];

	if (MakePath(path, fileObj->isDir ? fileObj->path : fileObj->saveDir, fileObj->curFileInfo.Fname()) >= MAX_PATH)
		return	MessageBox(path, PATHTOOLONG_MSGSTR), FALSE;
	if (IsSafePath(path, fileObj->curFileInfo.Fname()) == FALSE)
		return	MessageBox(path, NOTSAFEPATH_MSGSTR), FALSE;

	if ((fileObj->hFile = ::CreateFile(path, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)) == INVALID_HANDLE_VALUE)
		return	fileObj->isDir ? FALSE : (MessageBox(CREATEFAIL_MSGSTR, path), FALSE);

	if (fileObj->curFileInfo.Attr() & IPMSG_FILE_RONLYOPT)
		::SetFileAttributes(path, FILE_ATTRIBUTE_READONLY);

//::SetFilePointer(fileObj->hFile, OFFSET, 0, FILE_BEGIN);
//::SetEndOfFile(fileObj->hFile);

	return	TRUE;
}

BOOL TRecvDlg::RecvFile(void)
{
	int		wresid = (int)(fileObj->offset - fileObj->woffset);
	_int64	remain = fileObj->curFileInfo.Size() - fileObj->offset;
	int		size = 0;

	if (remain > cfg->TransMax - wresid)
		remain = cfg->TransMax - wresid;

	if ((size = ::recv(fileObj->conInfo->sd, fileObj->recvBuf + wresid, (int)remain, 0)) <= 0)
		return	FALSE;

	if (fileObj->hFile == INVALID_HANDLE_VALUE)
		if (OpenRecvFile() == FALSE)
			return	FALSE;

	wresid += size;
	if (fileObj->offset + size >= fileObj->curFileInfo.Size() || cfg->TransMax == wresid)
	{
		DWORD	wsize;
		if (::WriteFile(fileObj->hFile, fileObj->recvBuf, wresid, &wsize, 0) != TRUE || wresid != (int)wsize)
			return	MessageBox(WRITEFAIL_MSGSTR), FALSE;
		fileObj->woffset += wresid;
	}
	fileObj->offset += size;

	DWORD	nowTick = ::GetTickCount();

	if (nowTick - fileObj->conInfo->lastTick >= 1000)
	{
		fileObj->conInfo->lastTick = nowTick;
		PostMessage(WM_RECVDLG_FILEBUTTON, 0, 0);
	}

	if (fileObj->offset >= fileObj->curFileInfo.Size())
		fileObj->status = fileObj->isDir ? FS_ENDFILE : FS_COMPLETE;

	return	TRUE;
}

int MakeTransRateStr(char *buf, DWORD ticks, _int64 cur_size, _int64 total_size)
{
	int len = 0;
	buf[len++] = ' ';
	len += MakeSizeString(buf + len, cur_size) -2;	// "MB"晹暘傪敳偔
	buf[len++] = '/';
	len += MakeSizeString(buf + len, total_size);
	buf[len++] = ' ';
	len += MakeSizeString(buf + len, cur_size * 1000 / (ticks ? ticks : 10));
	return len + wsprintf(buf + len, "/s (%d%%)", (int)(cur_size * 100 / (total_size ? total_size : 1)));
}

int MakeDirTransRateStr(char *buf, DWORD ticks, _int64 cur_size, int files)
{
	int len = 0;
	buf[len++] = ' ';
	len += wsprintf(buf + len, "Total ");
	len += MakeSizeString(buf + len, cur_size);
	len += wsprintf(buf + len, "/%dfiles (", files);
	len += MakeSizeString(buf + len, cur_size * 1000 / (ticks ? ticks : 1));
	return	len + wsprintf(buf + len, "/s)" );
}

class RecvTransEndDlg : public TDlg {
	RecvFileObj	*fileObj;

public:
	RecvTransEndDlg(RecvFileObj *_fileObj, TWin *_win) : TDlg(_fileObj->status == FS_COMPLETE ? TRANSEND_DIALOG : SUSPEND_DIALOG, _win) { fileObj = _fileObj; }
	virtual BOOL	EvCreate(LPARAM lParam);
	virtual BOOL	EvCommand(WORD wNotifyCode, WORD wID, LPARAM hwndCtl);
};

BOOL RecvTransEndDlg::EvCreate(LPARAM lParam)
{
	char	buf[MAX_BUF];
	DWORD	difftick = fileObj->lastTick - fileObj->startTick;
	int		len = 0;

	len += wsprintf(buf + len, "Total: ");
	len += MakeSizeString(buf + len, fileObj->totalTrans);
	len += wsprintf(buf + len, " (");
	len += MakeSizeString(buf + len, fileObj->totalTrans * 1000 / (difftick ? difftick : 1));
	len += wsprintf(buf + len, "/s)\r\n%d", difftick/1000);
	if (difftick/1000 < 20)
		len += wsprintf(buf + len, ".%02d", (difftick%1000) / 10);
	len += wsprintf(buf + len, " sec   ");
	if (fileObj->totalFiles > 1 || fileObj->isDir)
		len += wsprintf(buf + len, "%d files", fileObj->totalFiles);
	else
		len += wsprintf(buf + len, "%s", fileObj->fileInfo->Fname());

	if (fileObj->status == FS_COMPLETE)
	{
		if (fileObj->totalFiles > 1 || fileObj->isDir)
			EnableWindow(GetDlgItem(EXEC_BUTTON), FALSE);
	}

	SetDlgItemText(FILE_STATIC, buf);

	GetWindowRect(&rect);
	MoveWindow(rect.left + 30, rect.top + 30, rect.right - rect.left, rect.bottom - rect.top, TRUE);
	return	TRUE;
}

BOOL RecvTransEndDlg::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hwndCtl)
{
	if (fileObj->status == FS_COMPLETE && wID == IDCANCEL)
		wID = IDOK;

	switch (wID)
	{
	case FOLDER_BUTTON: case EXEC_BUTTON: case IDCANCEL: case IDOK: case IDRETRY:
		EndDialog(wID);
		return	TRUE;
	}

	return	FALSE;
}

BOOL TRecvDlg::EndRecvFile(BOOL manual_suspend)
{
	if (fileObj->hThread)
	{
		HANDLE	hThread = fileObj->hThread;
		fileObj->hThread = 0;	// 拞抐偺崌恾
		WaitForSingleObject(hThread, INFINITE);
		::CloseHandle(hThread);
	}

	fileObj->lastTick = fileObj->conInfo->lastTick = ::GetTickCount();
	SetTransferButtonText();

	int			target = ShareMng::GetFileInfoNo(shareInfo, fileObj->fileInfo);
	FileInfo	*fileInfo = fileObj->fileInfo;
	BOOL		isSingleTrans = fileObj->startTick == fileObj->conInfo->startTick;

	::closesocket(fileObj->conInfo->sd);
	delete [] fileObj->recvBuf;
	delete fileObj->conInfo;
	fileObj->conInfo = NULL;

	if (fileObj->status == FS_COMPLETE)
	{
		for (int cnt=0; cnt < shareInfo->fileCnt; cnt++)
		{
			if (shareInfo->fileInfo[cnt]->IsSelected() && shareInfo->fileInfo[cnt] != fileInfo)
			{
				FreeDecodeShareMsgFile(shareInfo, target);
				return	SaveFile();
			}
		}
	}

	int ret = manual_suspend ? IDCANCEL : RecvTransEndDlg(fileObj, this).Exec();

	if (ret == EXEC_BUTTON || ret == FOLDER_BUTTON && fileObj->isDir && isSingleTrans)
	{
		char	buf[MAX_BUF];
		MakePath(buf, fileObj->saveDir, fileInfo->Fname());
		::ShellExecute(NULL, NULL, buf, 0, 0, SW_SHOW);
	}
	else if (ret == FOLDER_BUTTON)
		::ShellExecute(NULL, NULL, fileObj->saveDir, 0, 0, SW_SHOW);

	if (ret == IDOK || ret == FOLDER_BUTTON || ret == EXEC_BUTTON)
		FreeDecodeShareMsgFile(shareInfo, target);

	SetFileButton(this, FILE_BUTTON, shareInfo);
	EvSize(SIZE_RESTORED, 0, 0);

	if (ret == IDRETRY)
		PostMessage(WM_COMMAND, FILE_BUTTON, 0);

	return	TRUE;
}

void TRecvDlg::SetTransferButtonText(void)
{
	char	buf[MAX_LISTBUF];

	if (fileObj->conInfo == NULL)
		return;
	if (fileObj->isDir)
		MakeDirTransRateStr(buf, fileObj->conInfo->lastTick - fileObj->startTick, fileObj->totalTrans + fileObj->offset, fileObj->totalFiles);
	else
		MakeTransRateStr(buf, fileObj->conInfo->lastTick - fileObj->conInfo->startTick, fileObj->status < FS_COMPLETE ? fileObj->offset : fileObj->curFileInfo.Size(), fileObj->curFileInfo.Size());
	SetDlgItemText(FILE_BUTTON, buf);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲在线视频一区| 777a∨成人精品桃花网| 日本特黄久久久高潮| 亚洲视频图片小说| 最新热久久免费视频| 久久久久九九视频| 亚洲欧美综合色| 成人国产精品免费观看动漫| 亚洲精品国产视频| 一区二区三区在线播| 欧美色精品在线视频| 欧美在线免费观看亚洲| 欧美日韩大陆在线| 欧美亚洲综合在线| 欧美日本一区二区| 欧美一卡二卡在线| 久久精品一二三| 国产精品亲子乱子伦xxxx裸| 亚洲欧美乱综合| 一区二区三区四区五区视频在线观看| 一区二区三区四区高清精品免费观看| 91视频在线观看免费| 日本亚洲视频在线| 中文字幕一区二| 亚洲精品亚洲人成人网| 婷婷久久综合九色综合绿巨人| 免费人成黄页网站在线一区二区| 亚洲bt欧美bt精品| 另类小说色综合网站| 国产成a人无v码亚洲福利| 色综合久久久久| 欧美一区二区高清| 亚洲欧洲精品天堂一级| 日韩成人一区二区| 成人爱爱电影网址| 538prom精品视频线放| 国产清纯美女被跳蛋高潮一区二区久久w| 中文字幕精品—区二区四季| 亚洲一区二区三区四区五区黄| 免费人成网站在线观看欧美高清| 波多野结衣一区二区三区| 91麻豆国产在线观看| 韩国av一区二区三区| 美国毛片一区二区三区| 亚洲精品免费在线| 久久狠狠亚洲综合| 日本黄色一区二区| www国产成人| 丝袜诱惑亚洲看片| 色哟哟一区二区三区| 久久久久久久久久久99999| 亚洲在线视频一区| 成人网男人的天堂| 精品国精品国产| 一区二区三区中文在线观看| 国产高清一区日本| 日韩欧美电影一二三| 午夜影视日本亚洲欧洲精品| 成人午夜看片网址| 久久久不卡网国产精品二区| 天天操天天色综合| 欧美系列一区二区| 亚洲少妇屁股交4| 国产成a人亚洲精| 久久众筹精品私拍模特| 久久精品国产久精国产爱| 欧美三级中文字幕在线观看| 最近日韩中文字幕| 成人h动漫精品一区二| 国产女主播一区| 国产精品69久久久久水密桃| 日韩午夜在线影院| 日韩国产在线观看| 欧美成人精精品一区二区频| 婷婷开心久久网| 欧美美女一区二区| 亚洲一区二区三区不卡国产欧美| 国产福利一区二区| 欧美激情一区在线| 风间由美性色一区二区三区| 久久精品视频一区二区三区| 久久精品国产成人一区二区三区 | 国产电影一区二区三区| 日韩美女在线视频| 六月丁香婷婷色狠狠久久| 精品久久久久av影院| 婷婷开心激情综合| 2020国产成人综合网| 国精产品一区一区三区mba桃花| 精品成人佐山爱一区二区| 久草在线在线精品观看| 日韩视频一区二区三区| 久久99热国产| 欧美极品美女视频| 在线视频一区二区三区| 亚洲成a人v欧美综合天堂下载 | 欧美精品v日韩精品v韩国精品v| 亚洲精品自拍动漫在线| 欧美亚洲日本国产| 裸体健美xxxx欧美裸体表演| 日韩欧美一区二区不卡| 久久精品国产77777蜜臀| 日韩欧美123| 国产成人在线色| 亚洲欧洲美洲综合色网| 欧美日韩视频在线观看一区二区三区 | 国产视频一区二区三区在线观看| 韩国三级在线一区| 1000精品久久久久久久久| 欧美欧美欧美欧美首页| 国产一区二区电影| 亚洲影视资源网| 精品久久久久久久久久久久包黑料| 国产盗摄视频一区二区三区| 亚洲成人动漫在线免费观看| 制服丝袜成人动漫| 99久久亚洲一区二区三区青草| 亚洲成人激情av| 欧美国产国产综合| 欧美女孩性生活视频| 99视频一区二区| 韩国成人精品a∨在线观看| 亚洲猫色日本管| 久久精品亚洲精品国产欧美kt∨| 欧美日韩国产精选| 成人性生交大合| 欧美性色综合网| 综合久久久久综合| 另类人妖一区二区av| 91久久精品午夜一区二区| 亚洲欧洲在线观看av| 成人av集中营| 狠狠色丁香久久婷婷综合丁香| 久久99久久久欧美国产| 无码av免费一区二区三区试看 | 国产麻豆精品一区二区| 免费成人结看片| 日本不卡一区二区三区| 免费观看日韩电影| 成人av免费观看| 在线播放日韩导航| 国产成人在线色| 91丨porny丨蝌蚪视频| 在线精品视频一区二区| 制服.丝袜.亚洲.另类.中文| 久久精品水蜜桃av综合天堂| 亚洲精品国久久99热| 午夜视频在线观看一区二区| 狠狠色丁香婷婷综合久久片| av福利精品导航| 欧美一级在线免费| 中文字幕不卡在线观看| 亚洲成av人片在线观看无码| 精品中文字幕一区二区| aaa国产一区| 日韩免费看网站| 日韩毛片视频在线看| 日本欧美一区二区在线观看| 成人sese在线| 日韩精品中文字幕在线一区| 国产精品久久久一本精品| 日韩电影免费在线观看网站| 丰满白嫩尤物一区二区| 欧美在线短视频| 国产视频视频一区| 日本不卡的三区四区五区| 91亚洲永久精品| 久久综合久久99| 午夜免费久久看| 成人高清免费在线播放| 精品福利一二区| 亚洲综合成人在线| 成人高清在线视频| 精品成人一区二区| 亚洲成a人v欧美综合天堂| 99久久久国产精品| 久久精品一区二区三区四区| 免费观看一级特黄欧美大片| 一本到三区不卡视频| 中文字幕 久热精品 视频在线 | 中文成人av在线| 久久成人18免费观看| 欧美精品色一区二区三区| 中文字幕视频一区| 国产乱码精品一区二区三区忘忧草 | 欧美吞精做爰啪啪高潮| 国产精品福利一区二区三区| 久久精品国产网站| 欧美高清视频一二三区| 尤物av一区二区| 成人午夜在线播放| 国产色产综合色产在线视频| 黄页网站大全一区二区| 日韩亚洲欧美一区二区三区| 香蕉成人伊视频在线观看| 欧美日韩三级视频| 午夜国产精品一区| 欧美精品视频www在线观看| 日本中文一区二区三区| 欧美丰满少妇xxxxx高潮对白|