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

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

?? feed.cpp.svn-base

?? wince c++ 下 開發的 rss 閱讀器源代碼
?? SVN-BASE
?? 第 1 頁 / 共 2 頁
字號:
/**
 *  Feed.cpp
 *
 *  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/>.
 *
 */

#ifdef PRSSR_APP
	#include "StdAfx.h"
	#include "prssr.h"
#endif

#ifdef PRSSR_TODAY
	#include "../prssrtoday/StdAfx.h"
#endif

#include "Feed.h"
#include "xml/FeedFile.h"
#include "Site.h"

#include "sha1/sha1.h"
#include "../share/reg.h"
#include "../share/helpers.h"
#include "../share/str.h"
#include "../share/cache.h"
#include "www/LocalHtmlFile.h"

#ifdef PRSSR_APP
	#include "Config.h"
//	#include "WebDownloader.h"
//	#include "WebHtml.h"
	#include "net/Connection.h"
#elif defined PRSSR_TODAY || PRSSR_TODAYSTUB
	#include "../prssrtoday/Config.h"
#endif

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

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


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

void FeedDiff(CFeed *first, CFeed *second, CArray<CFeedItem *, CFeedItem *> *diff) {
	LOG0(5, "FeedDiff()");

	CCache cache;
	int i;

	if (second != NULL)
		for (i = 0; i < second->GetItemCount(); i++)
			cache.AddItem(second->GetItem(i)->Hash);

	if (first != NULL)
		for (i = 0; i < first->GetItemCount(); i++) {
			CFeedItem *fi = first->GetItem(i);
			if (!cache.InCache(fi->Hash))
				diff->Add(fi);
		}
}


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CFeedItem::CFeedItem(CSiteItem *si) {
	SiteItem = si;
	Flags = MESSAGE_NEW;
#ifdef PRSSR_APP
	Hidden = FALSE;
	ZeroMemory(&Date, sizeof(Date));
#endif
	ZeroMemory(&PubDate, sizeof(PubDate));
}

CFeedItem::CFeedItem(const CFeedItem &o) {
	SiteItem = o.SiteItem;

	Hash = o.Hash;
	Flags = o.Flags;
	PubDate = o.PubDate;
	Title = o.Title;
	Link = o.Link;

#ifdef PRSSR_APP
	Description = o.Description;
	Hidden = o.Hidden;
	Author = o.Author;
	Date = o.Date;

	while (!Enclosures.IsEmpty())
		delete Enclosures.RemoveHead();

	POSITION pos = o.Enclosures.GetHeadPosition();
	while (pos != NULL) {
		CEnclosureItem *enclosure = o.Enclosures.GetNext(pos);
		Enclosures.AddTail(new CEnclosureItem(*enclosure));
	}

	for (int i = 0; i < o.KeywordPos.GetSize(); i++)
		KeywordPos.SetAtGrow(i, o.KeywordPos[i]);
#endif
}


CFeedItem::~CFeedItem() {
#ifdef PRSSR_APP
	while (!Enclosures.IsEmpty())
		delete Enclosures.RemoveHead();
#endif
}

#if defined PRSSR_APP

void CFeedItem::ComputeHash(CString prefix) {
	LOG0(5, "CFeedItem::ComputeHash()");

	SHA1Context sha = { 0 };
	int err;
    uint8_t digest[20];

	CString strMessage;
	strMessage.Format(_T("%s%s%s"), prefix, Title, Link);

	err = SHA1Reset(&sha);
	err = SHA1Input(&sha, strMessage.GetBuffer(strMessage.GetLength()), strMessage.GetLength());
	strMessage.ReleaseBuffer();
	err = SHA1Result(&sha, digest);

	// convert to string
	LPTSTR hash = 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++) {
		hash[2 * i] = hexTab[digest[i] & 0x0F];
		hash[(2 * i) + 1] = hexTab[(digest[i] >> 4) & 0x0F];
	}
}

void CFeedItem::GetItemImages(CStringList &list) {
	LOG0(5, "CFeedItem::GetItemImages()");

	CString html;
	html.Format(_T("<div>%s</div>"), Description);		// workaround for libsgml

	CLocalHtmlFile h;
	h.LoadFromMemory(html);
	h.ExtractImages(list);
}

void CFeedItem::GetEnclosures(CStringList &list, DWORD limit/* = 0*/) {
	LOG0(5, "CFeedItem::GetEnclosures()");

	POSITION pos = Enclosures.GetHeadPosition();
	while (pos != NULL) {
		CEnclosureItem *enclosure = Enclosures.GetNext(pos);

		if (limit == 0 || enclosure->Length <= limit)
			list.AddTail(enclosure->URL);
	}
}


void CFeedItem::UpdateHiddenFlag() {
	Hidden = FALSE;
}
#endif

void CFeedItem::SetFlags(DWORD flags, DWORD mask) {
	Flags = (Flags & ~mask) | flags;
	SiteItem->SetModified();
}

#if defined PRSSR_APP

void CFeedItem::SearchKeywords(CStringArray &keywords) {
	LOG0(5, "CFeedItem::SearchKeywords()");

	KeywordPos.RemoveAll();

	for (int k = 0; k < keywords.GetSize(); k++) {
		CString kword = keywords.GetAt(k);

		CString text = StripHtmlTags(Description);
		if (text.Find(kword) != -1) {
			KeywordPos.Add(k);
		}
	}
}
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CFeed::CFeed() {
	FILETIME ft = { 0 };

#ifdef PRSSR_APP
	memset(&Published, 0, sizeof(Published));
	UpdateInterval = 0;
#endif

	InitializeCriticalSection(&CS);
}

CFeed::~CFeed() {
	DeleteCriticalSection(&CS);
}

// Load/Save

struct CArchiveFileChunkHeader {
	char Id[4];
	DWORD Size;

	BOOL Load(CBufferedFile &file) {
		if (!file.Read(Id, 4))
			return FALSE;
		if (!file.Read(&Size, 4))
			return FALSE;

		return TRUE;
	}

	BOOL Save(CBufferedFile &file) {
		if (!file.Write(Id, 4))
			return FALSE;
		return file.Write(&Size, sizeof(DWORD));
	}
};

struct CArchiveFileChunk {
	CArchiveFileChunkHeader Header;
	char *Data;
	CList<CArchiveFileChunk *, CArchiveFileChunk*> Childs;

	CArchiveFileChunk(char id[]) {
//		assert(strlen(id) == 4);
		strncpy(Header.Id, id, 4);
		Header.Size = 0;

		Data = NULL;
	}

	void Add(CArchiveFileChunk *chunk) {
//		LOG1(5, "CArchiveFileChunk::Add(%p) - chunk", chunk);

		Childs.AddTail(chunk);
	}

	void Add(char id[], const CString &str) {
//		LOG2(5, "CArchiveFileChunk::Add('%s', '%S')", id, str);

		CArchiveFileChunk *chunk = new CArchiveFileChunk(id);
		chunk->Data = WCharToChar(str, CP_UTF8);
		chunk->Header.Size = strlen(chunk->Data);

		Add(chunk);
	}

	void Add(char id[], int number) {
//		LOG2(5, "CArchiveFileChunk::Add('%s', %d)", id, number);

		CArchiveFileChunk *chunk = new CArchiveFileChunk(id);
		chunk->Data = new char [sizeof(int)];
		memcpy(chunk->Data + 0, &number, sizeof(number));
		chunk->Header.Size = sizeof(int);
		Add(chunk);
	}

	void Add(char id[], SYSTEMTIME &st) {
//		LOG1(5, "CArchiveFileChunk::Add('%s', ) - systime", id);

		CArchiveFileChunk *chunk = new CArchiveFileChunk(id);

		FILETIME ft;
		SystemTimeToFileTime(&st, &ft);

		chunk->Data = new char [sizeof(DWORD) * 2];
		memcpy(chunk->Data + 0, &ft.dwHighDateTime, sizeof(DWORD));
		memcpy(chunk->Data + 4, &ft.dwLowDateTime, sizeof(DWORD));
		chunk->Header.Size = sizeof(DWORD) * 2;

		Add(chunk);
	}

	void Add(char id[], CArray<int, int> &arr) {
//		LOG2(5, "CArchiveFileChunk::Add('%s', %d)", id, number);

		CArchiveFileChunk *chunk = new CArchiveFileChunk(id);
		chunk->Data = new char [sizeof(int) * arr.GetSize()];
		int *dest = (int *) chunk->Data;
		for (int i = 0; i < arr.GetSize(); i++)
			dest[i] = arr[i];
		chunk->Header.Size = sizeof(int) * arr.GetSize();
		Add(chunk);
	}


	~CArchiveFileChunk() {
		delete [] Data;
		while (!Childs.IsEmpty())
			delete Childs.RemoveHead();
	}

	void CalcSize() {
//		LOG0(5, "CArchiveFileChunk::CalcSize()");

		if (Childs.GetCount() > 0) {
			Header.Size = 0;
			POSITION pos = Childs.GetHeadPosition();
			while (pos != NULL) {
				CArchiveFileChunk *fc = Childs.GetNext(pos);
				fc->CalcSize();
				Header.Size += fc->Header.Size + 8;
			}
		}
	}

	void Save(CBufferedFile &file) {
//		LOG0(5, "CArchiveFileChunk::Save()");

		Header.Save(file);
		if (Childs.GetCount() > 0) {
			POSITION pos = Childs.GetHeadPosition();
			while (pos != NULL) {
				CArchiveFileChunk *fc = Childs.GetNext(pos);
				fc->Save(file);
			}
		}
		else {
			if (Data != NULL)
				file.Write(Data, Header.Size);
		}
	}
};

static BOOL ReadString(CBufferedFile &file, int len, CString &str) {
	if (len > 0) {
		char *buffer = new char[len + 1];
		memset(buffer, 0, sizeof(char) * (len + 1));
		if (!file.Read(buffer, len)) {
			delete [] buffer;
			return FALSE;
		}
		str = CharToWChar(buffer, CP_UTF8);
		delete [] buffer;
	}
	else
		str.Empty();

	return TRUE;
}

static BOOL ReadNumber(CBufferedFile &file, int &number) {
	int i;
	if (!file.Read(&i, sizeof(i)))
		return FALSE;
	number = i;
	return TRUE;
}

static BOOL ReadNumber(CBufferedFile &file, DWORD &number) {
	DWORD i;
	if (!file.Read(&i, sizeof(i)))
		return FALSE;
	number = i;
	return TRUE;
}

static BOOL ReadSystemTime(CBufferedFile &file, SYSTEMTIME &st) {
	FILETIME ft;
	char buffer[8];
	if (!file.Read(buffer, sizeof(buffer)))
		return FALSE;
	memcpy(&ft.dwHighDateTime, buffer + 0, sizeof(DWORD));
	memcpy(&ft.dwLowDateTime, buffer + 4, sizeof(DWORD));
	FileTimeToSystemTime(&ft, &st);
	return TRUE;
}

static BOOL ReadIntArray(CBufferedFile &file, int len, CArray<int, int> &array) {
	for (int i = 0; i < (int) (len / sizeof(int)); i++) {
		int number;
		if (!ReadNumber(file, number))
			return FALSE;
		array.Add(number);
	}

	return TRUE;
}

BOOL CFeed::Load(LPCTSTR fileName, CSiteItem *si) {
	LOG1(5, "CFeed::Load('%S')", fileName);

	CBufferedFile file;
	if (!file.Create(fileName, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL))
		return FALSE;

	DWORD remain;
	CArchiveFileChunkHeader header;
	if (!header.Load(file) || strncmp(header.Id, "PRSS", 4) != 0)
		return FALSE;

//	LOG0(1, "- loading header");

	// load HEAD
	if (!header.Load(file) || strncmp(header.Id, "HEAD", 4) != 0)
		return FALSE;
	remain = header.Size;
	while (remain > 0) {
		CArchiveFileChunkHeader hdr;
		if (!hdr.Load(file))
			return FALSE;
		remain -= 8;		// sizeof(hdr)

		if (strncmp(hdr.Id, "TITL", 4) == 0)
			ReadString(file, hdr.Size, Title);
#ifdef PRSSR_APP
		else if (strncmp(hdr.Id, "LINK", 4) == 0)
			ReadString(file, hdr.Size, HtmlUrl);
		else if (strncmp(hdr.Id, "DESC", 4) == 0)
			ReadString(file, hdr.Size, Description);
		else if (strncmp(hdr.Id, "PUBL", 4) == 0)
			ReadSystemTime(file, Published);
		else if (strncmp(hdr.Id, "LANG", 4) == 0)
			ReadString(file, hdr.Size, Language);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品亚洲а∨天堂免在线| 欧美激情一区二区| 国产日韩欧美a| 成人一道本在线| 久久久久国产一区二区三区四区| 91毛片在线观看| 紧缚捆绑精品一区二区| 亚洲午夜精品网| 亚洲欧洲成人精品av97| 久久综合成人精品亚洲另类欧美 | 国产午夜精品久久久久久免费视| 色婷婷亚洲精品| 国产成人午夜片在线观看高清观看| 午夜视黄欧洲亚洲| 亚洲人午夜精品天堂一二香蕉| 精品国产髙清在线看国产毛片| 欧美三日本三级三级在线播放| 国产成人精品影院| 国产一区欧美一区| 久久精品国产第一区二区三区| 婷婷丁香久久五月婷婷| 夜夜揉揉日日人人青青一国产精品| 欧美精品一区二区久久久| 国产亚洲成av人在线观看导航| 欧美色视频在线| 国产盗摄视频一区二区三区| 美女国产一区二区三区| 午夜av一区二区三区| 亚洲国产综合在线| 一区二区三区高清| 亚洲免费成人av| 亚洲欧美区自拍先锋| 成人欧美一区二区三区视频网页| 国产欧美日韩一区二区三区在线观看| 欧美大度的电影原声| 欧美一区二区视频网站| 欧美日韩国产一二三| 在线观看日韩高清av| 欧美天天综合网| 欧美日本在线观看| 88在线观看91蜜桃国自产| 欧美嫩在线观看| 欧美一区二区三区啪啪| 日韩一二三区视频| 欧美大度的电影原声| 欧美精品一区二区高清在线观看| 亚洲精品在线电影| 麻豆一区二区三| 国产女主播一区| 日本高清不卡aⅴ免费网站| 日韩视频中午一区| 欧美日韩免费不卡视频一区二区三区| 在线精品视频一区二区三四| 色哟哟在线观看一区二区三区| 91福利小视频| 777奇米成人网| 精品伦理精品一区| 久久精品这里都是精品| 国产精品免费网站在线观看| 亚洲品质自拍视频网站| 丝袜亚洲另类丝袜在线| 国产又粗又猛又爽又黄91精品| 国产精品18久久久久久久久| 成人国产在线观看| 欧美亚洲国产一区二区三区va | 成人免费看的视频| 91网站在线播放| 亚洲国产日韩a在线播放性色| 欧美丰满少妇xxxbbb| 在线观看三级视频欧美| 欧美一区二区不卡视频| 久久婷婷一区二区三区| 日韩伦理电影网| 奇米在线7777在线精品| 大白屁股一区二区视频| 欧美午夜一区二区三区免费大片| 日韩三级在线免费观看| 国产精品伦理一区二区| 三级在线观看一区二区| 国产.精品.日韩.另类.中文.在线.播放| 99精品欧美一区二区蜜桃免费| 欧美精品欧美精品系列| 国产精品另类一区| 日日欢夜夜爽一区| www.在线欧美| 日韩欧美区一区二| 亚洲天堂成人在线观看| 麻豆国产欧美日韩综合精品二区| 不卡的电视剧免费网站有什么| 777欧美精品| 亚洲情趣在线观看| 国产精品自产自拍| 3atv在线一区二区三区| 国产精品久久久久7777按摩| 麻豆视频观看网址久久| 色婷婷亚洲婷婷| 亚洲乱码一区二区三区在线观看| 中文久久乱码一区二区| 一区二区三区欧美日| 国模少妇一区二区三区| 欧美日本在线播放| 综合激情成人伊人| 国产精品一区二区久激情瑜伽| 69精品人人人人| 樱花影视一区二区| 99视频在线精品| 久久精品一区二区三区av| 日韩精品一二三四| 在线视频你懂得一区二区三区| 国产日本欧洲亚洲| 免费欧美在线视频| 欧美高清精品3d| 一区二区不卡在线播放| a在线欧美一区| 日本一区二区三区dvd视频在线| 蜜桃av噜噜一区| 制服.丝袜.亚洲.中文.综合| 亚洲国产毛片aaaaa无费看| 91色视频在线| 国产精品传媒视频| 丁香激情综合五月| 国产亚洲精品7777| 国产精品一区在线观看乱码| 精品国产免费久久| 极品少妇xxxx偷拍精品少妇| 欧美一级二级三级蜜桃| 喷水一区二区三区| 欧美一区二区三区的| 日韩av成人高清| 91精品国产高清一区二区三区蜜臀| 一区二区三区欧美在线观看| 91成人免费在线视频| 一区二区三区免费在线观看| 91日韩在线专区| 一区二区三区四区乱视频| 在线观看视频欧美| 亚洲成人黄色小说| 欧美在线三级电影| 91精品国产综合久久久蜜臀图片| 亚洲午夜精品久久久久久久久| 欧美日韩精品专区| 丝袜美腿亚洲一区| 日韩欧美一级二级三级久久久| 美女诱惑一区二区| 欧美精品一区二区三区视频 | av一区二区三区| 亚洲色图在线播放| 欧美精选在线播放| 免费在线观看不卡| 国产日韩av一区| 91玉足脚交白嫩脚丫在线播放| 亚洲一区二区欧美激情| 91精品国产入口| 国产麻豆精品theporn| 国产清纯白嫩初高生在线观看91| 不卡的看片网站| 亚洲成a人在线观看| 日韩欧美在线123| 成人av资源在线| 亚洲成人你懂的| 欧美精品一区二区三区蜜臀| www.亚洲在线| 午夜久久久久久| ww久久中文字幕| 色噜噜久久综合| 老司机免费视频一区二区| 国产日韩欧美电影| 在线视频观看一区| 麻豆精品一区二区综合av| 久久精品欧美日韩| 欧美综合一区二区| 精品一二三四区| 亚洲日本在线观看| 日韩欧美在线网站| 91美女在线观看| 国产综合色产在线精品| 亚洲精品中文在线观看| 欧美电影免费提供在线观看| 99久久婷婷国产综合精品电影 | 喷水一区二区三区| 综合激情成人伊人| 欧美大片国产精品| 91啦中文在线观看| 国产一区二区三区不卡在线观看 | 亚洲午夜三级在线| 国产欧美一区二区精品性| 欧美三级一区二区| 国产成人免费视频网站| 日本va欧美va瓶| 亚洲精选免费视频| 国产欧美一区二区精品秋霞影院 | 51精品久久久久久久蜜臀| av资源网一区| 极品美女销魂一区二区三区免费| 一区二区三区色| 国产精品国产自产拍在线| 日韩精品一区二区三区视频| 欧美日韩一区不卡| 色哟哟日韩精品| 成人18精品视频|