int main(int argc, const char **argv) { IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_BASIC, argc, argv); int Index, ID = 0, Type = 0, Size; void *pPtr; char aFileName[1024]; CDataFileReader DataFile; CDataFileWriter df; if(!pStorage || argc != 3) return -1; str_format(aFileName, sizeof(aFileName), "%s", argv[2]); if(!DataFile.Open(pStorage, argv[1], IStorage::TYPE_ALL)) return -1; if(!df.Open(pStorage, aFileName)) return -1; // add all items for(Index = 0; Index < DataFile.NumItems(); Index++) { pPtr = DataFile.GetItem(Index, &Type, &ID); Size = DataFile.GetItemSize(Index); df.AddItem(Type, ID, Size, pPtr); } // add all data for(Index = 0; Index < DataFile.NumData(); Index++) { pPtr = DataFile.GetData(Index); Size = DataFile.GetDataSize(Index); df.AddData(Size, pPtr); } DataFile.Close(); df.Finish(); return 0; }
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"); }