03_Parser dokumentáció - Sa2x/FiukSzGHomework GitHub Wiki
A CAFF parser dokumentációja
A CAFF parser komponens valósítja meg a rendszer szempontjából a CAFF kiterjesztésű fájlok kezelését. A parser segítségével képesek vagyunk feldolgozni byte-onként a kapott adatokat, ezeket pedig megkonstruálni úgy, hogy vizuálisan megjeleníthető képfájlaink legyenek. A metaadatok kiolvasása a caff fájlokból megfelelően működik és a megkötések ellenőrzése is. Azonban az RGB adatok olvasásánál valami nem működik, mivel a kép szürke csíkokból áll. Az RGB adatok beolvasásán kívül jól működik a parser. A parser forráskódja megtalálható a parser kód github mappában.
A Caff parser felépítését a következőképp bontottuk szét:
- Caff.h
- Caff.cpp
- Ciff.h
- Ciff.cpp
- CaffParser.cpp
- CaffParser.h
- main.cpp
Caff.h (Caff osztály)
A Caff kiterjesztésű fájlok alapstruktúrája és azok szükséges adattagjainak felépítése. A Caff objektumok létrehozásához tartozó függvények fejléceit is tartalmazza, illetve a kiiratáshoz szükséges függvény törzsét is.
Caff.cpp
Caff-ok getter-eit és setter-eit tartalmazza.
CaffParser.cpp (CAFFParser osztály) metódusai:
parse
- A Caff fájlok parsolását összefogó függvény.
- Először a header-t olvassa be,elso 20 byte, ebbol ki kell nyernunk a num-anim-ot, utolso 8 byte (numanim+1)-szer parseBlock-ot(). Itt ellenőrizzük, hogy a magic "CAFF"-e.
parseBlock
- id alapjan eldonti, hogy parseCredits vagy parseAnimation
parseCredentials(blokkhossz)
- Első 6 byte feldolgozása ( 2-1-1-1-1) Ez a dátum.
- Ezután 8 byte-ot beolvasunk, ez lesz a creator nevének hossza és utána
- ezt a hosszt felhasználva pedig beolvassuk a következő creator_length hosszú részt. Ezzel előállítjuk a szignatúrát.
- Ebben a függvényben ellenőrizzük, hogy megfelelő hossznyi adatot olvastunk-e be.
parseAnimation
- Első 8 byte beolvasása, ez lesz a képkocka láthatóságának hossza miliszekundumban.
- Következő 4 byte a magic, erre csak vizsgálunk, hogy tényleg CIFF fájl-e.
- Utána 8 byte a header hossz, ezt le kell menteni, mivel vannak a headerben változó hosszú részek és ezzel lehet azokat kezelni.
- 24 byte olvasása (8-8-8) ezek a content size, Width, Height, ezeket lementjük, mivel csekkolni kell, hogy a content size = Width * Height * 3.
- Ezután beolvassuk a caption-t a \n-ig, számoljuk az olvasott byteokat.
- A tags része a következő hosszú: Header size - 36 - előbb beolvasott(caption rész). A kiszámolt számnyi byte-ot beolvassuk úgy, hogy folyamatosan byte-onként tároljuk a beolvasottat és a \0 beolvasásánál értelmezzük az eddig eltárolt részt és az lesz egy tag.
- Ezután jön a content olvasása ez WidthHeight3 hosszú rész lesz, ez maga egy RGB kódolt kép, ezt le kell mentenünk valahová.
Ezzel a parserral rengeteg meta adatot gyűjtünk ki és rendszerezünk és hozzá a képek pixeleit( byte sorban) és ezt küldjük ki a Java alkalmazásnak, ami majd ezt az információt kezeli és feldolgozza.
A parser tesztelése
A parser megfelelő működéséről tesztekkel bizonyosodtunk meg. A rendszer komponenseit statikusan az Infer eszközzel, dinamikusan pedig unit tesztekkel, vagy egyéb dinamikus keretrendszerekkel ellenőrizzük.
Infer
-
Caff.cpp
-
CaffParser.cpp
-
Ciff.cpp
-
main.cpp
Ahogy az Infer logokon is látszik, komoly probléma a statikus analízis során nem keletkezett. Az eszköz kettő hibát talált a CaffParser.cpp fájlban, ahol a függvényívások eredményei változókba kerültek tárolásra, amelyekkel aztán a külső függvény módosítás nélkül vissza is tért. Ezt ugyan az Infer hibának jelzi, valójában a helyes működés szempontjából nincs jelentősége, a változóba kiemelés az olvashatóságot segíti.
Valgrind
A Valgrind memóriaszivárgás tesztelő nem talált szivárgást a program futása során.