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

📄 stgxml.h

📁 These listed libraries are written in WTL. But it s really hard to mix both MFC & WTL together. Obvi
💻 H
字号:
// Copyright (c) 2006
// Sergey Klimov (kidd@ukr.net)

#ifndef __WTL_DW__STGXML_H__
#define __WTL_DW__STGXML_H__

#include <stg.h>
#include <cassert>

namespace sstate{


class CStgXML
	: public IStorge
{
public:
	CStgXML(void)
	{
	}

	virtual ~CStgXML(void)
	{
	}

	IXMLDOMElement* Root(void)
	{
		return m_key;
	}

	bool operator !(void) const
	{
		return !m_key;
	}

	long Create(LPCTSTR name=_T("config"),LPCOLESTR msxmlDocClassName=OLESTR("Msxml2.FreeThreadedDOMDocument"))
	{
		assert(!m_key);
		CComPtr<IXMLDOMDocument> doc;
		HRESULT res=doc.CoCreateInstance(msxmlDocClassName);
		if(SUCCEEDED(res))
		{
			res=doc->createElement(CComBSTR(name),&m_key);
			if(!m_key)
				res=E_UNEXPECTED;
		}
		return res;
	}
	
	virtual long Create(IStorge& parent,LPCTSTR name,Modes mode)
	{
		assert(!(!static_cast<CStgXML&>(parent)));
		assert(!m_key);
		HRESULT res=Open(parent,name,mode);
		if(res!=S_OK)
		{
			CComPtr<IXMLDOMDocument> doc;
			res=static_cast<CStgXML&>(parent).m_key->get_ownerDocument(&doc);
			if(SUCCEEDED(res))
			{
				if(!doc)
					res=E_UNEXPECTED;
				else
				{
					res=doc->createElement(CComBSTR(name),&m_key);
					if(SUCCEEDED(res))
					{
						if(!m_key)
							res=E_UNEXPECTED;
						else
						{
							CComPtr<IXMLDOMNode> nu;
							res=static_cast<CStgXML&>(parent).m_key->appendChild(m_key,&nu);
						}
					}
				}
			}
		}
		return res;
	}

	virtual long Open(IStorge& parent,LPCTSTR name,Modes /*mode*/)
	{
		assert(!(!static_cast<CStgXML&>(parent)));
		assert(!m_key);
		return Open(static_cast<IXMLDOMNode*>(static_cast<CStgXML&>(parent).m_key),name);
	}


	virtual long SetString(LPCTSTR name,LPCTSTR data)
	{
		assert(!(!m_key));
		return m_key->setAttribute(CComBSTR(name),CComVariant(data));

	}

	virtual long GetString(LPCTSTR name,LPTSTR data,size_t& size)
	{
		assert(!(!m_key));
		CComVariant val;
		long res=m_key->getAttribute(CComBSTR(name),&val);
		if(SUCCEEDED(res))
		{
			if(val.vt==VT_BSTR)
			{
				size_t len=size_t(::SysStringLen(val.bstrVal));
#ifdef  UNICODE 
				if(size>=(len+1))
				{
					std::char_traits<OLECHAR>::copy(data,val.bstrVal,len);
					data[len]=_T('\0');
				}
#else
				int slen=len;
				len=::WideCharToMultiByte(CP_OEMCP,0,val.bstrVal,slen,0,0,NULL,NULL)/sizeof(TCHAR);
				if(size>=len)
				{
					len=::WideCharToMultiByte(CP_OEMCP,0,val.bstrVal,slen,data,size*sizeof(TCHAR),NULL,NULL)/sizeof(TCHAR);
					if(len==0)
						res=::GetLastError();
					--len;
				}
#endif	//UNICODE
				else
					res=ERROR_MORE_DATA;
				size=len;
			}
			else
				res=(val.vt==VT_NULL)?ERROR_FILE_NOT_FOUND:ERROR_UNSUPPORTED_TYPE;
		}
		return res;
	}

	long Load(LPCTSTR filename,LPCTSTR name=_T("config"),LPCOLESTR msxmlDocClassName=OLESTR("Msxml2.FreeThreadedDOMDocument"))
	{
		assert(!m_key);
		CComPtr<IXMLDOMDocument> doc;
		long res=doc.CoCreateInstance(msxmlDocClassName);
		if(SUCCEEDED(res))
		{
			if(!doc)
				res=E_UNEXPECTED;
			else
			{
				res=doc->put_async(VARIANT_FALSE);
				if(SUCCEEDED(res))
				{
					VARIANT_BOOL loaded;
					res=doc->load(CComVariant(filename),&loaded);
					if(SUCCEEDED(res))
					{
						if(loaded==VARIANT_TRUE)
							res=Open(static_cast<IXMLDOMNode*>(doc),name);
						else
							res=E_FAIL;
					}

				}
			}
		}
		return res;
	}

	long Save(LPCTSTR filename)
	{
		assert(!(!m_key));
		CComPtr<IXMLDOMDocument> doc;
		long res=m_key->get_ownerDocument(&doc);
		if(SUCCEEDED(res))
		{
			if(!doc)
				res=E_UNEXPECTED;
			else
			{
				CComPtr<IXMLDOMNode> parent;
				res=m_key->get_parentNode(&parent);
				if(SUCCEEDED(res)
					&& !parent)
				{
					CComPtr<IXMLDOMProcessingInstruction> pi;
					if(SUCCEEDED(doc->createProcessingInstruction(CComBSTR(OLESTR("xml")),CComBSTR(OLESTR("version=\"1.0\"")),&pi)))
					{
						CComPtr<IXMLDOMNode> nu;
						doc->appendChild(pi,&nu);
					}

					CComPtr<IXMLDOMNode> nu;
					res=doc->appendChild(m_key,&nu);
					if(FAILED(res))
						return res;
				}
				res=doc->save(CComVariant(filename));
			}
		}
		return res;
	}
protected:
	long Open(IXMLDOMNode* parent,LPCTSTR name)
	{
		assert(parent!=0);
		assert(!m_key);
		CComPtr<IXMLDOMNode> node;
		HRESULT res=parent->selectSingleNode(CComBSTR(name),&node);
		if(SUCCEEDED(res))
		{
			if(!node)
				res=ERROR_FILE_NOT_FOUND;
			else
			{
				res=node.QueryInterface(&m_key);
				if(SUCCEEDED(res)
					&& (!m_key))
					res=E_UNEXPECTED;
			}
		}
		return res;
	}
private:
	CStgXML(const CStgXML&);
	CStgXML& operator=(const CStgXML&);
private:
	CComPtr<IXMLDOMElement> m_key;
};

}//namespace sstate

#endif // __WTL_DW__STGXML_H__

⌨️ 快捷键说明

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