resdataprovider.cpp

来自「能像Windows操作系统的资源管理器一样将资源按目录(文件夹文件)的形式组织起」· C++ 代码 · 共 458 行

CPP
458
字号
// ResDataProvider.cpp: implementation of the CResDataProvider class.
//
//////////////////////////////////////////////////////////////////////

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

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

//////////////////////////////////////////////////////////////////////
// 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)
{
	MSXML::IXMLDOMDocument* document = NULL;
	MSXML::IXMLDOMParseError* parseError = NULL;
	MSXML::IXMLDOMElement* element = NULL;	
  CString xmlStr;
  xmlStr="";
  xmlStr+="<tree>";  
  int i;
  for(i=1;i<=10;i++){
	  CString s;
	  s.Format("<item text=\"资源目录%i(%s)\" pid=\"%s\" id=\"%s:%i\" icon=\"folder\"/>",i,id,id,id,i);
    xmlStr+=s;
  }

  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;
}

MSXML::IXMLDOMElement * CResDataProvider::GetResLibs()
{
	MSXML::IXMLDOMDocument* document = NULL;
	MSXML::IXMLDOMParseError* parseError = NULL;
	MSXML::IXMLDOMElement* element = NULL;	
  CString xmlStr;
  xmlStr="";
  xmlStr+="<tree>";  
  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+="</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 sPath;
       GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
       sPath.ReleaseBuffer ();
       int nPos;
       nPos=sPath.ReverseFind ('\\');
       sPath=sPath.Left (nPos);
       CString tmpStr=sPath+"\\test\\test.doc";
	   return tmpStr;
}
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)
{
	MSXML::IXMLDOMDocument* document = NULL;
	MSXML::IXMLDOMParseError* parseError = NULL;
	MSXML::IXMLDOMElement* element = NULL;	
	CString xmlStr;
	xmlStr="";
	xmlStr+="<list>";  
	int i;
	for(i=1;i<=100;i++){
		CString tmpStr;
		tmpStr.Format("<item text=\"资源文件%i(%s)\" pid=\"%s\" id=\"%s:%i\" size=\"%i\" modifyTime=\"2003-6-7\" type=\"doc文件\" icon=\"xls\"/>",i,id,id,id,i,i);
		xmlStr+=tmpStr;
	}

	xmlStr+="</list>";
	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);
		if (FAILED(hr) || element == NULL) {
			AfxMessageBox(_T("Error Loading XML"));
			return FALSE;
		}
			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;
}

⌨️ 快捷键说明

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