⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 resdataprovider.cpp

📁 1)动态加载中间(2)规范化中间层接口 (3)解释本地文件系统(4)基于数据库的数据提供(5)数据库设计(6)优化数据提供逻辑(7)程序框架结构图
💻 CPP
字号:
// ResDataProvider.cpp: implementation of the CResDataProvider class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "resExplorer.h"
#include "ResDataProvider.h"

#include "ResExplorerTree.h"
#include "MainFrm.h"
#include "resExplorerView.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#include "ResDataProviderModuleManager.h"
static CResDataProviderModuleManager  DPModuleMgr;

typedef struct threadparam
{
   CString id;//目录标识号
}THREADPARAM;

THREADPARAM mythreadparam;//线程参数

//加载子目录线程体
UINT GetChildrenThread(LPVOID pParam)
{   
  	CString id;
    id=((THREADPARAM* )pParam)->id;
    MSXML::IXMLDOMElement * pXMLDOM;
	//调用数据提供模块管理器中的数据
    pXMLDOM=DPModuleMgr.GetChildren(id);
	CMainFrame* MainFrame1=((CMainFrame*)(AfxGetApp()->m_pMainWnd));
	CResExplorerTree* pView=(MainFrame1->m_pTreeView);
 
	pView->InsertXMLItem(pXMLDOM);

	return 0;

}
//加载目录下文件线程体
UINT GetChildrenListThread(LPVOID pParam)
{   
  	CString id;
    id=((THREADPARAM* )pParam)->id;

    MSXML::IXMLDOMElement * pXMLDOM;
	//调用数据提供模块管理器中的数据
    pXMLDOM=DPModuleMgr.GetChildrenList(id);

	CMainFrame* MainFrame1=((CMainFrame*)(AfxGetApp()->m_pMainWnd));
	CResExplorerView* pView=MainFrame1->m_pListView;
	
	pView->InsertXMLItem(pXMLDOM);

	return 0;

}




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

CResDataProvider::CResDataProvider()
{
       m_displaySettingDOM=NULL;
   //获取主程序所在路径,存在sPath中
       CString sPath;
       GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
       sPath.ReleaseBuffer ();
       int nPos;
       nPos=sPath.ReverseFind ('\\');
       sPath=sPath.Left (nPos);
       CString tmpStr=sPath+"\\setting\\display.xml";
       if(!LoadDispalySetting(tmpStr)){
            AfxMessageBox("显示配置文件加载失败");
	   }
}

CResDataProvider::~CResDataProvider()
{

}
MSXML::IXMLDOMElement * CResDataProvider::GetChildren(CString id)
{
	mythreadparam.id=id;
	AfxBeginThread(GetChildrenThread,&mythreadparam);
	AfxBeginThread(GetChildrenThread,&mythreadparam);
	return NULL;
}

MSXML::IXMLDOMElement * CResDataProvider::GetResLibs()
{
	MSXML::IXMLDOMDocument* document = NULL;
	MSXML::IXMLDOMParseError* parseError = NULL;
	MSXML::IXMLDOMElement* element = NULL;	
	CString xmlStr;
	xmlStr="";
	xmlStr+="<tree>";  
	int max=DPModuleMgr.ModulePtrArray.GetSize();
	for(int i=0;i<max;i++){
	  xmlStr+="<item text=\"" +DPModuleMgr.GetLibName(i)+ "\" pid=\"root\" id=\"" + DPModuleMgr.GetLibID(i) + "\" icon=\"disk\"/>";
	}
    xmlStr+="</tree>";
	HRESULT hr;
	hr = CoInitialize(NULL);
	if (FAILED(hr)) {
		return FALSE;
	}
	hr =CoCreateInstance(MSXML::CLSID_DOMDocument, NULL, 
		CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, 
		MSXML::IID_IXMLDOMDocument, (LPVOID*)&document);
	if (!document) {
		return FALSE;
	}
	BSTR bstr = NULL;
	document->put_async(VARIANT_FALSE);
	bstr = xmlStr.AllocSysString();
	VARIANT_BOOL varOkay = document->loadXML(bstr);
	SysFreeString(bstr);

	if (varOkay) {
		hr = document->get_documentElement(&element);
		//document->getElementsByTagName("tree");
		if (FAILED(hr) || element == NULL) {
		    AfxMessageBox(_T("Error Loading XML"));
			return FALSE;
		}
		//AfxMessageBox(CString((char *)(element->Getxml())));
		return element;
	} else {
		long line, linePos;
		BSTR reason = NULL;
		
		document->get_parseError(&parseError);
		parseError->get_errorCode(&hr);
		parseError->get_line(&line);
		parseError->get_linepos(&linePos);
		parseError->get_reason(&reason);
		
		CString strMsg;
		strMsg.Format(_T("Error 0x%.8X on line %d, position %d\r\nReason: %s"), 
			hr, line, linePos, CString(reason));
		AfxMessageBox(strMsg);
				
		SysFreeString(reason);
		return FALSE;
	}

   return FALSE;
}
CString CResDataProvider::GetFilePathByID(CString id)
{   
	 CString url=DPModuleMgr.GetFilePathByID(id);
   
	 return url;

}
int CResDataProvider::GetDispalySetting(CString id)
{ 
    int defaultvalue=4;
	if(this->m_displaySettingDOM==NULL){
        return defaultvalue;
	}

	MSXML::IXMLDOMNodeListPtr pNodeList;
    pNodeList=this->m_displaySettingDOM->getElementsByTagName("item");


	long count=pNodeList->Getlength();

    for(int i=0;i<count;i++){

		MSXML::IXMLDOMNodePtr pNode=pNodeList->Getitem(i);
		MSXML::IXMLDOMNamedNodeMap* namedNodeMap = NULL;
		HRESULT hr = S_OK;
		hr = pNode->get_attributes(&namedNodeMap);
		if (SUCCEEDED(hr) && namedNodeMap != NULL) {
			MSXML::IXMLDOMNodePtr pIDNode=namedNodeMap->getNamedItem("id");
            BSTR tmpID;
			hr=pIDNode->get_text(&tmpID);
			MSXML::IXMLDOMNodePtr pStateNode=namedNodeMap->getNamedItem("state");
            BSTR tmpState;
			hr=pStateNode->get_text(&tmpState);
            if(CString(tmpID)==id){
				CString strState((_com_util::ConvertBSTRToString(pStateNode->text)));
				return atoi(strState);
			}
		}
	}

     return defaultvalue;
}

BOOL CResDataProvider::SetDispalySetting(CString id, int state)
{
	if(this->m_displaySettingDOM==NULL){
        return false;
	}

	MSXML::IXMLDOMNodeListPtr pNodeList;
    pNodeList=this->m_displaySettingDOM->getElementsByTagName("item");


	long count=pNodeList->Getlength();

    for(int i=0;i<count;i++){

		MSXML::IXMLDOMNodePtr pNode=pNodeList->Getitem(i);
		MSXML::IXMLDOMNamedNodeMap* namedNodeMap = NULL;
		HRESULT hr = S_OK;
		hr = pNode->get_attributes(&namedNodeMap);
		if (SUCCEEDED(hr) && namedNodeMap != NULL) {
			MSXML::IXMLDOMNodePtr pIDNode=namedNodeMap->getNamedItem("id");
            BSTR tmpID;
			hr=pIDNode->get_text(&tmpID);

			MSXML::IXMLDOMNodePtr pStateNode=namedNodeMap->getNamedItem("state");
            BSTR tmpState;
			hr=pStateNode->get_text(&tmpState);
            if(CString(tmpID)==id){
				BSTR bstr = NULL;
				CString s;
				s.Format("%i",state);
				bstr = s.AllocSysString();
				pStateNode->text=(bstr);
				SysFreeString(bstr);


				return true;
			}
		}
	}
	//如果还未设置,添加一新的设置

    //MSXML::IXMLDOMNodePtr pNode=m_displaySettingDOM->createNode("element","item");
    //MSXML::IXMLDOMNodePtr pIDNode=m_displaySettingDOM->createAttribute("id");

  CString xmlStr;
  xmlStr="";
  xmlStr+="<setting>";  
  CString s;
  s.Format("%i",state);
  xmlStr+="<item  id=\"" + id + "\" state=\"" + s + "\"/>";
  xmlStr+="</setting>";
  MSXML::IXMLDOMDocument* tmpDOM;
	HRESULT hr;
	hr = CoInitialize(NULL);
	if (FAILED(hr)) {
	//	return FALSE;
	}
	hr =CoCreateInstance(MSXML::CLSID_DOMDocument, NULL, 
		CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, 
		MSXML::IID_IXMLDOMDocument, (LPVOID*)&tmpDOM);
	if (!tmpDOM) {
	//	return FALSE;
	}
    tmpDOM->put_async(VARIANT_FALSE);
	BSTR bstr = NULL;
	bstr = xmlStr.AllocSysString();
	//AfxMessageBox(CString(bstr));
	VARIANT_BOOL varOkay = tmpDOM->loadXML(bstr);
	SysFreeString(bstr);
  MSXML::IXMLDOMNodePtr pNode=tmpDOM->GetfirstChild();
  MSXML::IXMLDOMNodePtr pItemNode=pNode->GetfirstChild();
  //AfxMessageBox(pItemNode->xml);
		//	AfxMessageBox("bstr");
   m_displaySettingDOM->GetfirstChild()->appendChild(pItemNode);

   return true;
}

BOOL CResDataProvider::LoadDispalySetting(const CString &strFileName)
{
	MSXML::IXMLDOMDocument* document = NULL;
	MSXML::IXMLDOMParseError* parseError = NULL;
	MSXML::IXMLDOMElement* element = NULL;	
  CString xmlStr;
  xmlStr="";
  xmlStr+="<setting>";  
/*
  xmlStr+="<item text=\"语文资源库\" pid=\"root\" id=\"ywlib\" icon=\"disk\"/>";
  xmlStr+="<item text=\"英语资源库\" pid=\"root\" id=\"enlib\" icon=\"disk\"/>";
  xmlStr+="<item text=\"数学资源库\" pid=\"root\" id=\"sxlib\" icon=\"disk\"/>";
  xmlStr+="<item text=\"物理资源库\" pid=\"root\" id=\"wllib\" icon=\"disk\"/>";
  xmlStr+="<item text=\"化学资源库\" pid=\"root\" id=\"hxlib\" icon=\"disk\"/>";
*/
  xmlStr+="</setting>";

	HRESULT hr;
	hr = CoInitialize(NULL);
	if (FAILED(hr)) {
		return FALSE;
	}
	
	hr =CoCreateInstance(MSXML::CLSID_DOMDocument, NULL, 
		CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, 
		MSXML::IID_IXMLDOMDocument, (LPVOID*)&document);


	if (!document) {
		return FALSE;
	}

	BSTR bstr = NULL;
	document->put_async(VARIANT_FALSE);
	bstr = strFileName.AllocSysString();
	VARIANT_BOOL varOkay = document->load(bstr);
	SysFreeString(bstr);
	if (varOkay) {
		hr = document->get_documentElement(&element);
		//document->getElementsByTagName("tree");
		if (FAILED(hr) || element == NULL) {
		    AfxMessageBox(_T("Error Loading XML"));
			return FALSE;
		}
		m_displaySettingDOM=document;
		//AfxMessageBox(CString((char *)(element->Getxml())));





		return true;
	} else {
		long line, linePos;
		BSTR reason = NULL;
		document->get_parseError(&parseError);
		parseError->get_errorCode(&hr);
		parseError->get_line(&line);
		parseError->get_linepos(&linePos);
		parseError->get_reason(&reason);
		CString strMsg;
		strMsg.Format(_T("Error 0x%.8X on line %d, position %d\r\nReason: %s"), 
			hr, line, linePos, CString(reason));
		AfxMessageBox(strMsg);
		SysFreeString(reason);
		return FALSE;
	}




    return FALSE;

}

BOOL CResDataProvider::SaveDispalySetting(const CString &strFileName)
{

	this->m_displaySettingDOM->save(&_variant_t(strFileName)); 
    return true;
}

BOOL CResDataProvider::SaveSetting()
{
        CString sPath;
       GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
       sPath.ReleaseBuffer ();
       int nPos;
       nPos=sPath.ReverseFind ('\\');
       sPath=sPath.Left (nPos);
       CString tmpStr=sPath+"\\setting\\display.xml";
       SaveDispalySetting(tmpStr);
	   return true;
}


MSXML::IXMLDOMElement * CResDataProvider::GetChildrenList(CString id)
{	mythreadparam.id=id;
	AfxBeginThread(GetChildrenListThread,&mythreadparam);
	return NULL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -