UiTaskDataFile.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:7k
源码类别:

模拟服务器

开发平台:

C/C++

  1. /* 
  2.  * File:     UiTaskDataFile.h
  3.  * Desc:     任务记事文件操作
  4.  * Author:   flying
  5.  * Creation: 2003/7/19
  6.  */
  7. //-----------------------------------------------------------------------------
  8. // system header file section. standard C-Runtime library.
  9. #include "KWin32.h"
  10. #include "KFile.h"
  11. #include "KFilePath.h"
  12. #include "UiTaskDataFile.h"
  13. #include "../UiBase.h"
  14. #define FILE_NAME "MissionMemory.dat"
  15. KTaskDataFile::KPersonalRecord* KTaskDataFile::ms_pPersonalRecord = NULL;
  16. KTaskDataFile::KTaskSystemRecordNode* KTaskDataFile::ms_pSystemRecordList = NULL;
  17. int KTaskDataFile::ms_nSystemRecordCount = 0;
  18. void KTaskDataFile::LoadData()
  19. {
  20. ClearAll();
  21. KFile File;
  22. char szFileName[128];
  23. GetFileName(szFileName, sizeof(szFileName));
  24. bool bOk = false;
  25. while(File.Open(szFileName))
  26. {
  27. //==读文件头==
  28. TASK_FILE_HEADER Header;
  29. if (File.Read(&Header, sizeof(Header)) != sizeof(Header))
  30. break;
  31. if (*(int*)(&(Header.cFlag[0])) != TASK_FILE_FLAG)
  32. break;
  33. //==读个人纪录==
  34. if (Header.nPersonalRecordBytes)
  35. {
  36. ms_pPersonalRecord = (KPersonalRecord*)malloc(Header.nPersonalRecordBytes);
  37. if (ms_pPersonalRecord)
  38. {
  39. if (!File.Read(ms_pPersonalRecord, Header.nPersonalRecordBytes))
  40. break;
  41. }
  42. else
  43. {
  44. break;
  45. }
  46. }
  47. //==读系统纪录==
  48. TASK_SYSTEM_RECORD record;
  49. int nPreSize = sizeof(TASK_SYSTEM_RECORD) - sizeof(record.cBuffer);
  50. for (int i = 0; i < Header.nSystemRecordCount; i++)
  51. {
  52. if (File.Read(&record, nPreSize) != nPreSize)
  53. break;
  54. KTaskSystemRecordNode* pNode = (KTaskSystemRecordNode*)malloc(
  55. sizeof(KTaskSystemRecordNode) + record.nContentLen);
  56. if (pNode)
  57. {
  58. if (File.Read(pNode->Record.cBuffer, record.nContentLen) != record.nContentLen)
  59. {
  60. free (pNode);
  61. break;
  62. }
  63. pNode->pNext = NULL;
  64. pNode->Record.nContentLen = record.nContentLen;
  65. pNode->Record.tTime = record.tTime;
  66. pNode->Record.uReserved = record.uReserved;
  67. AppendSystemRecord(pNode);
  68. }
  69. }
  70. bOk = true;
  71. break;
  72. };
  73. File.Close();
  74. if (bOk == false)
  75. ClearAll();
  76. }
  77. bool KTaskDataFile::SaveData()
  78. {
  79. KFile File;
  80. char szFileName[128];
  81. GetFileName(szFileName, sizeof(szFileName));
  82. bool bOk = false;
  83. while (ms_pPersonalRecord || ms_nSystemRecordCount > 0)
  84. {
  85. if (!File.Create(szFileName))
  86. break;
  87. //==写文件头==
  88. TASK_FILE_HEADER Header = { 0 };
  89. *(int*)(&(Header.cFlag[0])) = TASK_FILE_FLAG;
  90. if (ms_pPersonalRecord && ms_pPersonalRecord->nLen > 0)
  91. {
  92. Header.nPersonalRecordBytes = sizeof(KPersonalRecord) +
  93. ms_pPersonalRecord->nLen - sizeof(ms_pPersonalRecord->cBuffer);
  94. }
  95. Header.nSystemRecordCount = ms_nSystemRecordCount;
  96. if (File.Write(&Header, sizeof(Header)) != sizeof(Header))
  97. break;
  98. //==写个人纪录==
  99. if (ms_pPersonalRecord)
  100. {
  101. if (File.Write(ms_pPersonalRecord, Header.nPersonalRecordBytes) != Header.nPersonalRecordBytes)
  102. break;
  103. }
  104. //==写系统纪录==
  105. KTaskSystemRecordNode* pCurrent = ms_pSystemRecordList;
  106. int i;
  107. for (i = 0; i < ms_nSystemRecordCount; i++)
  108. {
  109. int nSize = sizeof(TASK_SYSTEM_RECORD) + pCurrent->Record.nContentLen -
  110. sizeof(pCurrent->Record.cBuffer);
  111. if (File.Write(&pCurrent->Record, nSize) != nSize)
  112. break;
  113. pCurrent = pCurrent->pNext;
  114. }
  115. if (i >= ms_nSystemRecordCount)
  116. {
  117. bOk = true;
  118. }
  119. break;
  120. };
  121. File.Close();
  122. if (bOk == false)
  123. {
  124. char szFullName[MAX_PATH];
  125. g_GetFullPath(szFullName, szFileName);
  126. DeleteFile(szFullName);
  127. }
  128. return bOk;
  129. }
  130. void KTaskDataFile::GetFileName(char* pszFileName, int nLen)
  131. {
  132. if (pszFileName)
  133. {
  134. g_UiBase.GetUserPrivateDataFolder(pszFileName, nLen);
  135. strcat(pszFileName, FILE_NAME);
  136. }
  137. }
  138.  
  139. void KTaskDataFile::ClearAll()
  140. {
  141. if (ms_pPersonalRecord)
  142. {
  143. free (ms_pPersonalRecord);
  144. ms_pPersonalRecord = NULL;
  145. }
  146. if (ms_pSystemRecordList)
  147. {
  148. free (ms_pSystemRecordList);
  149. ms_pSystemRecordList = NULL;
  150. }
  151. ms_nSystemRecordCount = 0;
  152. }
  153. int KTaskDataFile::GetPersonalRecord(char* pszBuffer, int nBufferSize)
  154. {
  155. int nRet = 0;
  156. if (ms_pPersonalRecord && pszBuffer)
  157. {
  158. if (nBufferSize > ms_pPersonalRecord->nLen)
  159. {
  160. nRet = ms_pPersonalRecord->nLen;
  161. memcpy(pszBuffer, ms_pPersonalRecord->cBuffer, nRet);
  162. pszBuffer[nRet] = 0;
  163. }
  164. }
  165. return nRet;
  166. }
  167. bool KTaskDataFile::SetPersonalRecord(const char* pstrRecord, int nLen)
  168. {
  169. bool bOk = false;
  170. if (ms_pPersonalRecord)
  171. {
  172. free(ms_pPersonalRecord);
  173. ms_pPersonalRecord = NULL;
  174. }
  175. if (pstrRecord && nLen > 0)
  176. {
  177. ms_pPersonalRecord = (KPersonalRecord*)malloc(sizeof(KPersonalRecord)
  178. + nLen - sizeof(((KPersonalRecord*)0)->cBuffer));
  179. if (ms_pPersonalRecord)
  180. {
  181. ms_pPersonalRecord->nLen = nLen;
  182. memcpy(ms_pPersonalRecord->cBuffer, pstrRecord, nLen);
  183. bOk = true;
  184. }
  185. }
  186. return bOk;
  187. }
  188. bool KTaskDataFile::RemoveSystemRecord(int nIndex)
  189. {
  190. bool bOk = false;
  191. if (nIndex >= 0 && nIndex < ms_nSystemRecordCount)
  192. {
  193. KTaskSystemRecordNode* pToRemove = NULL;
  194. if (nIndex == 0)
  195. {
  196. pToRemove = ms_pSystemRecordList;
  197. ms_pSystemRecordList = pToRemove->pNext;
  198. }
  199. else
  200. {
  201. KTaskSystemRecordNode* pPre = ms_pSystemRecordList;
  202. while(nIndex > 1)
  203. {
  204. pPre = pPre->pNext;
  205. nIndex --;
  206. };
  207. pToRemove = pPre->pNext;
  208. pPre->pNext = pToRemove->pNext;
  209. }
  210. free (pToRemove);
  211. ms_nSystemRecordCount --;
  212. bOk = true;
  213. }
  214. return bOk;
  215. }
  216. int KTaskDataFile::GetSystemRecordCount()
  217. {
  218. return ms_nSystemRecordCount;
  219. }
  220. const TASK_SYSTEM_RECORD* KTaskDataFile::GetSystemRecord(int nIndex)
  221. {
  222. TASK_SYSTEM_RECORD* pRet = NULL;
  223. if (nIndex >= 0 && nIndex < ms_nSystemRecordCount)
  224. {
  225. KTaskSystemRecordNode* pNode = ms_pSystemRecordList;
  226. while(nIndex > 0)
  227. {
  228. pNode = pNode->pNext;
  229. nIndex --;
  230. }
  231. pRet = &pNode->Record;
  232. }
  233. return pRet;
  234. }
  235. bool KTaskDataFile::InsertSystemRecord(TASK_SYSTEM_RECORD* pRecord)
  236. {
  237. bool bOk = false;
  238. if (pRecord)
  239. {
  240. if (pRecord->nContentLen > 0 && pRecord->pBuffer)
  241. {
  242. KTaskSystemRecordNode* pNode = (KTaskSystemRecordNode*)malloc(
  243. sizeof(KTaskSystemRecordNode) + pRecord->nContentLen);
  244. if (pNode)
  245. {
  246. pNode->pNext = NULL;
  247. memcpy(pNode->Record.cBuffer, pRecord->pBuffer, pRecord->nContentLen);
  248. pNode->Record.nContentLen = pRecord->nContentLen;
  249. pNode->Record.tTime = pRecord->tTime;
  250. pNode->Record.uReserved = pRecord->uReserved;
  251. InsertSystemRecord(pNode);
  252. bOk = true;
  253. }
  254. }
  255. }
  256. return bOk;
  257. }
  258. void KTaskDataFile::AppendSystemRecord(KTaskSystemRecordNode* pNode)
  259. {
  260. if (pNode)
  261. {
  262. if (ms_pSystemRecordList == NULL)
  263. {
  264. ms_pSystemRecordList = pNode;
  265. }
  266. else
  267. {
  268. KTaskSystemRecordNode* pPre = ms_pSystemRecordList;
  269. while(pPre->pNext)
  270. pPre = pPre->pNext;
  271. pPre->pNext = pNode;
  272. }
  273. ms_nSystemRecordCount ++;
  274. }
  275. }
  276. void KTaskDataFile::InsertSystemRecord(KTaskSystemRecordNode* pNode)
  277. {
  278. if (pNode)
  279. {
  280. pNode->pNext = ms_pSystemRecordList;
  281. ms_pSystemRecordList = pNode;
  282. ms_nSystemRecordCount ++;
  283. }
  284. }