Hirdetés

Alkalmazásfejlesztés badára: Letöltés

Bevezetés

A mai bejegyzésben egy fájlok letöltésére alkalmas osztályt fogunk írni, amellyel az előző bejegyzésben elkezdett primitív kis alkalmazásunkat bővítjük ki. A dolog lényege egy olyan osztály elkészítése, amely egy adott URL-ről le képes tölteni az ott található erőforrást, majd elmenti azt a a telefon memóriájában megadott helyre.

Hogy néz ki mindez bada alatt?

Mivel egy speciális névtér (Net::Http) függvényeit fogjuk használni, először is hozzá kell adnunk az ehhez kötődő privilégiumokat a manifest.xml-hez. Ezt megtehetjük a bada fejlesztői oldalon keresztül, vagy pedig az alábbi sorokat a projekthez tartozó manifestbe gépelve (utóbbi módszert alkalmazva csak az 1.2-es SDK alatti verziókkal tudunk a telefonon is tesztelni).

Az algoritmus lényege dióhéjban: először el kell indítani a letöltést, majd hozzá kell rendelnünk egy speciális listenert. Maga a letöltési (vagy bármi más, HTTP-vel kapcsolatos) folyamat kvázi a háttérben fut, a vele kapcsolatos eseményeket pedig a listener osztályunk kezeli le, mint a letöltés befejezését, a megszakítást, a validációt stb.

Először a listener osztályunkat fogjuk megírni, amelynek meg kell valósítania az Osp::Net::Http::IHttpTransactionEventListener interfészt (részletes leírás itt olvasható), amely az egyes állapotok kezelését ellátó függvények csonkjait tartalmazza. Ez hat visszatérési érték nélküli függvényt tartalmaz:

  • OnTransactionAborted: megszakítás esetén
  • OnTransactionCompleted: befejezett tranzakció esetén
  • OnTransactionCertVerificationRequiredN: ellenőrzésre
  • OnTransactionHeaderCompleted: ha megvan a válasz header része
  • OnTransactionReadyToRead: ha a body rész van meg
  • OnTransactionReadyToWrite: request kiegészítésre

Ami nekünk fontos (a mai bejegyzésben legalábbis eltekintünk az egyéb eseményektől), az az OnTransactionReadyToRead, ami azt jelzi, hogy megérkezett az általunk megadott álomány body része, azaz fájlba menthetjük a válasz tartalmát, így a metódust ki kell bővítenünk egy mentési algoritmussal. A bemenő paraméterként kapott HttpTransaction referenciától el kell kérnünk a választ (HttpResponse), amelytől elkérhetjük a tranzakció státuszát és magát a válasz törzsét is. Előbbi azért szükséges, mert ha az értéke nem NET_HTTP_STATUS_OK, akkor valamilyen hiba lépett fel az algoritmus folyamán, így inkonzisztens választ kaptunk, ergo értelmetlen tovább folytatni a procedúrát.

Ha a válasz megfelelő, le kell mentenünk a törzsét (body), amelynek értékét egy ByteBuffer* típusú változó hordozza, ezt egy egyszerű fájlba írással meg lehet tenni. A bada alkalmazások alapértelmezett esetben csak a saját /home/ könyvtárukba írhatnak, a memória egyéb részeire nem (illetve néhány helyre igen, ehhez az Osp::Media megfelelő privilégiumait kell kihasználni), tehát mentési helynek értelemszerűen a /Home/ könyvtáron belül kell gondolkodnunk. Megadhatunk további alkönyvtárakat is (például /home/al/), ilyenkor érdemes igazra billenteni a file construct() függvényének utolsó bemenőjét, ekkor a nem létező alkönytárakat automatikusan megkreálja a rendszer.

Készen vagyunk a saját listener osztályunkkal, most már csak a letöltést kell elindítanunk (és persze hozzá kell rendelnünk az imént megírt figyelőt). Először létre kell hoznunk egy HttpSessiont, amelyen keresztül az adatforgalmat fogjuk bonyolítani. A badában egyébként maximum hat ilyen lehet egyszerre aktív alkalmazásonként, erre érdemes odafigyelni. A Construct függvénye négy bemenőt vár, ebből az első és a harmadik az érdekes számunkra. Előbbi az úgynevezett NetHttpSessionMode, ami a párhuzamos kapcsolatok kezelésének kérdésére fókuszál; NET_HTTP_SESSION_MODE_NORMAL esetben egyszerre csak egy tranzakciót kezel a rendszer, NET_HTTP_SESSION_MODE_PIPELINING módot használva pedig párhuzamosan folyik a letöltés. Az említett harmadik paraméter pedig az URL, azaz az elérni szándékozott állomány címe.

Ez után meg kell nyitni a tranzakciót (OpenTransactionN() metódus), majd hozzá kell rendelnünk az előzőleg megírt listener osztályunk egy példányát (erre a AddHttpTransactionListener() függvény szolgál). A következő feadatunk a request lekérése (GetRequest() funkció), majd be kell álítanunk néhány paramétert (URL és a kérés típusa, utóbbi a mi esetünkben NET_HTTP_METHOD_GET lesz). Az utolsó lépés a tranzakció elindítása a Submit() függvénnyel, ez után már nincs más dolgunk, mint hátradőlni és várni, amíg be nem fejeződik a letöltés.

A példaalkalmazás az előző bejegyzés során elkészített program bővítése, indításkor letölt egy xml fájlt, majd ennek a tartalmát listaként megjeleníti. A beépített OptionKey menün keresztül rá is lehet frissíteni, ekkor az alkalmazás először letölti az xml-t, majd pedig a listát frissíti. A program természetesen ismét elérhető a Mobilarénás SVN-ből, a múlt heti projektet kell újfent kicsekkelni.

dr. Kind

Azóta történt

Előzmények