📄 resdataprovider.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 + -