コード例 #1
0
ファイル: ArchiveManager.cpp プロジェクト: Altazimuth/SLADE
// -----------------------------------------------------------------------------
// Creates a new archive of the specified format and adds it to the list of open
// archives. Returns the created archive, or nullptr if an invalid archive type
// was given
// -----------------------------------------------------------------------------
Archive* ArchiveManager::newArchive(const string& format)
{
	// Create a new archive depending on the type specified
	Archive* new_archive;
	if (format == "wad")
		new_archive = new WadArchive();
	else if (format == "zip")
		new_archive = new ZipArchive();
	else
	{
		Global::error = S_FMT("Can not create archive of format: %s", CHR(format));
		Log::error(Global::error);
		return nullptr;
	}

	// If the archive was created, set its filename and add it to the list
	if (new_archive)
	{
		new_archive->setFilename(S_FMT("UNSAVED (%s)", new_archive->formatDesc().name));
		addArchive(new_archive);
	}

	// Return the created archive, if any
	return new_archive;
}
コード例 #2
0
ファイル: ArchiveManager.cpp プロジェクト: Genghoidal/SLADE
/* ArchiveManager::newArchive
 * Creates a new archive of the specified format and adds it to the
 * list of open archives. Returns the created archive, or NULL if an
 * invalid archive type was given
 *******************************************************************/
Archive* ArchiveManager::newArchive(uint8_t type)
{
	// Init variables
	Archive* new_archive = NULL;
	string format_str = "";

	// Create a new archive depending on the type specified
	switch (type)
	{
	case ARCHIVE_WAD:
		new_archive = new WadArchive();
		format_str = "wad";
		break;
	case ARCHIVE_ZIP:
		new_archive = new ZipArchive();
		format_str = "zip";
		break;
	default:
		wxLogMessage("This shouldn't happen.");
		return NULL;
	}

	// If the archive was created, set its filename and add it to the list
	if (new_archive)
	{
		new_archive->setFilename(S_FMT("UNSAVED (%s)", format_str));
		addArchive(new_archive);
	}

	// Return the created archive, if any
	return new_archive;
}
コード例 #3
0
ファイル: ArchiveManager.cpp プロジェクト: Altazimuth/SLADE
// -----------------------------------------------------------------------------
// Opens [dir] as a DirArchive and adds it to the list.
// Returns a pointer to the archive or nullptr if an error occurred.
// -----------------------------------------------------------------------------
Archive* ArchiveManager::openDirArchive(const string& dir, bool manage, bool silent)
{
	auto new_archive = getArchive(dir);

	LOG_MESSAGE(1, "Opening directory %s as archive", dir);

	// If the archive is already open, just return it
	if (new_archive)
	{
		// Announce open
		if (!silent)
		{
			MemChunk mc;
			uint32_t index = archiveIndex(new_archive);
			mc.write(&index, 4);
			announce("archive_opened", mc);
		}

		return new_archive;
	}

	new_archive = new DirArchive();

	// If it opened successfully, add it to the list if needed & return it,
	// Otherwise, delete it and return nullptr
	if (new_archive->open(dir))
	{
		if (manage)
		{
			// Add the archive
			addArchive(new_archive);

			// Announce open
			if (!silent)
			{
				MemChunk mc;
				uint32_t index = archiveIndex(new_archive);
				mc.write(&index, 4);
				announce("archive_opened", mc);
			}

			// Add to recent files
			addRecentFile(dir);
		}

		// Return the opened archive
		return new_archive;
	}
	else
	{
		LOG_MESSAGE(1, "Error: " + Global::error);
		delete new_archive;
		return nullptr;
	}
}
コード例 #4
0
ファイル: disk_ns.cpp プロジェクト: project-cabal/cabal
Common::String Disk_ns::selectArchive(const Common::String& name) {
	Common::String oldName = _resArchiveName;

	if (_sset.hasArchive(name)) {
		return oldName;
	}

	if (!_resArchiveName.empty()) {
		_sset.remove(_resArchiveName);
	}
	_resArchiveName = name;
	addArchive(name, NORMAL_ARCHIVE_PRIORITY);

	return oldName;
}
コード例 #5
0
ファイル: disk_ns.cpp プロジェクト: project-cabal/cabal
void Disk_ns::setLanguage(uint16 language) {
	debugC(1, kDebugDisk, "setLanguage(%i)", language);
	assert(language < 4);

	if (!_language.empty()) {
		_sset.remove(_language);
	}

	static const char *languages[] = { "it", "fr", "en", "ge" };
	_language = languages[language];

	if (_sset.hasArchive(_language)) {
		return;
	}

	addArchive(_language, LOWEST_ARCHIVE_PRIORITY);
}
コード例 #6
0
Alembic::Abc::IArchive * getArchiveFromID(XSI::CString path)
{
   std::map<std::string,Alembic::Abc::IArchive *>::iterator it;
   it = gArchives.find(path.GetAsciiString());
   if(it == gArchives.end())
   {
      // check if the file exists
      FILE * file = fopen(path.GetAsciiString(),"rb");
      if(file != NULL)
      {
         fclose(file);
         addArchive(new Alembic::Abc::IArchive( Alembic::AbcCoreHDF5::ReadArchive(), path.GetAsciiString()));
         return getArchiveFromID(path);
      }
      return NULL;
   }

   return it->second;
}
コード例 #7
0
Alembic::Abc::IArchive* getArchiveFromID(std::string const& path)
{
  ESS_PROFILE_SCOPE("getArchiveFromID-1");
  std::map<std::string, AlembicArchiveInfo>::iterator it;
  std::string resolvedPath = resolvePath(path);
  it = gArchives.find(resolvedPath);
  if (it == gArchives.end()) {
    // check if the file exists

    if (!boost::filesystem::exists(resolvedPath.c_str())) {
      ESS_LOG_ERROR("Can't find Alembic file.  Path: "
                    << path << "  Resolved path: " << resolvedPath);
      return NULL;
    }

    FILE* file = fopen(resolvedPath.c_str(), "rb");
    if (file == NULL) {
      return NULL;
    }
    else {
      fclose(file);

      AbcF::IFactory iFactory;
      AbcF::IFactory::CoreType oType;
      addArchive(new Abc::IArchive(iFactory.getArchive(resolvedPath, oType)));

      // addArchive(new Abc::IArchive( Alembic::AbcCoreHDF5::ReadArchive(),
      // resolvedPath));

      Abc::IArchive* pArchive = gArchives.find(resolvedPath)->second.archive;
      EC_LOG_INFO("Opening Abc Archive: " << pArchive->getName());
      return pArchive;
    }
  }
  return it->second.archive;
}
コード例 #8
0
ファイル: disk_ns.cpp プロジェクト: project-cabal/cabal
void DosDisk_ns::init() {
	// setup permament archives
	addArchive("disk1", LOW_ARCHIVE_PRIORITY);
}
コード例 #9
0
ファイル: ArchiveManager.cpp プロジェクト: Altazimuth/SLADE
// -----------------------------------------------------------------------------
// Same as the above function, except it opens from an ArchiveEntry
// -----------------------------------------------------------------------------
Archive* ArchiveManager::openArchive(ArchiveEntry* entry, bool manage, bool silent)
{
	// Check entry was given
	if (!entry)
		return nullptr;

	// Check if the entry is already opened
	for (auto& open_archive : open_archives_)
	{
		if (open_archive.archive->parentEntry() == entry)
		{
			// Announce open
			if (!silent)
			{
				MemChunk mc;
				uint32_t index = archiveIndex(open_archive.archive);
				mc.write(&index, 4);
				announce("archive_opened", mc);
			}

			return open_archive.archive;
		}
	}

	// Check entry type
	Archive* new_archive;
	if (WadArchive::isWadArchive(entry->data()))
		new_archive = new WadArchive();
	else if (ZipArchive::isZipArchive(entry->data()))
		new_archive = new ZipArchive();
	else if (ResArchive::isResArchive(entry->data()))
		new_archive = new ResArchive();
	else if (LibArchive::isLibArchive(entry->data()))
		new_archive = new LibArchive();
	else if (DatArchive::isDatArchive(entry->data()))
		new_archive = new DatArchive();
	else if (PakArchive::isPakArchive(entry->data()))
		new_archive = new PakArchive();
	else if (BSPArchive::isBSPArchive(entry->data()))
		new_archive = new BSPArchive();
	else if (GrpArchive::isGrpArchive(entry->data()))
		new_archive = new GrpArchive();
	else if (RffArchive::isRffArchive(entry->data()))
		new_archive = new RffArchive();
	else if (GobArchive::isGobArchive(entry->data()))
		new_archive = new GobArchive();
	else if (LfdArchive::isLfdArchive(entry->data()))
		new_archive = new LfdArchive();
	else if (HogArchive::isHogArchive(entry->data()))
		new_archive = new HogArchive();
	else if (ADatArchive::isADatArchive(entry->data()))
		new_archive = new ADatArchive();
	else if (Wad2Archive::isWad2Archive(entry->data()))
		new_archive = new Wad2Archive();
	else if (WadJArchive::isWadJArchive(entry->data()))
		new_archive = new WadJArchive();
	else if (WolfArchive::isWolfArchive(entry->data()))
		new_archive = new WolfArchive();
	else if (GZipArchive::isGZipArchive(entry->data()))
		new_archive = new GZipArchive();
	else if (BZip2Archive::isBZip2Archive(entry->data()))
		new_archive = new BZip2Archive();
	else if (TarArchive::isTarArchive(entry->data()))
		new_archive = new TarArchive();
	else if (DiskArchive::isDiskArchive(entry->data()))
		new_archive = new DiskArchive();
	else if (entry->name().Lower().EndsWith(".pod") && PodArchive::isPodArchive(entry->data()))
		new_archive = new PodArchive();
	else if (ChasmBinArchive::isChasmBinArchive(entry->data()))
		new_archive = new ChasmBinArchive();
	else if (SiNArchive::isSiNArchive(entry->data()))
		new_archive = new SiNArchive();
	else
	{
		// Unsupported format
		Global::error = "Unsupported or invalid Archive format";
		return nullptr;
	}

	// If it opened successfully, add it to the list & return it,
	// Otherwise, delete it and return nullptr
	if (new_archive->open(entry))
	{
		if (manage)
		{
			// Add to parent's child list if parent is open in the manager (it should be)
			int index_parent = -1;
			if (entry->parent())
				index_parent = archiveIndex(entry->parent());
			if (index_parent >= 0)
				open_archives_[index_parent].open_children.push_back(new_archive);

			// Add the new archive
			addArchive(new_archive);

			// Announce open
			if (!silent)
			{
				MemChunk mc;
				uint32_t index = archiveIndex(new_archive);
				mc.write(&index, 4);
				announce("archive_opened", mc);
			}
		}

		return new_archive;
	}
	else
	{
		LOG_MESSAGE(1, "Error: " + Global::error);
		delete new_archive;
		return nullptr;
	}
}
コード例 #10
0
ファイル: ArchiveManager.cpp プロジェクト: Altazimuth/SLADE
// -----------------------------------------------------------------------------
// Opens and adds a archive to the list, returns a pointer to the newly opened
// and added archive, or nullptr if an error occurred
// -----------------------------------------------------------------------------
Archive* ArchiveManager::openArchive(const string& filename, bool manage, bool silent)
{
	// Check for directory
	if (!wxFile::Exists(filename) && wxDirExists(filename))
		return openDirArchive(filename, manage, silent);

	auto new_archive = getArchive(filename);

	LOG_MESSAGE(1, "Opening archive %s", filename);

	// If the archive is already open, just return it
	if (new_archive)
	{
		// Announce open
		if (!silent)
		{
			MemChunk mc;
			uint32_t index = archiveIndex(new_archive);
			mc.write(&index, 4);
			announce("archive_opened", mc);
		}

		return new_archive;
	}

	// Determine file format
	if (WadArchive::isWadArchive(filename))
		new_archive = new WadArchive();
	else if (ZipArchive::isZipArchive(filename))
		new_archive = new ZipArchive();
	else if (ResArchive::isResArchive(filename))
		new_archive = new ResArchive();
	else if (DatArchive::isDatArchive(filename))
		new_archive = new DatArchive();
	else if (LibArchive::isLibArchive(filename))
		new_archive = new LibArchive();
	else if (PakArchive::isPakArchive(filename))
		new_archive = new PakArchive();
	else if (BSPArchive::isBSPArchive(filename))
		new_archive = new BSPArchive();
	else if (GrpArchive::isGrpArchive(filename))
		new_archive = new GrpArchive();
	else if (RffArchive::isRffArchive(filename))
		new_archive = new RffArchive();
	else if (GobArchive::isGobArchive(filename))
		new_archive = new GobArchive();
	else if (LfdArchive::isLfdArchive(filename))
		new_archive = new LfdArchive();
	else if (HogArchive::isHogArchive(filename))
		new_archive = new HogArchive();
	else if (ADatArchive::isADatArchive(filename))
		new_archive = new ADatArchive();
	else if (Wad2Archive::isWad2Archive(filename))
		new_archive = new Wad2Archive();
	else if (WadJArchive::isWadJArchive(filename))
		new_archive = new WadJArchive();
	else if (WolfArchive::isWolfArchive(filename))
		new_archive = new WolfArchive();
	else if (GZipArchive::isGZipArchive(filename))
		new_archive = new GZipArchive();
	else if (BZip2Archive::isBZip2Archive(filename))
		new_archive = new BZip2Archive();
	else if (TarArchive::isTarArchive(filename))
		new_archive = new TarArchive();
	else if (DiskArchive::isDiskArchive(filename))
		new_archive = new DiskArchive();
	else if (PodArchive::isPodArchive(filename))
		new_archive = new PodArchive();
	else if (ChasmBinArchive::isChasmBinArchive(filename))
		new_archive = new ChasmBinArchive();
	else if (SiNArchive::isSiNArchive(filename))
		new_archive = new SiNArchive();
	else
	{
		// Unsupported format
		Global::error = "Unsupported or invalid Archive format";
		return nullptr;
	}

	// If it opened successfully, add it to the list if needed & return it,
	// Otherwise, delete it and return nullptr
	if (new_archive->open(filename))
	{
		if (manage)
		{
			// Add the archive
			addArchive(new_archive);

			// Announce open
			if (!silent)
			{
				MemChunk mc;
				uint32_t index = archiveIndex(new_archive);
				mc.write(&index, 4);
				announce("archive_opened", mc);
			}

			// Add to recent files
			addRecentFile(filename);
		}

		// Return the opened archive
		return new_archive;
	}
	else
	{
		LOG_MESSAGE(1, "Error: " + Global::error);
		delete new_archive;
		return nullptr;
	}
}
コード例 #11
0
ファイル: ArchiveManager.cpp プロジェクト: Genghoidal/SLADE
/* ArchiveManager::openArchive
 * Same as the above function, except it opens from an ArchiveEntry
 *******************************************************************/
Archive* ArchiveManager::openArchive(ArchiveEntry* entry, bool manage, bool silent)
{
	Archive* new_archive = NULL;

	// Check entry was given
	if (!entry)
		return NULL;

	// Check if the entry is already opened
	for (size_t a = 0; a < open_archives.size(); a++)
	{
		if (open_archives[a].archive->getParent() == entry)
		{
			// Announce open
			if (!silent)
			{
				MemChunk mc;
				uint32_t index = archiveIndex(open_archives[a].archive);
				mc.write(&index, 4);
				announce("archive_opened", mc);
			}

			return open_archives[a].archive;
		}
	}

	// Check entry type
	if (WadArchive::isWadArchive(entry->getMCData()))
		new_archive = new WadArchive();
	else if (ZipArchive::isZipArchive(entry->getMCData()))
		new_archive = new ZipArchive();
	else if (ResArchive::isResArchive(entry->getMCData()))
		new_archive = new ResArchive();
	else if (LibArchive::isLibArchive(entry->getMCData()))
		new_archive = new LibArchive();
	else if (DatArchive::isDatArchive(entry->getMCData()))
		new_archive = new DatArchive();
	else if (PakArchive::isPakArchive(entry->getMCData()))
		new_archive = new PakArchive();
	else if (BSPArchive::isBSPArchive(entry->getMCData()))
		new_archive = new BSPArchive();
	else if (GrpArchive::isGrpArchive(entry->getMCData()))
		new_archive = new GrpArchive();
	else if (RffArchive::isRffArchive(entry->getMCData()))
		new_archive = new RffArchive();
	else if (GobArchive::isGobArchive(entry->getMCData()))
		new_archive = new GobArchive();
	else if (LfdArchive::isLfdArchive(entry->getMCData()))
		new_archive = new LfdArchive();
	else if (HogArchive::isHogArchive(entry->getMCData()))
		new_archive = new HogArchive();
	else if (ADatArchive::isADatArchive(entry->getMCData()))
		new_archive = new ADatArchive();
	else if (Wad2Archive::isWad2Archive(entry->getMCData()))
		new_archive = new Wad2Archive();
	else if (WadJArchive::isWadJArchive(entry->getMCData()))
		new_archive = new WadJArchive();
	else if (WolfArchive::isWolfArchive(entry->getMCData()))
		new_archive = new WolfArchive();
	else if (GZipArchive::isGZipArchive(entry->getMCData()))
		new_archive = new GZipArchive();
	else if (BZip2Archive::isBZip2Archive(entry->getMCData()))
		new_archive = new BZip2Archive();
	else if (TarArchive::isTarArchive(entry->getMCData()))
		new_archive = new TarArchive();
	else if (DiskArchive::isDiskArchive(entry->getMCData()))
		new_archive = new DiskArchive();
	else
	{
		// Unsupported format
		Global::error = "Unsupported or invalid Archive format";
		return NULL;
	}

	// If it opened successfully, add it to the list & return it,
	// Otherwise, delete it and return NULL
	if (new_archive->open(entry))
	{
		if (manage)
		{
			// Add to parent's child list if parent is open in the manager (it should be)
			int index_parent = -1;
			if (entry->getParent())
				index_parent = archiveIndex(entry->getParent());
			if (index_parent >= 0)
				open_archives[index_parent].open_children.push_back(new_archive);

			// Add the new archive
			addArchive(new_archive);

			// Announce open
			if (!silent)
			{
				MemChunk mc;
				uint32_t index = archiveIndex(new_archive);
				mc.write(&index, 4);
				announce("archive_opened", mc);
			}
		}

		return new_archive;
	}
	else
	{
		wxLogMessage("Error: " + Global::error);
		delete new_archive;
		return NULL;
	}
}