void Process(IStorage *pStorage, const char *pMapName, const char *pConfigName) { CDataFileReader Map; if(!Map.Open(pStorage, pMapName, IStorage::TYPE_ALL)) { dbg_msg("config_retrieve", "error opening map '%s'", pMapName); return; } bool ConfigFound = false; int Start, Num; Map.GetType(MAPITEMTYPE_INFO, &Start, &Num); for(int i = Start; i < Start + Num; i++) { int ItemID; CMapItemInfoSettings *pItem = (CMapItemInfoSettings *)Map.GetItem(i, 0, &ItemID); int ItemSize = Map.GetItemSize(i) - 8; if(!pItem || ItemID != 0) continue; if(ItemSize < (int)sizeof(CMapItemInfoSettings)) break; if(!(pItem->m_Settings > -1)) break; ConfigFound = true; IOHANDLE Config = pStorage->OpenFile(pConfigName, IOFLAG_WRITE, IStorage::TYPE_ALL); if(!Config) { dbg_msg("config_retrieve", "error opening config for writing '%s'", pConfigName); return; } int Size = Map.GetUncompressedDataSize(pItem->m_Settings); char *pSettings = (char *)Map.GetData(pItem->m_Settings); char *pNext = pSettings; while(pNext < pSettings + Size) { int StrSize = str_length(pNext) + 1; io_write(Config, pNext, StrSize - 1); io_write_newline(Config); pNext += StrSize; } Map.UnloadData(pItem->m_Settings); io_close(Config); break; } Map.Close(); if(!ConfigFound) { fs_remove(pConfigName); } }
void Process(IStorageTW *pStorage, const char *pMapName, const char *pConfigName) { IOHANDLE File = pStorage->OpenFile(pConfigName, IOFLAG_READ, IStorageTW::TYPE_ALL); array<char *> aLines; char *pSettings = NULL; if(!File) { dbg_msg("config_store", "config '%s' not found", pConfigName); return; } CLineReader LineReader; LineReader.Init(File); char *pLine; int TotalLength = 0; while((pLine = LineReader.Get())) { int Length = str_length(pLine) + 1; char *pCopy = (char *)mem_alloc(Length, 1); mem_copy(pCopy, pLine, Length); aLines.add(pCopy); TotalLength += Length; } pSettings = (char *)mem_alloc(TotalLength, 1); int Offset = 0; for(int i = 0; i < aLines.size(); i++) { int Length = str_length(aLines[i]) + 1; mem_copy(pSettings + Offset, aLines[i], Length); Offset += Length; mem_free(aLines[i]); } CDataFileReader Reader; Reader.Open(pStorage, pMapName, IStorageTW::TYPE_ALL); CDataFileWriter Writer; Writer.Init(); int SettingsIndex = Reader.NumData(); bool FoundInfo = false; for(int i = 0; i < Reader.NumItems(); i++) { int TypeID; int ItemID; int *pData = (int *)Reader.GetItem(i, &TypeID, &ItemID); // GetItemSize returns item size including header, remove that. int Size = Reader.GetItemSize(i) - sizeof(int) * 2; CMapItemInfoSettings MapInfo; if(TypeID == MAPITEMTYPE_INFO && ItemID == 0) { FoundInfo = true; CMapItemInfoSettings *pInfo = (CMapItemInfoSettings *)pData; if(Size >= (int)sizeof(CMapItemInfoSettings)) { MapInfo = *pInfo; pData = (int *)&MapInfo; Size = sizeof(MapInfo); if(pInfo->m_Settings > -1) { SettingsIndex = pInfo->m_Settings; char *pMapSettings = (char *)Reader.GetData(SettingsIndex); int DataSize = Reader.GetUncompressedDataSize(SettingsIndex); if(DataSize == TotalLength && mem_comp(pSettings, pMapSettings, DataSize) == 0) { dbg_msg("config_store", "configs coincide, not updating map"); return; } Reader.UnloadData(pInfo->m_Settings); } else { MapInfo = *pInfo; MapInfo.m_Settings = SettingsIndex; pData = (int *)&MapInfo; Size = sizeof(MapInfo); } } else { *(CMapItemInfo *)&MapInfo = *(CMapItemInfo *)pInfo; MapInfo.m_Settings = SettingsIndex; pData = (int *)&MapInfo; Size = sizeof(MapInfo); } } Writer.AddItem(TypeID, ItemID, Size, pData); } if(!FoundInfo) { CMapItemInfoSettings Info; Info.m_Version = 1; Info.m_Author = -1; Info.m_MapVersion = -1; Info.m_Credits = -1; Info.m_License = -1; Info.m_Settings = SettingsIndex; Writer.AddItem(MAPITEMTYPE_INFO, 0, sizeof(Info), &Info); } for(int i = 0; i < Reader.NumData() || i == SettingsIndex; i++) { if(i == SettingsIndex) { Writer.AddData(TotalLength, pSettings); continue; } unsigned char *pData = (unsigned char *)Reader.GetData(i); int Size = Reader.GetUncompressedDataSize(i); Writer.AddData(Size, pData); Reader.UnloadData(i); } Reader.Close(); if(!Writer.OpenFile(pStorage, pMapName)) { dbg_msg("config_store", "couldn't open map file '%s' for writing", pMapName); return; } Writer.Finish(); dbg_msg("config_store", "imported settings"); }
virtual int GetUncompressedDataSize(int Index) { return m_DataFile.GetUncompressedDataSize(Index); }