RTXMLFile.cpp
上传用户:qhonly
上传日期:2013-06-10
资源大小:487k
文件大小:5k
源码类别:

界面编程

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include "RTXmlFile.h"
  3. #include "RTFolder.h"
  4. CRTXmlFile::CRTXmlFile(void)
  5. {
  6. m_NewPosition = -1;
  7. }
  8. CRTXmlFile::~CRTXmlFile(void)
  9. {
  10. Clear();
  11. }
  12. CRTXmlItem* CRTXmlFile::GetItem(LPCTSTR lpItemName)
  13. {
  14. int nCount = (int)m_ItemList.GetCount();
  15. for(int i = 0; i < nCount; i++)
  16. {
  17. CRTXmlItem *pItem = (CRTXmlItem *) m_ItemList.GetAt(i);
  18. if(pItem->ItemName == lpItemName)
  19. return pItem;
  20. }
  21. return NULL;
  22. }
  23. BOOL CRTXmlFile::Open(LPCTSTR lpFileName)
  24. {
  25. if(lpFileName == NULL)return FALSE;
  26. m_FileName = lpFileName;
  27. FILE *file = fopen((LPCTSTR)m_FileName,"r");
  28. if(file == NULL)return FALSE;
  29. Clear();
  30. CString fileText = "";
  31. char buf[1025];
  32. while(!feof(file))
  33. {
  34. int nLen = (int)fread(buf,1,1024,file);
  35. if(nLen > 0)
  36. {
  37. buf[nLen] = NULL;
  38. fileText += buf;
  39. }
  40. }
  41. fclose(file);
  42. char *ptr = (char *)((LPCTSTR)fileText);
  43. while(*ptr != '')
  44. {
  45. if(!ParseItem(ptr,&ptr))break;
  46. }
  47. return TRUE;
  48. }
  49. void CRTXmlFile::AddItem(CRTXmlItem* pItem)
  50. {
  51. m_ItemList.Add(pItem);
  52. }
  53. BOOL CRTXmlFile::Save(LPCTSTR lpSaveFile)
  54. {
  55. if(lpSaveFile != NULL)m_FileName = lpSaveFile;
  56. CString tmpFile = m_FileName + ".tmp";
  57. FILE *back = fopen((LPCTSTR)m_FileName,"r");
  58. //创建备份文件
  59. if(back != NULL)
  60. {
  61. FILE *tmp = fopen((LPCTSTR)tmpFile,"w");
  62. if(tmp == NULL)
  63. {
  64. fclose(back);
  65. return FALSE;
  66. }
  67. char buf[1024];
  68. int nread = 0;
  69. while(!feof(back))
  70. {
  71. nread = (int)fread(buf,1,1024,back);
  72. if(nread > 0)
  73. {
  74. fwrite(buf,1,nread,tmp);
  75. }
  76. }
  77. fclose(back);
  78. fclose(tmp);
  79. }
  80. FILE *file = fopen((LPCTSTR)m_FileName,"w");
  81. if(file == NULL)
  82. {
  83. char path[MAX_PATH];
  84. CRTFolder::GetFilePath(m_FileName,path);
  85. if(!CRTFolder::MakeDirs(path))
  86. return FALSE;
  87. file = fopen(m_FileName,"w");
  88. if(file == NULL)return FALSE;
  89. }
  90. CRTXmlItem *pItem = GetFirstItem();
  91. while(pItem != NULL)
  92. {
  93. RTXmlItemData* pData = pItem->ItemData;
  94. char wrbuf[1024];
  95. ZeroMemory(wrbuf,1024);
  96. strcpy(wrbuf,"<");
  97. strcat(wrbuf,pItem->ItemName);
  98. fwrite(wrbuf,1,strlen(wrbuf),file);
  99. while(pData != NULL)
  100. {
  101. ZeroMemory(wrbuf,1024);
  102. strcpy(wrbuf," ");
  103. strcat(wrbuf,pData->KeyName);
  104. strcat(wrbuf,"=");
  105. strcat(wrbuf,pData->KeyValue);
  106. fwrite(wrbuf,1,strlen(wrbuf),file);
  107. pData = pData->Next;
  108. }
  109. ZeroMemory(wrbuf,1024);
  110. strcpy(wrbuf,">rn");
  111. fwrite(wrbuf,1,strlen(wrbuf),file);
  112. pItem = GetNextItem();
  113. }
  114. fclose(file);
  115. DeleteFile(tmpFile);
  116. return TRUE;
  117. }
  118. BOOL CRTXmlFile::ParseItem(char * ptr,char** out)
  119. {
  120. char * start = ptr;
  121. while(*start != '' && *start != '<')
  122. start++;
  123. if(*start == '')
  124. {
  125. *out = start;
  126. return FALSE;
  127. }
  128. start ++;
  129. if(!SkipBlank(start,&start))
  130. {
  131. *out = start;
  132. return TRUE;
  133. }
  134. char *key = start;
  135. if(!FindBlank(start,&start))
  136. {
  137. *out = start;
  138. return TRUE;
  139. }
  140. char temp = *start;
  141. *start = '';
  142. CRTXmlItem * pItem = new CRTXmlItem(key);
  143. m_ItemList.Add(pItem);
  144. *start = temp;
  145. while(SkipBlank(start,&start))
  146. {
  147. if(!ParseKey(start,pItem,&start))
  148. break;
  149. if(*start == '>')break;
  150. }
  151. *out = start;
  152. return TRUE;
  153. }
  154. BOOL CRTXmlFile::ParseKey(char* ptr,CRTXmlItem *pItem,char** out)
  155. {
  156. char *start = ptr;
  157. char *begin = ptr;
  158. char *end = ptr;
  159. if(!FindBlank(start,&start))
  160. {
  161. return FALSE;
  162. }
  163. *out = start;
  164. char temp = *start;
  165. *start = NULL;
  166.     while(*end != '=' && *end != '')
  167. {
  168. end ++;
  169. }
  170. if(end == '')
  171. {
  172.         *start = temp;
  173. return TRUE;
  174. }
  175. *end = NULL;
  176. end ++;
  177. pItem->SetKeyValue(begin,end);
  178. end--;
  179. *end = '=';
  180. *start = temp;
  181. return TRUE;
  182. }
  183. BOOL CRTXmlFile::SkipBlank(char * ptr,char ** out)
  184. {
  185. char *start = ptr;
  186. while(*start > 0 && *start < 33)
  187. start ++;
  188. *out = start;
  189. if(*start == '<' || *start == '>' || *start == '')
  190. return FALSE;
  191. else
  192. return TRUE;
  193. }
  194. BOOL CRTXmlFile::FindBlank(char* input, char ** out)
  195. {
  196. char *start = input;
  197. while((*start <= 0 || *start >= 33) && *start != '>' && *start != '<')
  198. start ++;
  199. *out = start;
  200. if(*start == '<' || *start == '')
  201. return FALSE;
  202. else
  203. return TRUE;
  204. return 0;
  205. }
  206. void CRTXmlFile::Clear()
  207. {
  208. int nCount = (int)m_ItemList.GetCount();
  209. for(int i = 0; i < nCount; i++)
  210. {
  211. CRTXmlItem *pItem = (CRTXmlItem *) m_ItemList.GetAt(i);
  212. delete pItem;
  213. }
  214. m_ItemList.RemoveAll();
  215. }
  216. CRTXmlItem* CRTXmlFile::GetFirstItem()
  217. {
  218. m_NewPosition = 0;
  219. if(m_ItemList.GetCount() <= 0)
  220. return NULL;
  221. return (CRTXmlItem*)m_ItemList.GetAt(m_NewPosition);
  222. }
  223. CRTXmlItem* CRTXmlFile::GetNextItem()
  224. {
  225. m_NewPosition++;
  226. if(m_NewPosition > m_ItemList.GetCount() - 1)
  227. {
  228. return NULL;
  229. }
  230. return (CRTXmlItem *)m_ItemList.GetAt(m_NewPosition);
  231. }