|
| Patrick's Programming Library Version 7.0.0 - Dokumentation |
Klasse zum Lesen und schreiben von PFP-Files Version 3. Mehr ...
Klassen | |
| class | Iterator |
Öffentliche Methoden | |
| PFPFile () | |
| Konstruktor der Klasse. Mehr ... | |
| virtual | ~PFPFile () |
| Destruktor der Klasse. Mehr ... | |
| void | addChunk (PFPChunk *chunk) |
| Chunk hinzufügen. Mehr ... | |
| void | clear () |
| Inhalt der Klasse löschen. Mehr ... | |
| void | deleteChunk (PFPChunk *chunk) |
| Bestimmten Chunk löschen. Mehr ... | |
| void | deleteChunk (const String &chunkname) |
| Chunk nach Namen löschen. Mehr ... | |
| PFPChunk * | findFirstChunk (Iterator &it, const String &chunkname) const |
| Ersten Chunk mit einem bestimmten Namen finden. Mehr ... | |
| PFPChunk * | findNextChunk (Iterator &it, const String &chunkname) const |
| Nächsten Chunk mit einem bestimmten Namen finden. Mehr ... | |
| String | getAuthor () const |
| Pointer auf den Author holen. Mehr ... | |
| Compression::Algorithm | getCompression () const |
| Kompressionsverfahren auslesen. Mehr ... | |
| String | getCopyright () const |
| Pointer auf den Copyright-String holen. Mehr ... | |
| String | getDescription () const |
| Pointer auf die Description holen. Mehr ... | |
| PFPChunk * | getFirst (Iterator &it) const |
| Pointer auf ersten Chunk holen. Mehr ... | |
| const String & | getID () const |
| ID auslesen. Mehr ... | |
| int | getMainVersion () const |
| Hauptversion auslesen. Mehr ... | |
| String | getName () const |
| Namen holen. Mehr ... | |
| PFPChunk * | getNext (Iterator &it) const |
| Pointer auf nächsten Chunk holen. Mehr ... | |
| int | getSubVersion () const |
| Unterversion auslesen. Mehr ... | |
| void | getVersion (int *main, int *sub) const |
| Version auslesen. Mehr ... | |
| bool | ident (FileObject &ff) |
| Prüfen, ob es sich um ein PFP-File handelt. Mehr ... | |
| bool | ident (const String &file) |
| Prüfen, ob es sich um ein PFP-File handelt. Mehr ... | |
| virtual void | list () const |
| Chunks auf STDOUT auflisten. Mehr ... | |
| void | load (FileObject &ff) |
| PFP-File laden. Mehr ... | |
| void | load (const String &file) |
| PFP-File laden. Mehr ... | |
| virtual int | loadRequest (const String &id, int mainversion, int subversion) |
| Ladevorgang bestätigen. Mehr ... | |
| void | reset (Iterator &it) const |
| Zeiger zum Durchwandern der Chunks zurücksetzen. Mehr ... | |
| void | save (const String &filename) |
| PFP-File speichern. Mehr ... | |
| void | setAuthor (const String &author) |
| Author setzen. Mehr ... | |
| void | setCompression (Compression::Algorithm type) |
| Kompression einstellen. Mehr ... | |
| void | setCopyright (const String ©) |
| Copyright setzen. Mehr ... | |
| void | setDescription (const String &descr) |
| Description setzen. Mehr ... | |
| void | setId (const String &id) |
| ID des PFP-Files setzen. Mehr ... | |
| void | setName (const String &name) |
| Name setzen. Mehr ... | |
| void | setVersion (int main=0, int sub=0) |
| Version setzen. Mehr ... | |
Öffentliche Attribute | |
| Mutex | myMutex |
Private Methoden | |
| void | saveChunk (char *buffer, size_t &pp, PFPChunk *chunk) |
| void | setParam (const String &chunkname, const String &data) |
| Interne Funktion zum Speichern von vordefinierten Chunks. Mehr ... | |
Private Attribute | |
| List< PFPChunk * > | Chunks |
| Verwaltung aller Chunks in einer Liste. Mehr ... | |
| Compression::Algorithm | comp |
| Kompressions-Flag. Mehr ... | |
| String | id |
| enthält die ID des Chunks. Die ID ist immer 4 Byte lang, gefolgt von einem 0-Byte Mehr ... | |
| ppluint8 | mainversion |
| Hier wird die Hauptversion des Files gespeichert. Mehr ... | |
| ppluint8 | subversion |
| Hier wird die Unterversion des Files gespeichert. Mehr ... | |
Mit dieser Klasse können Dateien mit "PFP-File"-Header der Version 3 gelesen und geschrieben werden. Mit Version 3 wurde ein mehr generisches Format definiert, als in den beiden Vorgängerversionen. Jedes File, ganz gleich welchen Inhalt es hat, hat bis zum Ende den gleichen Aufbau. Wichtigste Neuerung dabei sind die sogenannten Chunks. Ein File kann aus bliebig vielen Chunks bestehen. Diese werden von der Klasse PFPChunk abgeleitet, bekommen einen Namen und einen beliebigen Inhalt. Diese können dann mit PFPFile::Add in das File hinzugefügt werden.
Ein PFP-File in der Version 3 ist in mehrere aufeinanderfolgende Abschnitte aufgeteilt:
Alle 4-Byte Größenangaben sind im LittleEndian-Format!
Der Header einer Version 3 Datei sieht so aus:
Im Anschluss an den Header folgen die Nutzdaten. Sofern keine Komprimierung verwendet wurde, geht es sofort mit dem ersten Chunk los. Ist die Datei komprimiert folgt erst der Komprimierungsheader:
In einem PFP-File können beliebig viele Chunks vorkommen. Ein Chunk besteht immer aus einem 4-Byte langen Namen, gefolgt von einem 4-Byte Integer, der die Größe des Chunks einschließlich des Headers angibt, gefolgt von den Nutzdaten. Abgesehen von den unten aufgeführten vordefinierten Chunks, können beliebig viele Chunks mit gleichem Namen vorhanden sein.
Ein Chunk muss nicht zwingend Nutzdaten enthalten.
Die nachfolgenden Chunks sind vordefiniert, aber optional
Author
Der Name des Authors kann mit der Funktion PFPFile::SetAuthor gesetzt werden.
Name
Der Name des Files kann mit der Funktion PFPFile::SetName gesetzt werden.
Description
Die Description kann mit der Funktion PFPFile::SetDescription gesetzt werden.
Copyright
Der Copyright-String kann mit der Funktion PFPFile::SetCopyright gesetzt werden.
Dieser Chunk ist immer der letzte in der Datei und kennzeichnet das Ende der Nutzdaten.
| ppl7::PFPFile::PFPFile | ( | ) |
Hier werden einige interne Variablen initialisert, die ID wird auf "UNKN" gesetzt, Version auf 0 und Kompression abgeschaltet
|
virtual |
Der Destruktor sorgt dafür, dass sämtlicher von der Klasse allokierter Speicher einschließlich aller geladener Chunks freigegeben wird.
| void ppl7::PFPFile::addChunk | ( | PFPChunk * | chunk | ) |
Mit dieser Funktion wird ein neuer Chunk in die Klasse hinzugefügt. Der Chunk muss von der Anwendung mit "new" erstellt worden sein, einen Namen haben. Ist dies nicht der Fall, gibt die Funktion eine Fehlermeldung zurück.
Sobald der Chunk mit AddChunk an die PFPFile-Klasse übergeben wurde, wird er von der Klasse verwaltet und gegebenenfalls auch gelöscht. Die Anwendung braucht kein "delete" darauf zu machen.
| chunk | Pointer auf den hinzuzufügenden Chunk |
| void ppl7::PFPFile::clear | ( | ) |
| void ppl7::PFPFile::deleteChunk | ( | PFPChunk * | chunk | ) |
Mit dieser Funktion wird ein bestimmter Chunk aus der Klasse gelöscht.
| chunk | Pointer auf den zu löschenden Chunk |
| void ppl7::PFPFile::deleteChunk | ( | const String & | chunkname | ) |
Mit dieser Funktion werden alle Chunks gelöscht, die den angegebenen Namen haben
| chunkname | Pointer auf den Namen des Chunks |
Mit dieser und der Funktion PFPFile::FindNextChunk kann man sich durch alle Chunks mit einem bestimmten Namen durchhangeln.
| chunkname | Pointer auf den Namen des Chunks |
Mit dieser und der Funktion PFPFile::FindFirstChunk kann man sich durch alle Chunks mit einem bestimmten Namen durchhangeln.
| chunkname | Optionaler Pointer auf den Namen des Chunks. Wurde zuvor bereits PFPFile::GetFirstChunk aufgerufen, muss kein Name angegeben werden. |
| String ppl7::PFPFile::getAuthor | ( | ) | const |
| Compression::Algorithm ppl7::PFPFile::getCompression | ( | ) | const |
Mit dieser Funktion wird das eingestellte Kompressionsverfahren ausgelesen.
| String ppl7::PFPFile::getCopyright | ( | ) | const |
| String ppl7::PFPFile::getDescription | ( | ) | const |
| const String & ppl7::PFPFile::getID | ( | ) | const |
| int ppl7::PFPFile::getMainVersion | ( | ) | const |
Mit dieser Funktion wird die Hauptversion der Datei ausgelesen.
| String ppl7::PFPFile::getName | ( | ) | const |
| int ppl7::PFPFile::getSubVersion | ( | ) | const |
Mit dieser Funktion wird die Unterversion der Datei ausgelesen.
| void ppl7::PFPFile::getVersion | ( | int * | main, |
| int * | sub | ||
| ) | const |
| bool ppl7::PFPFile::ident | ( | FileObject & | ff | ) |
ff um eine Datei im Format PFP-Files Version 3 PFP-Format Version 3 handelt. Ist dies der Fall, wird deren ID und Version eingelesen.| ff | Referenz auf eine geöffnete Datei |
true zurück, wenn es sich um eine Datei im PFP-Format handelt. Deren ID kann anschließend mit PFPFile::getID ausgelesen werden, Version mit PFPFile::getVersion bzw. PFPFile::getMainVersion und PFPFile::getSubVersion. Handelt es sich nicht um eine Datei im PFP-Format, gibt die Funktion false zurück. Es wird keine Exception geworfen. | bool ppl7::PFPFile::ident | ( | const String & | file | ) |
file um eine Datei im Format PFP-Files Version 3 PFP-Format Version 3 handelt. Ist dies der Fall, wird deren ID und Version eingelesen.| file | Dateiname |
true zurück, wenn es sich um eine Datei im PFP-Format handelt. Deren ID kann anschließend mit PFPFile::getID ausgelesen werden, Version mit PFPFile::getVersion bzw. PFPFile::getMainVersion und PFPFile::getSubVersion. Handelt es sich nicht um eine Datei im PFP-Format, gibt die Funktion false zurück. Es wird keine Exception geworfen.
|
virtual |
Diese Funktion listet die Namen und Größen aller Chunks auf STDOUT aus.
| void ppl7::PFPFile::load | ( | FileObject & | ff | ) |
Mit dieser Funktion wird ein PFP-File in die Klasse geladen. Dabei wird zuerst der Header geladen und überprüft, ob es sich um ein gültiges PFP-File handelt. Dann wird die virtuelle Funktion PFPFile::LoadRequest mit ID, Haupt- und Unterversion als Parameter aufgerufen. Liefert diese nicht true (1) zurück, wird der Ladevorgang abgebrochen. Andernfalls wird fortgeführt und geprüft, ob der Datenbereich komprimiert ist und gegebenenfalls dekomprimiert. Erst danach werden die einzelnen Chunks eingelesen. Kommt es dabei zu Fehlern durch ungültige Chunks, werden diese ignoriert und die Funktion gibt den Fehlercode 434 zurück.
| ff | Pointer auf eine CFile-Klasse, mit der die einzulesende Datei geöffnet wurde. |
| void ppl7::PFPFile::load | ( | const String & | file | ) |
Mit dieser Funktion wird ein PFP-File in die Klasse geladen. Dabei wird zuerst der Header geladen und überprüft, ob es sich um ein gültiges PFP-File handelt. Anschließend wird geprüft, ob der Datenbereich komprimiert ist und gegebenenfalls dekomprimiert. Erst danach werden die einzelnen Chunks eingelesen. Kommt es dabei zu Fehlern durch ungültige Chunks, werden diese ignoriert und die Funktion gibt den Fehlercode 434 zurück.
| file | Pointer auf den Namen der Datei, die geladen werden soll. |
|
virtual |
Diese Funktion wird bei jedem Ladevorgang aufgerufen. Falls die Anwendung eine Klasse definiert hat, die von PFPFile abgeleitet ist, kann sie an dieser Stelle den Ladevorgang abbrechen, wenn die Datei nicht dem unterstützten Format entspricht.
| id | Pointer auf die 4-Byte-ID des PFP-Files |
| mainversion | Die Hauptversion der Datei |
| subversion | Die Unterversion der Datei |
| void ppl7::PFPFile::reset | ( | Iterator & | it | ) | const |
Mit dieser Funktion wird der Zeiger, der beim Durchwandern der Chunks mit den Funktionen FindNextChunk und GetNext verwendet wird, wieder auf den Anfang gesetzt.
| void ppl7::PFPFile::save | ( | const String & | filename | ) |
Mit dieser Funktion wird der Inhalt der PFPFile-Klasse in eine Datei geschrieben. Dabei wird der Header und sämtliche Chunks zusammengefasst, gegebenenfalls komprimiert (siehe PFPFile::SetCompression) und im Filesystem gespeichert. Der genaue Aufbau der Datei wird weiter unten beschrieben.
| filename | Die Funktion bekommt als einzigen Parameter einen Pointer auf den Dateinamen. Es ist zu beachten, dass eine eventuell vorhandene gleichnamige Datei überschrieben wird. |
| EmptyFileException | Das File enthält keine Chunks, es gibt nichts zu speichern |
Ein PFP-File in der Version 3 ist in mehrere aufeinanderfolgende Abschnitte aufgeteilt:
Alle 4-Byte Größenangaben sind im LittleEndian-Format!
Der Header einer Version 3 Datei sieht so aus:
Im Anschluss an den Header folgen die Nutzdaten. Sofern keine Komprimierung verwendet wurde, geht es sofort mit dem ersten Chunk los. Ist die Datei komprimiert folgt erst der Komprimierungsheader:
In einem PFP-File können beliebig viele Chunks vorkommen. Ein Chunk besteht immer aus einem 4-Byte langen Namen, gefolgt von einem 4-Byte Integer, der die Größe des Chunks einschließlich des Headers angibt, gefolgt von den Nutzdaten. Abgesehen von den unten aufgeführten vordefinierten Chunks, können beliebig viele Chunks mit gleichem Namen vorhanden sein.
Ein Chunk muss nicht zwingend Nutzdaten enthalten.
Die nachfolgenden Chunks sind vordefiniert, aber optional
Author
Der Name des Authors kann mit der Funktion PFPFile::SetAuthor gesetzt werden.
Name
Der Name des Files kann mit der Funktion PFPFile::SetName gesetzt werden.
Description
Die Description kann mit der Funktion PFPFile::SetDescription gesetzt werden.
Copyright
Der Copyright-String kann mit der Funktion PFPFile::SetCopyright gesetzt werden.
Dieser Chunk ist immer der letzte in der Datei und kennzeichnet das Ende der Nutzdaten.
|
private |
| void ppl7::PFPFile::setAuthor | ( | const String & | author | ) |
Mit dieser Funktion wird automatisch ein Author-Chunk ("AUTH") angelegt. Dabei ist sichergestellt, dass der Chunk nur ein einziges mal in der Datei vorkommt.
| void ppl7::PFPFile::setCompression | ( | Compression::Algorithm | type | ) |
| type | Ein Wert, der die Art der Kompression angibt. Mögliche Werte sind:
|
| UnknownCompressionMethodException | Wird geworfen, wenn type einen ungültigen Wert enthält. |
| void ppl7::PFPFile::setCopyright | ( | const String & | copy | ) |
Mit dieser Funktion wird automatisch ein Copyright-Chunk ("COPY") angelegt. Dabei ist sichergestellt, dass der Chunk nur ein einziges mal in der Datei vorkommt.
| void ppl7::PFPFile::setDescription | ( | const String & | descr | ) |
Mit dieser Funktion wird automatisch ein Description-Chunk ("DESC") angelegt. Dabei ist sichergestellt, dass der Chunk nur ein einziges mal in der Datei vorkommt.
| void ppl7::PFPFile::setId | ( | const String & | id | ) |
Mit dieser Version wird die ID des PFP-Files festgelegt. Eine ID muss zwingend 4 Byte lang sein und darf nur US-ASCII-Zeichen enthalten.
| IllegalArgumentException | Wird geworfen, wenn die id einen ungültigen Wert enthält |
| void ppl7::PFPFile::setName | ( | const String & | name | ) |
| void ppl7::PFPFile::setVersion | ( | int | main = 0, |
| int | sub = 0 |
||
| ) |
| main | Hauptversion, Wert zwischen 0 und 255 |
| sub | Unterversion, Wert zwischen 0 und 255 |
| IllegalArgumentException | Wird geworfen, wenn main oder sub ausserhalb des gültigen Bereichs liegen. |
|
private |
|
private |
In dieser Variable wird die Art der Komprimierung gespeichert:
|
private |
|
private |
| Mutex ppl7::PFPFile::myMutex |
|
private |