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

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

?? misc.cpp.svn-base

?? wince c++ 下 開發(fā)的 rss 閱讀器源代碼
?? SVN-BASE
字號:
/**
 *  helpers.cpp : Miscelaneous helping functions
 *
 *  Copyright (C) 2008  David Andrs <pda@jasnapaka.com>
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#include "StdAfx.h"
#include "prssr.h"

#include "misc.h"
#include "Config.h"

#include "../share/fs.h"
#include "../share/reg.h"
#include "../prssr/sha1/sha1.h"

#include "net/Connection.h"
#include "www/url.h"

#ifdef MYDEBUG
#undef THIS_FILE
static TCHAR THIS_FILE[] = _T(__FILE__);
#include "../prssr/debug/crtdbg.h"
#define new MYDEBUG_NEW
#endif

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


///////////////////////////////////////////////////////////////////////////////////////////////////

BOOL CheckConnection(BOOL autoConnect, BOOL &disconnect) {
	LOG0(5, "CheckConnection()");

	BOOL ret = TRUE;
	disconnect = FALSE;

	// Automatically connect
	if (autoConnect) {
		// already connected?
		if (Connection.IsAvailable() != S_OK) {
			if (Connection.AttemptConnect() == S_OK) {
				disconnect = TRUE;
			}
			else {
				ret = FALSE;
			}
		}
	}
	else {
		ret = Connection.IsAvailable() == S_OK;
	}

	return ret;
}

// cache related ////

CString GetCachePath(EFileType type, const CString &strPath) {
	CString path = strPath;
	if (path.Right(1) == _T("\\"))
		path = path.Left(path.GetLength() - 1);
	CString cPath;
	switch (type) {
		case FILE_TYPE_FEED:      cPath.Format(_T("%s\\feeds"), path); break;
		case FILE_TYPE_ENCLOSURE: cPath.Format(_T("%s\\enclosures"), path); break;
		case FILE_TYPE_FAVICON:   cPath.Format(_T("%s\\favicons"), path); break;
		case FILE_TYPE_IMAGE:
		case FILE_TYPE_HTML:      cPath.Format(_T("%s\\html"), path); break;
		case FILE_TYPE_OPML:
		default:                  cPath.Format(_T("%s"), path); break;
	}
	return cPath;
}

CString GetCacheFile(EFileType type, const CString &strPath, const CString &url) {
	CString filePath;
	switch (type) {
		case FILE_TYPE_FAVICON:	  filePath.Format(_T("%s\\%s.ico"), GetCachePath(type, strPath), url); break;
		case FILE_TYPE_ENCLOSURE: filePath.Format(_T("%s\\%s"), GetCachePath(type, strPath), UrlToFileName(url, FALSE)); break;
		case FILE_TYPE_HTML:      filePath.Format(_T("%s\\%s"), GetCachePath(type, strPath), UrlToFileName(url, TRUE)); break;
		case FILE_TYPE_IMAGE:     filePath.Format(_T("%s\\%s"), GetCachePath(type, strPath), UrlToFileName(url, FALSE)); break;
		default:				  filePath.Format(_T("%s\\%s"), GetCachePath(type, strPath), url); break;
	}
	return filePath;
}

BOOL IsHTMLCached(const CString &link, BOOL addHTMLExt) {
	CString url = link;
	ReplaceHTMLEntities(url);

	CString path = GetCachePath(FILE_TYPE_HTML, Config.CacheLocation);
	CString fileName = UrlToFileName(MakeAbsoluteUrl(url, _T(""), _T("")), addHTMLExt);
	CString strFileName = path + _T("\\") + fileName;

	// if exists -> return
	if (FileExists(strFileName)) return TRUE;
	else return FALSE;
}

BOOL IsEnclosureCached(const CString &link) {
	CString path = GetCachePath(FILE_TYPE_ENCLOSURE, Config.CacheLocation);
	CString fileName = UrlToFileName(MakeAbsoluteUrl(link, _T(""), _T("")), FALSE);
	CString strFileName = path + _T("\\") + fileName;

	// if exists -> return
	if (FileExists(strFileName)) return TRUE;
	else return FALSE;
}

void ClearCacheFile(EFileType type, const CString &cacheLocation, const CString &fileName) {
	CString rootDir = GetCachePath(type, cacheLocation);

	CString strFileName = fileName;
	DeleteFile(strFileName);
	RemoveEmptyDirs(strFileName, rootDir);
}

// DDX/DDV stuff ////

void DDV_NotEmpty(CDataExchange *pDX, CString &str, UINT nID) {
	if (pDX->m_bSaveAndValidate) {
		if (str.IsEmpty()) {
			AfxMessageBox(nID, MB_OK | MB_ICONSTOP);
			pDX->Fail();
		}
	}
}

// GUI stuff ////

// Load menu from resource 'srcID' and appends it to the 'menu'
BOOL AppendMenuFromResource(CMenu *menu, UINT srcID) {
	CMenu mnuAppend;
	mnuAppend.LoadMenu(srcID);
	MergeMenu(menu, &mnuAppend);
	return TRUE;
}

// Abstract:
//      Merges two menus.
//
// Parameters:
//      pMenuDestination    - [in, retval] destination menu handle
//      pMenuAdd            - [in] menu to merge
//
// Return value:
//      <false> in case of error.
//
// Comments:
//      This function calles itself recursivley.
BOOL MergeMenu(CMenu *pMenuDestination, const CMenu *pMenuAdd) {
	// get the number menu items in the menus
	int iMenuAddItemCount = pMenuAdd->GetMenuItemCount();
	int iMenuDestItemCount = pMenuDestination->GetMenuItemCount();

	// if there are no items return
	if (iMenuAddItemCount == 0)
		return TRUE;

	// iterate through the top level of
	for (int iLoop = 0; iLoop < iMenuAddItemCount; iLoop++) {
		// get the menu string from the add menu
		CString sMenuAddString;
		pMenuAdd->GetMenuString(iLoop, sMenuAddString, MF_BYPOSITION);

		// try to get the submenu of the current menu item
		CMenu *pSubMenu = pMenuAdd->GetSubMenu(iLoop);

		// check if we have a sub menu
		if (!pSubMenu) {
			// normal menu item
			// read the source and append at the destination
			UINT nState = pMenuAdd->GetMenuState(iLoop, MF_BYPOSITION);
			UINT nItemID = pMenuAdd->GetMenuItemID(iLoop);

			if (nItemID == 0) {
				pMenuDestination->AppendMenu(MF_SEPARATOR);
				iMenuDestItemCount++;
			}
			else if (pMenuDestination->AppendMenu(nState, nItemID, sMenuAddString)) {
				// menu item added, don't forget to correct the item count
				iMenuDestItemCount++;
			}
			else {
				TRACE0( "MergeMenu: AppendMenu failed!\n" );
				return FALSE;
			}
		}
		else {
			// create or insert a new popup menu item

			// default insert pos is like ap
			int iInsertPosDefault = -1;

			// if the top level search did not find a position append the menu
			if (iInsertPosDefault == -1)
				iInsertPosDefault = pMenuDestination->GetMenuItemCount();

			// create a new popup and insert before <Window> or <Help>
			CMenu newPopupMenu;
			if (!newPopupMenu.CreatePopupMenu()) {
				TRACE0("MergeMenu: CreatePopupMenu failed!\n");
				return FALSE;
			}

			// merge the new popup recursivly
			if (!MergeMenu(&newPopupMenu, pSubMenu))
				return FALSE;

			// insert the new popup menu into the destination menu
			HMENU hNewMenu = newPopupMenu.GetSafeHmenu();

			if (pMenuDestination->InsertMenu(iInsertPosDefault, MF_BYPOSITION | MF_POPUP | MF_ENABLED, (UINT) hNewMenu, sMenuAddString)) {
				// don't forget to correct the item count
				iMenuDestItemCount++;
			}
			else {
				TRACE0("MergeMenu: InsertMenu failed!\n");
				return FALSE;
			}

			// don't destroy the new menu
			newPopupMenu.Detach();
		}
	}

    return TRUE;
}

//

void SendByEmail(const CString &body) {
	CString pars;
	pars.Format(_T("-service \"%s\" -body \"%s\""), Config.EmailAccount, body);
	CreateProcess(_T("tmail.exe"), pars, NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL);
}

BOOL CopyTextToClipboard(HWND hWnd, const CString &strText) {
	int ret = TRUE;

	if (hWnd != NULL && ::OpenClipboard(hWnd)) {
		::EmptyClipboard();

		HGLOBAL hClipboardData = ::GlobalAlloc(GMEM_MOVEABLE, sizeof(TCHAR) * (strText.GetLength() + 1));
		if (hClipboardData != NULL) {
			TCHAR *pchData = (TCHAR *) GlobalLock(hClipboardData);
			lstrcpy(pchData, (LPCTSTR) strText);
			GlobalUnlock(hClipboardData);

			::SetClipboardData(CF_UNICODETEXT, hClipboardData);
		}
		else {
			ret = FALSE;
		}

		::CloseClipboard();
	}
	else {
		// clipboard opening failed
		ret = FALSE;
	}

	return ret;
}

// hot keys ////

void UnregisterHwKeys(HWND hWnd) {
	for (int i = 0xc1; i <= 0xcf; i++)
		UnregisterHotKey(hWnd, i);
}

void RegisterHwKeys(HWND hWnd) {
	POSITION pos = Config.HwKeysCmd.GetStartPosition();
	while (pos != NULL) {
		int key;
		UINT cmd;
		Config.HwKeysCmd.GetNextAssoc(pos, key, cmd);

		UnregisterHotKey(hWnd, key);
		RegisterHotKey(hWnd, key, MOD_WIN, key);
	}
}

// Open ////

void OpenUrlExt(const CString &url) {
	SHELLEXECUTEINFO sei = { 0 };
	sei.cbSize = sizeof(sei);
	sei.fMask = SEE_MASK_NOCLOSEPROCESS;
	sei.lpVerb = _T("Open");
//	sei.lpFile = _T("\\windows\\iexplore.exe");
//	sei.lpParameters = url;
	sei.lpFile = url;
	sei.nShow = SW_SHOW;
	ShellExecuteEx(&sei);
}

void OpenEnclosure(const CString &url) {
	CString path = GetCachePath(FILE_TYPE_ENCLOSURE, Config.CacheLocation);
	CString fileName = path + _T("\\") + UrlToFileName(MakeAbsoluteUrl(url, _T(""), _T("")), FALSE);

	if (FileExists(fileName)) ShellOpenFile(fileName);
	else OpenUrlExt(url);
}

void ShellOpenFile(const CString &strTransUrl) {
	LOG0(3, "ShellOpenFile()");

	// get extension
	int nPos = strTransUrl.ReverseFind('.');
	CString strExt = strTransUrl.Mid(nPos);

	HKEY hExt;
	if (RegOpenKeyEx(HKEY_CLASSES_ROOT, strExt, 0, 0, &hExt) == ERROR_SUCCESS) {
		// read file type
		CString strFileType = RegReadString(hExt, NULL, _T(""));
		if (!strFileType.IsEmpty()) {
			// read open info for the file
			HKEY hFileType;
			if (RegOpenKeyEx(HKEY_CLASSES_ROOT, strFileType, 0, 0, &hFileType) == ERROR_SUCCESS) {
				HKEY hOpenCmd;
				// get open command
				if (RegOpenKeyEx(hFileType, _T("Shell\\Open\\Command"), 0, 0, &hOpenCmd) == ERROR_SUCCESS) {
					CString strOpenCommand = RegReadString(hOpenCmd, NULL, _T(""));
					if (!strOpenCommand.IsEmpty()) {
						// parse command line (split program name and args)
						CString strProgram;
						CString strArgs;

						// find "
						int nSQuote = strOpenCommand.Find('"');
						if (nSQuote == -1) {
							// no quotes -> the space splits prog and args
							int nSpace = strOpenCommand.Find(' ');
							strProgram = strOpenCommand.Left(nSpace);
							strArgs = strOpenCommand.Mid(nSpace + 1);
						}
						else {
							// is there a space before " ?
							if (nSQuote > 1 && strOpenCommand.GetAt(nSQuote - 1) == ' ') {
								// args quoted
								strProgram = strOpenCommand.Left(nSQuote - 1);
								strArgs = strOpenCommand.Mid(nSQuote);
							}
							else {
								// the program name is quoted
								int nEQuote = strOpenCommand.Find('"', nSQuote + 1);
								strProgram = strOpenCommand.Left(nEQuote);
								strArgs = strOpenCommand.Mid(nEQuote + 1);
							}
						}


						strArgs.Replace(_T("%1"), strTransUrl);

						SHELLEXECUTEINFO ei = { 0 };
						ei.cbSize = sizeof(ei);
						ei.fMask = SEE_MASK_NOCLOSEPROCESS;
						ei.lpVerb = _T("Open");
						ei.lpFile = strProgram;
						ei.lpParameters = strArgs;
						ei.nShow = SW_SHOW;
						ShellExecuteEx(&ei);
					}

					RegCloseKey(hOpenCmd);
				}
				RegCloseKey(hFileType);
			}
		}
		RegCloseKey(hExt);
	}
}

// ////

CString FormatFileSize(DWORD fileSize) {
	CString strSize;
	if (fileSize > 0x40000000)
		strSize.Format(_T("%0.1lf GB"), (double) fileSize / 0x40000000);
	if (fileSize > 0x100000)
		strSize.Format(_T("%0.1lf MB"), (double) fileSize / 0x100000);
	else if (fileSize > 0x400)
		strSize.Format(_T("%0.1lf KB"), (double) fileSize / 0x400);
	else
		strSize.Format(_T("%d B"), fileSize);

	return strSize;
}

CString FormatNumberItemText(const CString &strText, int newCount) {
	LOG2(5, "FormatNumberItemText('%S', %d)", strText, newCount);

	CString strItemText;

	if (newCount > 0)
		strItemText.Format(_T("%s (%d)"), strText, newCount);
	else
		strItemText.Format(_T("%s"), strText);

	return strItemText;
}

#define NUMBERITEM_FORMAT			DT_VCENTER | DT_SINGLELINE | DT_LEFT

CString GetNumberItemText(CDC *pDC, const CString &strTitle, int newCount, int nWidth) {
	LOG3(5, "GetNumberItemText(%S, %d, %d)", strTitle, newCount, nWidth);

	CString strTemp = FormatNumberItemText(strTitle, newCount);
	CRect rcTmp;
	pDC->DrawText(strTemp, &rcTmp, NUMBERITEM_FORMAT | DT_CALCRECT);
	if (rcTmp.Width() > nWidth) {
		// Text doesn't fit in rect. We have to truncate it and add ellipsis to the end.
		for (int i = strTitle.GetLength(); i >= 0; i--) {
			strTemp = FormatNumberItemText(strTitle.Left(i) + CString(_T("...")), newCount);
			pDC->DrawText(strTemp, &rcTmp, NUMBERITEM_FORMAT | DT_CALCRECT);
			if (rcTmp.Width() < nWidth) {
				// Gotcha!
				break;
			}
		}
	}

	return strTemp;
}

//

BOOL WriteFileString(CBufferedFile &file, LPCTSTR lpStr, UINT codePage) {
	LOG2(5, "WriteFileString('%S', %d)", lpStr, codePage);

	int mbLen = WideCharToMultiByte(codePage, 0, lpStr, -1, NULL, 0, NULL, NULL);
	char *mbStr = new char [mbLen];
	WideCharToMultiByte(codePage, 0, lpStr, -1, mbStr, mbLen, NULL, NULL);
	mbStr[mbLen - 1] = '\0';

	BOOL ret = file.Write(mbStr, mbLen - 1);
	delete [] mbStr;

	return ret;
}

BOOL WriteFileString(CBufferedFile &file, LPCTSTR lpStr) {
	LOG1(5, "WriteFileString('%S')", lpStr);

	int mbLen = lstrlen(lpStr);
	char *mbStr = new char [mbLen + 1];
	for (int i = 0; i < mbLen; i++)
		mbStr[i] = (char) lpStr[i];
	mbStr[mbLen] = '\0';

	BOOL ret = file.Write(mbStr, mbLen);
	delete [] mbStr;

	return ret;
}

BOOL WriteFileString(CBufferedFile &file, const CString &s) {
	int len = s.GetLength();
	char *str = new char[len];

	for (int i = 0; i < len; i++)
		str[i] = (char) s.GetAt(i);
	BOOL ret = file.Write(str, len);

	delete [] str;

	return ret;
}

// Hash ////

CString GetSha1Hash(const CString &str) {
	SHA1Context sha = { 0 };
	int err;
    uint8_t digest[20];

	err = SHA1Reset(&sha);
	err = SHA1Input(&sha, (LPCTSTR) str, str.GetLength());
	err = SHA1Result(&sha, digest);

	// convert to string
	CString hash;
	LPTSTR lpHash = hash.GetBufferSetLength(40);
	TCHAR hexTab[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
	for (int i = 0; i < 20; i++) {
		lpHash[2 * i] = hexTab[digest[i] & 0x0F];
		lpHash[(2 * i) + 1] = hexTab[(digest[i] >> 4) & 0x0F];
	}

	return hash;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲久草在线视频| 91国产福利在线| 在线电影一区二区三区| 亚洲欧美另类图片小说| 国产成+人+日韩+欧美+亚洲 | 天堂久久一区二区三区| av在线免费不卡| 中文字幕第一区综合| 国产福利一区二区三区视频| 在线综合亚洲欧美在线视频| 五月天视频一区| 欧美日韩黄色影视| 偷拍日韩校园综合在线| 欧美做爰猛烈大尺度电影无法无天| 中文字幕av不卡| 成人黄色在线看| 国产精品久久精品日日| 99精品视频在线观看| 中文字幕色av一区二区三区| 99久久99久久久精品齐齐| 亚洲欧美日韩中文字幕一区二区三区| 不卡的av在线播放| 国产精品久久三| 久久国内精品自在自线400部| 欧美一区二区三区视频| 男男成人高潮片免费网站| 精品免费国产一区二区三区四区| 老司机精品视频一区二区三区| 欧美亚洲日本国产| 日韩激情一二三区| 欧美一级一级性生活免费录像| 一区二区三区中文字幕| 99在线精品免费| 综合久久国产九一剧情麻豆| 成人av在线资源网站| 亚洲国产精品ⅴa在线观看| av午夜一区麻豆| 亚洲国产欧美另类丝袜| 日韩欧美亚洲国产精品字幕久久久| 日本成人在线一区| 国产亚洲综合在线| 日本电影亚洲天堂一区| 日本在线播放一区二区三区| 久久久精品人体av艺术| 99riav久久精品riav| 色哟哟一区二区在线观看| 亚洲视频香蕉人妖| 99免费精品在线| 亚洲一区二区黄色| 亚洲国产成人va在线观看天堂| 欧美绝品在线观看成人午夜影视| 久久成人免费网| 日韩伦理电影网| 日韩精品一区二区三区四区 | 欧美怡红院视频| 久久99久国产精品黄毛片色诱| 国产精品久久久久久久久果冻传媒| 欧日韩精品视频| 国产盗摄一区二区三区| 亚洲国产精品一区二区久久| 欧美日韩在线精品一区二区三区激情| 精品一区二区在线观看| 亚洲女女做受ⅹxx高潮| 日韩精品一区在线| 成人中文字幕合集| 另类人妖一区二区av| 亚洲视频综合在线| 精品日本一线二线三线不卡| 久国产精品韩国三级视频| 亚洲一区二区在线播放相泽| 久久久久久久久久美女| 日韩欧美久久一区| 欧美羞羞免费网站| 成人高清免费在线播放| 久久精品国产网站| 五月天视频一区| 亚洲免费看黄网站| 日韩精品一区二区三区视频| 欧美视频一二三区| 99久久精品国产导航| 国产精品 欧美精品| 麻豆极品一区二区三区| 亚洲r级在线视频| 一卡二卡三卡日韩欧美| 国产清纯白嫩初高生在线观看91| 日韩免费观看2025年上映的电影| 91麻豆swag| 成人性生交大合| 黄色小说综合网站| 青青草国产精品亚洲专区无| 亚洲妇熟xx妇色黄| 精品国产免费人成在线观看| 69久久夜色精品国产69蝌蚪网| 欧洲一区二区三区在线| 91视频在线观看| 91免费观看视频在线| 一本大道久久a久久综合| 成人小视频免费观看| 福利一区二区在线| 久久99精品国产.久久久久久| 久久精品国产99久久6| 天堂在线亚洲视频| 婷婷夜色潮精品综合在线| 亚洲成人免费影院| 国产精品久久久久aaaa| 亚洲欧美在线aaa| 久久久精品一品道一区| 国产欧美一区二区精品性| 久久久天堂av| 中文成人综合网| 国产精品久久久久久久午夜片 | 极品少妇一区二区三区精品视频 | 国产精品影视天天线| 国产一区二区三区在线观看免费 | 亚洲人成在线播放网站岛国| 亚洲欧洲国产日韩| 亚洲人快播电影网| 香蕉影视欧美成人| 裸体健美xxxx欧美裸体表演| 精品综合久久久久久8888| 国产在线播放一区二区三区| 五月天一区二区| 国产一区二区伦理| 成年人国产精品| 日本乱人伦一区| 欧美福利视频一区| 久久超级碰视频| 免费成人美女在线观看.| 精品一区二区三区在线播放 | 精品捆绑美女sm三区| 国产亚洲女人久久久久毛片| 亚洲精品自拍动漫在线| 秋霞午夜鲁丝一区二区老狼| 免费亚洲电影在线| 狠狠色丁香久久婷婷综| 国产成人免费高清| 欧美在线观看一区| 精品久久久网站| 午夜精品久久久久久久99樱桃| 国产在线播精品第三| 欧美精品 日韩| 亚洲欧洲国产日韩| 激情六月婷婷综合| 欧美亚洲日本国产| 欧美在线你懂得| 国产情人综合久久777777| 国产精品欧美经典| 免费欧美在线视频| 色综合久久综合中文综合网| 欧美成人三级在线| 亚洲视频免费看| 精品一区二区久久| 成人午夜视频网站| 日韩一级高清毛片| 综合精品久久久| 国产美女在线精品| 欧美日韩免费一区二区三区视频| 国产亚洲欧美在线| 日本欧美肥老太交大片| 日本韩国欧美国产| 中文字幕欧美激情一区| 日本网站在线观看一区二区三区| 不卡av在线免费观看| 日韩精品一区二区三区四区视频| 亚洲综合免费观看高清完整版在线| 亚洲国产日产av| 国产精品影音先锋| 国产精品一区二区你懂的| 日韩一区中文字幕| 热久久一区二区| 久久婷婷久久一区二区三区| 久久免费的精品国产v∧| 婷婷国产在线综合| 在线观看免费亚洲| 亚洲一区视频在线观看视频| av欧美精品.com| 久久精品日产第一区二区三区高清版| 天堂久久一区二区三区| 欧美日韩日本视频| 亚洲成人动漫精品| 欧美日韩在线播放三区| 亚洲欧美中日韩| 91久久一区二区| 欧美丰满嫩嫩电影| 麻豆freexxxx性91精品| 日韩欧美不卡在线观看视频| 久久精品国产一区二区| 日韩一区二区三区视频| 亚洲色图欧洲色图| 国产乱码字幕精品高清av| 欧美mv日韩mv| 亚洲在线中文字幕| 欧美人体做爰大胆视频| 国产精品美女久久久久高潮| 色综合激情久久| 亚洲精品视频免费观看| 欧美日韩美少妇| 天堂一区二区在线| 日韩欧美一级二级三级久久久| 国产九色精品成人porny|