// -----------------------------------------------------------------------------
// This file is part of Broken Sword 2.5
// Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdörfer
//
// Broken Sword 2.5 is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// Broken Sword 2.5 is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Broken Sword 2.5; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
// -----------------------------------------------------------------------------
/*
BS_PackageManager
-------------
Dies ist das Package Manager Interface, dass alle Methoden enthält, die ein Package Manager
implementieren muss.
Beim Package Manager ist folgendes zu beachten:
1. es wird ein komplett neuer (virtueller) Verzeichnisbaum erstellt,
in den Packages und Verzeichnisse gemounted werden können.
2. zum Trennen von Elementen eines Verzeichnisspfades wird '/' statt '\' verwendet.
3. LoadDirectoryAsPackage sollte nur zum Testen benutzt werden. Im Final Release sollen sich
alle Dateien in echten Packages befinden.
Autor: Malte Thiesen, $author$
*/
#ifndef BS_PACKAGE_MANAGER_H
#define BS_PACKAGE_MANAGER_H
// Includes
#include "kernel/common.h"
#include "kernel/kernel.h"
#include "kernel/service.h"
// Klassendefinition
/**
@brief Das Package Manager Interface
Beim Package Manager ist folgendes zu beachten:
1. es wird ein komplett neuer (virtueller) Verzeichnisbaum erstellt,
in den Packages und Verzeichnisse gemounted werden können.
2. zum Trennen von Elementen eines Verzeichnisspfades wird '/' statt '\' verwendet.
3. LoadDirectoryAsPackage sollte nur zum Testen benutzt werden. Im Final Release sollen sich
alle Dateien in echten Packages befinden.
*/
class BS_PackageManager : public BS_Service
{
public:
BS_PackageManager(BS_Kernel* pKernel);
virtual ~BS_PackageManager() {};
enum FILE_TYPES
{
FT_DIRECTORY = (1<<0),
FT_FILE = (1<<1)
};
/**
@brief Mit Instanzen dieses Objektes wird nach Dateien gesucht.
Objekte diesen Types wird mit BS_PackageManager::CreateSearch erzeugt.
*/
class FileSearch
{
public:
virtual ~FileSearch(){};
/**
@brief Gibt den Dateinamen der aktuellen Datei zurück.
@return Gibt den Dateinamen der aktuellen Datei zurück.
*/
virtual std::string GetCurFileName() = 0;
/**
@brief Gibt den Typ der aktuellen Datei zurück.
@return Gibt den Typ der aktuellen Datei zurück.
Dieses ist entweder BS_PackageManager::FT_FILE oder BS_PackageManager::FT_DIRECTORY.
*/
virtual unsigned int GetCurFileType() = 0;
/**
@brief Gibt die Größe der aktuellen Datei zurück.
@return Gibt die Größe der aktuellen Datei zurück.
Bei Verzeichnissen ist dieser Wert immer 0.
*/
virtual unsigned int GetCurFileSize() = 0;
// Sucht die nächste Datei
// Gibt false zurück, falls keine weitere Datei gefunden wurde
/**
@brief Sucht die nächste Datei.
@return Gibt false zurück, falls keine weitere Datei die Suchkriterien erfüllte.
*/
virtual bool NextFile() = 0;
};
/**
@brief Mounted den Inhalt eines Packages in das angegebene Verzeichnis im virtuellen Verzeichnisbaum.
@param FileName der Dateiname des zu mountenden Packages
@param MountPosition der Verzeichnisname, unter dem das Package gemounted werden soll
@return Gibt true zurück falls das mounten erfolgreich war, andernfalls false.
*/
virtual bool LoadPackage(const std::string& FileName, const std::string& MountPosition) = 0;
/**
@brief Mounted den Inhalt eines Verzeichnisses in das angegebene Verzeichnis im virtuellen Verzeichnisbaum.
@param DirectoryName der Name des zu mountenden Verzeichnisses
@param MountPosition der Verzeichnisname, unter dem das Verzeichnis gemounted werden soll
@return Gibt true zurück falls das mounten erfolgreich war, andernfalls false.
*/
virtual bool LoadDirectoryAsPackage(const std::string& DirectoryName, const std::string& MountPosition) = 0;
/**
@brief Lädt eine Datei aus dem virtuellen Verzeichnisbaum.
@param FileName der Dateiname der zu ladenden Datei
@param pFileSize Pointer auf die Variable, die die Größe der geladenen Datei enthalten soll
Der Standardwert ist NULL.
@return Gibt einen Pointer auf die Dateidaten zürück, oder NULL, wenn die Datei nicht geladen werden konnte.
@remark Es darf nicht vergessen werden, die Dateidaten nach Benutzung mit BE_DELETE_A freizugeben.
*/
virtual void* GetFile(const std::string& FileName, unsigned int* pFileSize = NULL) = 0;
/**
@brief Gibt den Pfad zum aktuellen Verzeichnis zurück.
@return Gibt einen String zurück, der den Pfad zum aktuellen Verzeichnis enthält.
Falls der Pfad nicht bestimmt werden konnte wird ein leerer String zurückgegeben.
@remark Zum Trennen von Pfadelementen wird "/" und nicht "\" verwendet.
*/
virtual std::string GetCurrentDirectory() = 0;
/**
@brief Wechselt das aktuelle Verzeichnis.
@param Directory ein String der das Verzeichnis bezeichnet, in dass gewechselt werden soll.
Die Pfadangabe darf relativ sein.
@return Gibt true zurück, falls der Vorgang erfolgreich war, ansonsten false.
@remark Zum Trennen von Pfadelementen wird "/" und nicht "\" verwendet.
*/
virtual bool ChangeDirectory(const std::string& Directory) = 0;
/**
@brief Gibt den absoluten Pfad zu einer Datei im virtuellen Verzeichnisbaum zurück.
@param FileName der Dateiname der Datei, deren absoluter Pfad bestimmt werden soll.
Diese Parameter kann sowohl relative als auch absolute Pfadangaben beinhalten.
@return Gibt einen String zurück, der den absoluten Pfad zur übergebenen Datei enthält.
Falls der absolute Pfad nicht bestimmt werden konnte, wird ein leerer String zurückgegeben.
@remark Zum Trennen von Pfadelementen wird "/" und nicht "\" verwendet.
*/
virtual std::string GetAbsolutePath(const std::string& FileName) = 0;
/**
@brief Erstellt ein BS_PackageManager::FileSearch Objekt mit dem Nach Dateien gesucht werden kann.
@param Filter gibt den Suchstring an. Dieser darf die Wildcards '*' und '?' enthalten.
@param Path gibt das Verzeichnis an, welches durchsucht werden soll.
@param TypeFilter ist eine Kombination der Flags BS_PackageManager::FT_DIRECTORY und BS_PackageManager::FT_FILE.
Diese Flags geben an, ob nach Dateien oder Verzeichnissen oder beiden gesucht werden soll.
Der Standardwert ist BS_PackageManager::FT_DIRECTORY | BS_PackageManager::FT_FILE.
@return Gibt einen Pointer auf ein BS_PackageManager::FileSearch Objekt zurück, oder NULL wenn keine Datei gefunden wurde.
@remark Nicht vergessen, das Objekt nach Benutzung mit delete freizugeben.
*/
virtual FileSearch* CreateSearch(const std::string& Filter, const std::string& Path, unsigned int TypeFilter = FT_DIRECTORY | FT_FILE) = 0;
/**
* @brief Gibt die Dateigröße zurück.
* @param FileName die Datei.
* @return die Dateigröße. Im Falle eines Fehlers wird 0xffffffff zurückgegeben.
* @remarks Bei komprimierten Containern wird die unkomprimierte Größe zurückgegeben.
**/
virtual unsigned int GetFileSize(const std::string& FileName) = 0;
/**
@brief Gibt den Typ einer Datei zurück.
@param FileName der Dateiname
@return Gibt den Dateityp zurück (BS_PackageManager::FT_DIRECTORY oder BS_PackageManager::FT_FILE).
Falls die Datei nicht gefunden wurde wird 0 zurückgegeben.
*/
virtual unsigned int GetFileType(const std::string & FileName) = 0;
/**
@brief Bestimmt, ob eine Datei existiert.
@param FileName der Dateiname
@return Gibt true zurück, wenn die Datei existiert, ansonsten false.
*/
virtual bool FileExists(const std::string & FileName) = 0;
private:
bool _RegisterScriptBindings();
};
#endif