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

    Caff.cpp_infer_log

  • CaffParser.cpp

    CaffParser.cpp_infer_log

  • Ciff.cpp

    Ciff.cpp_infer_log

  • main.cpp

    main.cpp_infer_log

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. valgrind_log