DataCache.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #include "DataCache.h"
  2. #include "..\..\common_h\particles.h"
  3. #include "..\icommon\memfile.h"
  4. #ifndef _XBOX
  5. #include "..\..\common_h\tinyxml\tinyxml.h"
  6. #endif
  7. bool ReadingAlreadyComplete;
  8. dword dwGlobalLoadingID = 0;
  9. //Конструктор/деструктор
  10. DataCacheGlobal::DataCacheGlobal () : Cache(_FL_)
  11. {
  12. pFS = (IFileService*)api->GetService("FileService");
  13. Assert (pFS != NULL);
  14. }
  15. DataCacheGlobal::~DataCacheGlobal ()
  16. {
  17. ResetCache ();
  18. }
  19. #ifndef _XBOX
  20. //Положить в кэш данные для системы
  21. void DataCacheGlobal::CacheSystemXML (const char* FileName)
  22. {
  23. //это для индентификации....
  24. string NameWithExt = FileName;
  25. NameWithExt.DeleteLastSymbol('l');
  26. NameWithExt.DeleteLastSymbol('m');
  27. NameWithExt.DeleteLastSymbol('x');
  28. NameWithExt.DeleteLastSymbol('.');
  29. NameWithExt.AddExtention(".xps");
  30. NameWithExt.Lower();
  31. string LongFileName = "resource\\particles\\";
  32. LongFileName+=FileName;
  33. LongFileName.AddExtention(".xml");
  34. CreateDataSourceXML(LongFileName.GetBuffer(), NameWithExt.c_str());
  35. }
  36. #endif
  37. //Положить в кэш данные для системы
  38. void DataCacheGlobal::CacheSystem (const char* FileName)
  39. {
  40. string NameWithExt = FileName;
  41. NameWithExt.AddExtention(".xps");
  42. NameWithExt.Lower();
  43. string LongFileName = "resource\\particles\\";
  44. LongFileName+=FileName;
  45. LongFileName.AddExtention(".xps");
  46. //Ставим файл в очередь на загрузку...
  47. IDataFile * pFile = pFS->OpenDataFile(LongFileName.GetBuffer(), file_open_any, _FL_);
  48. if (!pFile)
  49. {
  50. api->Trace("Particles: '%s' File not found !!!", LongFileName.GetBuffer());
  51. return;
  52. }
  53. dword filesize = pFile->Size();
  54. byte* buffer = NEW byte[filesize];
  55. pFile->Read(buffer, filesize);
  56. string fName;
  57. fName.GetFileName(LongFileName);
  58. //Создаем данные из файла...
  59. CreateDataSource (buffer, filesize, fName.GetBuffer());
  60. pFile->Release();
  61. //delete [] buffer;
  62. }
  63. //Сбросить кэш
  64. void DataCacheGlobal::ResetCache ()
  65. {
  66. for (int n = 0; n < Cache; n++)
  67. {
  68. if (Cache[n].pBuffer)
  69. {
  70. delete [] Cache[n].pBuffer;
  71. }
  72. if (Cache[n].pData) Cache[n].pData->Release();
  73. }
  74. Cache.DelAll();
  75. }
  76. //Проверить указатель на валидность
  77. bool DataCacheGlobal::ValidatePointer (DataSource* pData)
  78. {
  79. for (int n = 0; n < Cache; n++)
  80. if (Cache[n].pData = pData) return true;
  81. return false;
  82. }
  83. #ifndef _XBOX
  84. void DataCacheGlobal::CreateDataSourceXML (const char* SourceFileName, const char* id_name)
  85. {
  86. //надо XML оставлять в памяти
  87. Assert(false);
  88. LoadedDataSource NewDataSource;
  89. NewDataSource.FileName = id_name;
  90. NewDataSource.dwStringHash = string::HashNoCase(NewDataSource.FileName.c_str());
  91. NewDataSource.pData = NEW DataSource();
  92. Cache.Add(NewDataSource);
  93. //Тут открыть файл через TinyXML
  94. TiXmlDocument particleXML( SourceFileName );
  95. bool loadOkay = particleXML.LoadFile();
  96. if (!loadOkay)
  97. {
  98. throw ("this is temp gag, sorry !");
  99. }
  100. NewDataSource.pData->LoadXML(&particleXML);
  101. }
  102. #endif
  103. void DataCacheGlobal::CreateDataSource (void* pBuffer, DWORD BufferSize, const char* SourceFileName)
  104. {
  105. LoadedDataSource NewDataSource;
  106. NewDataSource.FileName = SourceFileName;
  107. NewDataSource.pData = NEW DataSource();
  108. NewDataSource.pBuffer = pBuffer;
  109. NewDataSource.dwStringHash = string::HashNoCase(NewDataSource.FileName.c_str());
  110. Cache.Add(NewDataSource);
  111. //api->Trace("\nCreate data source for file %s", SourceFileName);
  112. MemFile* ReadFile = NEW MemFile;
  113. ReadFile->OpenRead(pBuffer, BufferSize);
  114. NewDataSource.pData->Load(ReadFile);
  115. ReadFile->Close();
  116. delete ReadFile;
  117. }
  118. DWORD DataCacheGlobal::GetCachedCount ()
  119. {
  120. return Cache.Size();
  121. }
  122. const char* DataCacheGlobal::GetCachedNameByIndex (DWORD Index)
  123. {
  124. return Cache[Index].FileName;
  125. }
  126. void DataCacheGlobal::NewForceFieldRegistred()
  127. {
  128. //зарегистрировали новый force field...
  129. //надо бы обновить кэши
  130. for (dword j = 0; j < Cache.Size(); j++)
  131. {
  132. Cache[j].pData->NewForceFieldRegistred();
  133. }
  134. }