//*************************************************************************************
//
//*************************************************************************************
CFragment *		CTraceRecorder::CreateFragment( CCodeBufferManager * p_manager )
{
	DAEDALUS_PROFILE( "CTraceRecorder::CreateFragment" );

	DAEDALUS_ASSERT( !mTraceBuffer.empty(), "No trace ready for creation?" );

	SRegisterUsageInfo	register_usage;
	Analyse( register_usage );

	CFragment *	p_frament( new CFragment( p_manager, mStartTraceAddress, mExpectedExitTraceAddress,
		mTraceBuffer, register_usage, mBranchDetails, mNeedIndirectExitMap ) );

	//DBGConsole_Msg( 0, "Inserting hot trace for [R%08x]!", mStartTraceAddress );

	mTracing = false;
	mStartTraceAddress = 0;
	mTraceBuffer.clear();
	mBranchDetails.clear();
	mExpectedExitTraceAddress = 0;
	mActiveBranchIdx = INVALID_IDX;
	mStopTraceAfterDelaySlot = false;
	mNeedIndirectExitMap = false;

	return p_frament;
}
//开始分析   
bool AnalyseClassCallRelation::Analyse()
{
	//是否获取读取clw文件 
	//不从clw文件获取类与资源的关系
	/*
	if ( m_vRelationData.empty() )
	{
		GetClwFile(); 
	}
	*/
	//获取文件列表 
	vector<ClassSource> vFileList; 
	if (! GetFileList(vFileList))
	{
		return false; 
	}
	//先分配7K的内存用来存放文件
	GetMemory(40*1024);
	//对文件列表里文件做处理
	vector<string> vClass;
	vector<ClassSource>::iterator iter = vFileList.begin(); 
	FILE *fp; 
	fp = fopen("Test.data", "w"); 
	while (iter != vFileList.end() )
	{
		//获取头文件信息, 得出该文件需要分析的类 
		vClass.clear();
		string strFileName = iter->strName + ".h"; 

		DWORD dwFileStartTime = GetTickCount();  
		if (! GetClassFromHeader(strFileName, vClass) )
		{
			++ iter ;
			continue; 
		}
		//判断是否为clw中的类
		vector<string>::iterator strIter = vClass.begin(); 
		while (strIter != vClass.end() )
		{

//			if (IsClwClass(*strIter))
			{
				//是clw中的类,分析, 传入类实现文件 头文件和实现文件只有后缀区别
				Analyse(iter->strName, *strIter); 
			}
			++ strIter; 
		}
		
		++ iter ;
		DWORD dwFileEndTime = GetTickCount(); 
		fprintf(fp, "%s %d\n", strFileName.c_str(), dwFileEndTime-dwFileStartTime); 

	}
	fclose(fp); 
	return true; 
}
void DateSpanArray::Analyse( const YKString& dateSpan )
{
	//add by yp 2009.11.3	使用显示时间日历
	YKSchSysParamSPtr schSys = g_Application.GetModule<YKDataBase>()->Get<YKSchSysParam>();
	YKDateTime stTm = schSys->GetSchStartTime().GetDate();
	stTm = YKTools::YKMin(schSys->GetShowStartTime().GetDate(), stTm);
	YKDateTime edTm = (schSys->GetShowEndTime() + 86400).GetDate();
	edTm = YKTools::YKMax((schSys->GetSchEndTime()+ 86400).GetDate(),edTm);
	Analyse(dateSpan,stTm.GetDateTime(),edTm.GetDateTime());
}
//开发测试用
void AnalyseClassCallRelation::Test()
{
	m_strProjectPath = "B:\\TestData\\ClientDemo";    //分析目录
	m_strProjectName = "ClientDemo";  //项目名称
	Analyse();
	deque<ClassResourceRelation> qCall; 
	QuerybyID("IDD_DLG_REOMTE_TEMPEXCEPTION", qCall);
//	vector<ClassSource> vFileList ;
//	GetFileList(vFileList); 
//	GetClwFile(); 
	return ; 
}
bool CHttpProtocol::Connect()
{
	SOCKADDR_IN	SockAddr;
	PREQUEST pReq = new REQUEST;
	if (pReq == NULL)
	{   
		// 处理错误
		printf("No memory for request\n");
		return false;
	}
	pReq->Socket = INVALID_SOCKET;
	pReq->hFile = INVALID_HANDLE_VALUE;
	pReq->dwRecv = 0;
	pReq->dwSend = 0;

	// Accept a client socket
	pReq->Socket = accept(ListenSocket, (LPSOCKADDR)&SockAddr, NULL);
	// No longer need server socket
    closesocket(ListenSocket);

	if (pReq->Socket == INVALID_SOCKET)
	{
		printf("accept failed: %d\n", WSAGetLastError());
		closesocket(ListenSocket);
		WSACleanup();
		return false;
	}
	// 将客户端网络地址转换为用点分割的IP地址
	printf("%s Connecting on socket:%d\n", inet_ntoa(SockAddr.sin_addr), pReq->Socket);

	char buf[DATA_BUFSIZE] = "";
	bool nRet;

	// 接收request data
	if (!RecvRequest(pReq, buf, sizeof(buf)))
	{
		Disconnect(pReq);
		delete pReq;
		return false;
	}
	 // 分析request信息
	Analyse(pReq, buf);
	if(!strcmp(HTTP_STATUS_NOTIMPLEMENTED, pReq->StatuCodeReason))
	{
		printf("Request method not implemented\n");
		return false;
	}
	// 生成并返回头部
	if(!SendHeader(pReq))
	{
		printf("Send header failed\n");
		return false;
	}

	// 向client传送数据
	if(pReq->nMethod == METHOD_GET)
		SendFile(pReq);
	Disconnect(pReq);
	delete pReq;
	return true;
}
DateSpanArray::DateSpanArray(const YKString& dateSpan)
{
	Analyse(dateSpan);
}