Subversion Repositories spk

Rev

Rev 121 | Rev 125 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 121 Rev 124
Line 181... Line 181...
181
			break;
181
			break;
182
 
182
 
183
		CCatFile cat;
183
		CCatFile cat;
184
		if ( cat.Open(file + ".cat", m_sAddon, CATREAD_JUSTCONTENTS, false) == CATERR_NONE )
184
		if ( cat.Open(file + ".cat", m_sAddon, CATREAD_JUSTCONTENTS, false) == CATERR_NONE )
185
		{
185
		{
186
			for ( CListNode<SInCatFile> *c = cat.GetFiles()->Front(); c; c = c->next() ) {
186
			for(auto itr = cat.GetFiles()->cbegin(); itr != cat.GetFiles()->cend(); itr++)
-
 
187
			{
187
				this->_addModFile(CFileIO(c->Data()->sFile).fullFilename(), file + ".cat", m_pMap);
188
				this->_addModFile(CFileIO((*itr)->sFile).fullFilename(), file + ".cat", m_pMap);
188
				m_bLoaded = true;
189
				m_bLoaded = true;
189
			}
190
			}
190
		}
191
		}
191
		++number;
192
		++number;
192
	}
193
	}
Line 203... Line 204...
203
 
204
 
204
 
205
 
205
void CVirtualFileSystem::_addDir(const Utils::String &sStart, const Utils::String &sDir)
206
void CVirtualFileSystem::_addDir(const Utils::String &sStart, const Utils::String &sDir)
206
{
207
{
207
	CDirIO Dir(sStart + "/" + sDir);
208
	CDirIO Dir(sStart + "/" + sDir);
208
	CyStringList *list = Dir.DirList();
209
	Utils::CStringList list;
209
	if ( list ) {
210
	if (Dir.dirList(list))
-
 
211
	{
210
		for ( SStringList *strNode = list->Head(); strNode; strNode = strNode->next ) {
212
		for (auto itr = list.begin(); itr != list.end(); itr++)
-
 
213
		{
211
			if ( CDirIO(Dir.Dir(strNode->str)).IsDir() ) _addDir(sStart, sDir + &quot;/&quot; + strNode->str.ToString());
214
			if (CDirIO(Dir.dir((*itr)->str)).IsDir()) _addDir(sStart, sDir + &quot;/&quot; + (*itr)->str);
212
			else if ( CFileIO(strNode->str).isFileExtension("cat") ) continue;
215
			else if (CFileIO((*itr)->str).isFileExtension("cat")) continue;
213
			else if ( CFileIO(strNode->str).isFileExtension("dat") ) continue;
216
			else if (CFileIO((*itr)->str).isFileExtension("dat")) continue;
214
			else this->_addFile(sDir + "/" + strNode->;str.ToString(), Dir.File(strNode->str).ToString(), m_pMap);
217
			else this->_addFile(sDir + "/" + (*itr)->;str, Dir.file((*itr)->str), m_pMap);
215
		}
218
		}
216
	}
219
	}
217
}
220
}
218
 
221
 
219
 
222
 
220
void CVirtualFileSystem::_removeSameFile(const Utils::String &sFile, const Utils::String &sDest, const Utils::String &ext, FileList *pList)
223
void CVirtualFileSystem::_removeSameFile(const Utils::String &sFile, const Utils::String &sDest, const Utils::String &ext, FileList *pList)
221
{
224
{
222
	CFileIO F(sFile);
225
	CFileIO F(sFile);
223
 
226
 
224
	Utils::String newFile = F.ChangeFileExtension(ext).ToString();
227
	Utils::String newFile = F.ChangeFileExtension(ext).ToString();
225
	newFile = newFile.lower();
228
	newFile = newFile.lower();
226
 
229
 
227
	FileListItr itr = pList->find(newFile);
230
	FileListItr itr = pList->find(newFile);
228
	if ( itr != pList->end() ) {
231
	if ( itr != pList->end() ) {
229
		if ( !CFileIO((*pList)[newFile]).dir().Compare(CFileIO(sDest).dir()) ) {
232
		if ( !CFileIO((*pList)[newFile]).dir().Compare(CFileIO(sDest).dir()) ) {
230
			pList->erase(newFile);
233
			pList->erase(newFile);
231
		}
234
		}
232
	}
235
	}
233
}
236
}
234
 
237
 
235
void CVirtualFileSystem::_addFile(const Utils::String &sFile, const Utils::String &sDest, FileList *pList)
238
void CVirtualFileSystem::_addFile(const Utils::String &sFile, const Utils::String &sDest, FileList *pList)
236
{
239
{
237
	Utils::String file = sFile.asFilename().removeIf(0, '/');
240
	Utils::String file = sFile.asFilename().removeIf(0, '/');
238
 
241
 
239
	// check file extension, remove any patching files in previous files
242
	// check file extension, remove any patching files in previous files
240
	CFileIO F(file);
243
	CFileIO F(file);
-
 
244
	Utils::String ext = F.extension().toLower();
241
	if ( F.isFileExtension("bob";) || F.isFileExtension("pbd") || F.isFileExtension("bod") ) {
245
	if (ext.Compare("bob", true) || ext.Compare("pbd";, true) || ext.Compare("bod", true) ) {
242
		_removeSameFile(file, sDest, "pbb", pList);
246
		_removeSameFile(file, sDest, "pbb", pList);
243
		_removeSameFile(file, sDest, "bob", pList);
247
		_removeSameFile(file, sDest, "bob", pList);
244
		_removeSameFile(file, sDest, "pbd", pList);
248
		_removeSameFile(file, sDest, "pbd", pList);
245
	}
249
	}
246
	else if ( F.isFileExtension("xml";) || F.isFileExtension(";txt") )
250
	else if (ext.Compare("xml";, true) || ext.Compare(";txt", true) )
247
		_removeSameFile(file, sDest, "pck", pList);
251
		_removeSameFile(file, sDest, "pck", pList);
248
 
252
 
249
	(*pList)[file.lower()] = sDest.findReplace("//", "/");
253
	(*pList)[file.lower()] = sDest.findReplace("\\", "/").findReplace("//", "/");
250
}
254
}
251
void CVirtualFileSystem::_addModFile(const Utils::String &sFile, const Utils::String &sMod, FileList *pList)
255
void CVirtualFileSystem::_addModFile(const Utils::String &sFile, const Utils::String &sMod, FileList *pList)
252
{
256
{
253
	this->_addFile(sFile, sMod + "::" + sFile, pList);
257
	this->_addFile(sFile, sMod + "::" + sFile, pList);
254
}
258
}
255
 
259
 
256
bool CVirtualFileSystem::loadMod(const Utils::String &mod)
260
bool CVirtualFileSystem::loadMod(const Utils::String &mod)
257
{
261
{
258
	bool loaded = false;
262
	bool loaded = false;
259
 
263
 
260
	if ( !m_pModMap ) m_pModMap = new FileList;
264
	if ( !m_pModMap ) m_pModMap = new FileList;
261
 
265
 
262
	CCatFile cat;
266
	CCatFile cat;
263
	if ( CCatFile::Opened(cat.Open(mod, m_sAddon, CATREAD_JUSTCONTENTS, false), false) )
267
	if ( CCatFile::Opened(cat.Open(mod, m_sAddon, CATREAD_JUSTCONTENTS, false), false) )
264
	{
268
	{
265
		for ( CListNode<SInCatFile> *c = cat.GetFiles()->Front(); c; c = c->next() ) {
269
		for (auto itr = cat.GetFiles()->cbegin(); itr != cat.GetFiles()->cend(); itr++) 
-
 
270
		{
266
			this->_addModFile(CFileIO(c->Data()->sFile).fullFilename(), mod, m_pModMap);
271
			this->_addModFile(CFileIO((*itr)->sFile).fullFilename(), mod, m_pModMap);
267
			loaded = true;
272
			loaded = true;
268
		}
273
		}
269
	}
274
	}
270
 
275
 
271
	return loaded;
276
	return loaded;
Line 278... Line 283...
278
	if ( !m_pMap ) m_pMap = new FileList;
283
	if ( !m_pMap ) m_pMap = new FileList;
279
 
284
 
280
	CCatFile cat;
285
	CCatFile cat;
281
	if ( CCatFile::Opened(cat.Open(mod, m_sAddon, CATREAD_JUSTCONTENTS, false), false) )
286
	if ( CCatFile::Opened(cat.Open(mod, m_sAddon, CATREAD_JUSTCONTENTS, false), false) )
282
	{
287
	{
283
		for ( CListNode<SInCatFile> *c = cat.GetFiles()->Front(); c; c = c->next() )
288
		for (auto itr = cat.GetFiles()->cbegin(); itr != cat.GetFiles()->cend(); itr++)
284
		{
289
		{
285
			this->_addModFile(CFileIO(c->Data()->sFile).fullFilename(), mod, m_pMap);
290
			this->_addModFile(CFileIO((*itr)->sFile).fullFilename(), mod, m_pMap);
286
			loaded = true;
291
			loaded = true;
287
		}
292
		}
288
	}
293
	}
289
 
294
 
290
	return loaded;
295
	return loaded;
Line 367... Line 372...
367
	CCatFile catFile;
372
	CCatFile catFile;
368
	if ( catFile.Open(sCat, m_sAddon, CATREAD_CATDECRYPT, false) == CATERR_NONE )
373
	if ( catFile.Open(sCat, m_sAddon, CATREAD_CATDECRYPT, false) == CATERR_NONE )
369
	{
374
	{
370
		// check for the file
375
		// check for the file
371
		if ( catFile.ExtractFile(sFile, sTo) ) return sTo;
376
		if ( catFile.ExtractFile(sFile, sTo) ) return sTo;
372
		if ( catFile.Error() == CATERR_INVALIDDEST || catFile.Error() == CATERR_CANTCREATEDIR ) {
377
		if ( catFile.error() == CATERR_INVALIDDEST || catFile.error() == CATERR_CANTCREATEDIR ) {
373
			if ( catFile.ExtractFile(sFile) ) return sFile;
378
			if ( catFile.ExtractFile(sFile) ) return sFile;
374
		}
379
		}
375
	}
380
	}
376
 
381
 
377
	return "";
382
	return "";