400 likes | 576 Views
Symbian ohjelmointi. 2. Luento Juha Turunen (juha.turunen@lut.fi). Sisältö. Deskriptorit Dynaamiset tietorakenteet DLL Tiedostojärjestelmä. Deskriptorit. Deskriptorit ovat perusluokkia Symbian OS:ssa Deskriptorit kapseloivat tavan säilyttää ja käsitellä teksti- tai binäärimuotoista dataa
E N D
Symbian ohjelmointi • 2. Luento • Juha Turunen (juha.turunen@lut.fi)
Sisältö • Deskriptorit • Dynaamiset tietorakenteet • DLL • Tiedostojärjestelmä
Deskriptorit • Deskriptorit ovat perusluokkia Symbian OS:ssa • Deskriptorit kapseloivat tavan säilyttää ja käsitellä teksti- tai binäärimuotoista dataa • Java: String • C: str*() ilman null terminationia • STL: string • Deskriptorien käyttö suojaa tahattomilta muistialueen ylityksiltä ja muilta virhetilanteilta • Tietoturva • Deskriptoriluokkia on useita erilaisia, mutta ne kaikki periytyvät yhteisestä kantaluokasta
ASCII & UNICODE • ASCII vs. UNICODE • Kaikista deskriptoriluokista on 8- ja 16-bittiset variantit • Variantti valitaan käännösaikaisesti (e32def.h) • Merkkijonoja varten käytetään käännösaikaisesti valittua varianttia (TDesC, TDes, TPtr, jne...) • Binääridataa varten käytetään luonnollisesti 8-bittistä varianttia (TDesC8, TDes8, jne...) typedef TPtrC16 TPtrC #if defined (_UNICODE) else ... typedef TPtrC8 TPtrC
Deskriptorien terminologia • Length • Kuinka monta tietoalkiota deskriptori sisältää • Size • Kuinka monta tavua validia dataa deskriptori sisältää • ASCII vs. UNICODE • Maximum length • Kuinka monta tietoalkiota maksimissaan kyseinen deskriptori voi sisältää • Buffer • Pala muistia, jossa deskriptorin sisältämä data säilytetään • Stackissa tai heapissa riippuen deskriptorin tyypistä
B L A H Esimerkkideskriptori • Length = 4 • Maximum length = 8 • Size = 4 tai 8 (ASCII vs. UNICODE)
Puskuriylivuoto ongelma • Kaikki deskriptorit sisältävät pituudesta ja maksimipituudesta => • Mahdotonta alustaa deskriptori datalla jonka pituus ylittää maksimipituuden • Mahdotonta kopioida deskriptoriin dataa jonka pituus ylittää maksimipituuden • Mahdotonta muokata deskriptoria siten että datan pituus ylittää maksimipituuden • Virhetilanteet aiheuttavat panicin
_LIT makro • _LIT makrolla luodaan literaaleja, jotka sisältävät muuttumatonta dataa • TLit8 TLit16 • TLit luokille on määritelty muunnosoperaattori deskriptoriksi (TDesC&), joten niitä voidaan käyttää deskriptorien asemasta • _LIT( KSymbianProgramming, ”aaargh” ); • Literaalia ei voi muokata! • _LIT( KSomeText, ”puuroa!” ); • void SomeMethodL( const TDesC& aString ); • SomeMethodL( KSomeText ); // This is OK
Deskriptorien luokkahierarkia TDesC iLength Ptr() TDes Length() iMaxLength TBufCBase MaxLength() TBufC<n> TBuf<n> TPtr TPtrC HBufC iPtr iBuf : TText[n] iPtr iBuf : TText[n]
Deskriptorikantaluokat • TDesC • Kaikkien deskriptorien kantaluokka • Kaikille deskriptoreille yhteiset metodit • C = constant • Ei voi muokata • TDes • Laajentaa TDesC:n määrittelemää toiminnallisuutta lisäämällä datan muokkaukseen tarvittavat metodit • MaxLength • Molemmat kantaluokat ovat abstrakteja => niistä ei voi luoda instansseja
Konkreetit deskriptoriluokat • TBufC • Buffer deskriptori • Ei muokattava • TBuf • Buffer deskriptori • Muokattava • TPtrC • Pointer deskriptori • Ei muokattava • TPtr • Pointer deskriptori • Muokattava • HBufC • Heap deskriptori • Ei suoraan muokattava • Ei stackiin!
Buffer-deskriptori • Luokka itsessään sisältää bufferin eli muistin johon data sijoitetaan • class NonSymbianSomething { • private: • char [10] buffer; • };
TBufC • Bufferi deskriptori > luokka itsessään sisältää bufferin • Templaattiluokka jonka templaattiparametri määrittää bufferin koon. • esim. TBufC< 42 > myDescriptor; • Sisältö voidaan asettaa ainoastaan joko konstruktorissa tai sijoitusoperaattorilla • Jos deskriptori on liian pieni => panic • _LIT( KHello, ”Hi!” ); • _LIT( KMoi, ”Moro” ); • TBufC greeting( KHello ); // constr. init • greeting = KMoi; // Assignment operator iLength buffer
TBuf • Bufferi deskriptori => luokka itsessään sisältää bufferin • Templaattiparametri määrittää maksimikoon • Deskriptori voi olla enintään iMaxLength pituinen • Sisältöä voi muokata • Toteuttaa TDes –luokan määrittelemät metodit iLength iMaxLength buffer
Pointer-deskriptori • Pointer-deskriptori ei omista eikä sisällä itse dataa vaan osoittaa jonkun muun omistamaa dataa • Jos dataa muokataan pointer-deskriptorin kautta, muuttuu luonnollisesti myös datan omistavan deskriptorin sisältö • class NonSymbianOwningSomething { • private: • char* buffer; • };
TPtrC • Pointer-deskriptori • Osoittaa ulkopuolista dataa • Ei mahdollisuutta muokata (C) • Set() • Huom! Jos osoitettu data lakkaa olemasta validia, ei deskriptoria voi enää käyttää _LIT( KJep, ”Juu” ); TBuf<8> myDesc; myDesc.Copy( KJep ); TPtrC pointer( myDesc ); iLength iPtr buffer
TPtr • Pointer-deskriptori • Osoittaa ulkopuolista dataa • Datan muokkaaminen mahdollista • Huom! Jos osoitettu lakkaa olemasta validia, lakkaa myös TPtr olio olemasta validi _LIT( KJep, ”Juu” ); _LIT( KJoo, ”joo” ); TBuf<8> myDesc; myDesc.Copy( KJep ); TPtr pointer( myDesc ); pointer.Append( KJoo ); iLength iMaxLength iPtr buffer
HBufC • Heap-deskriptori • Sisältää oman bufferinsa • Varataan ainoastaan heapista! • Käytetään isoille määrille dataa • Muokkaus onnistuu hankkimalla pointer-deskriptori dataan ja muokkaamalla dataa sen avulla • Des() HBufC* myBuf = HBufC::NewL( 50 ); TPtr ptr( myBuf->Des() ); ptr->Copy( KJep ); ptr->Append( KZap ); ... iLength buffer
Ohjeita deskriptorin valintaan • TBuf/TBufC • Pieni määrä dataa • Myös suuri määrä OK heapista varatun olion jäsenmuuttujana • Maksimikoko tiedossa jo käännösaikaisesti • Yleensä stackista väliaikaiseen käyttöön • TPtr/TPtrC • Jo olemassa olevaan dataan viittaaminen tai käsittely • Säästää muistia koska turhia kopioita ei synny • Kätevä esim. parsimisessa • TPtr HBufC:n sisällön muokkaamiseen • HBufC • Suuri koko • Maksimikoko ei tiedossa käännösaikaisesti
Yhteenveto deskriptoreista • Tarjoavat turvallisen tavan käsitellä ja osoittaa teksti- ja binäärimuotoista dataa • ASCII vs. UNICODE • TBuf, TBufC, TPtr, TPtrC voidaan varata stackista tai käyttää jäsenmuuttujina by value • HBufC – suuret määrät dataa, varataan heapista • TDesC metodit käytettävissä kaikilla deskriptoreilla • Käytä metodien argumentteina TDesC tai TDes luokkien viittauksia
Dynaamiset taulukot • Symbian OS tarjoaa turvallisen tavan käsitellä taulukko/lista muotoista dataa • Valmiita taulukkoluokkia käyttämällä vältyt vahingoilta • Templaattiluokkia -> voidaan soveltaa minkä tahansa luokan kanssa
Flat vs. Segment • Flat • Muisti varataan kerralla ja kaikki alkiot sijaitsevat samassa varatussa muistisolussa • Jos koko kasvaa yli kapasiteetin, varataan enemmän muistia ja kopioidaan data sinne • Segmented • Muistia varataan tarvittaessa lisää segmentti kerrallaan • Segmentit ovat linkitetty yhteen • Valintaan vaikuttavat tekijät • Kuinka usein tarvitsee lisätä tai tuhota alkioita taulukon keskelle • Onko alkioihin viittaaminen aikakriittistä? • Kuinka usein taulukon koko muuttuu?
Taulukkoalkiot • Taulukon sisältämä alkio määritellään taulukkoluokan templaattiparametrilla • Esim: CArrayPtrSeg<CMyClass> • Yleensä alkiot osoittimia olioihin, mutta taulukko voi myös sisältää oliot • Fixed vs. variable alkiot • Fixed: taulukon oma bufferi pitää sisällään alkiot (vrt. TBuf) • Variable: taulukon jokainen alkio sijaitsee erikseen sille varatussa muistisolussa ja taulukko sisältää osoittimet olioihin
Taulukkojen terminologiaa • Kapasiteetti (capacity) • Tämän hetkinen taulukon koko alkioissa mitattuna • Granulariteett (granularity) • Jos kapasiteetti ylitetään, kuinka monelle uudelle alkiolle varataan tilaa kerrallaan
Konkreetit taulukkoluokat • Alkiot omassa bufferissa • CArrayFixFlat<Class T> • CArrayFixSeg< Class T> • CArrayPakFlat<Class T> • Alkiot omissa heap soluisssa ( taulukko sisältää pointterit ) • CArrayVarFlat<Class T> • CArrayVarSeg< Class T> • Fix = fixed length, Var = variable length, Pak = packed • Kts edelliset kalvot. • Flat = flat , Seg = segmented • Kts edelliset kalvot.
segmentit linkitetty toisiinsa muodostaen jatkuvan listan element_n element_n + 1 element_n + 3 element_n+4 element_n + 5 CArrayFixSeg<Class T>
segmentit linkitetty toisiinsa muodostaen jatkuvan listan element_n element_n+1 element_n+3 element_n+4 element_n+5 CArrayVarSeg<Class T>
Mikä on DLL? • Dynamic Link Library • Ladataan dynaamisesti muistiin • ROM:lla sijaitsevia DLL:ja voidaan ajaa suoraan ROM:lta • Kuitenkin vain mikäli on käytetty NOR flashia • Exportointi • DLL: n rakenne • Constant static data • Exportoidut funktiot • Export table • Järjestysnumero->osoite mapping • E32Dll( )
DLL • Static interface DLL • Yksi tai useampi exportoitu funktio • .h tiedosto määrittää rajapinnan (compile-time) • .lib tiedosto metodi->ordinaali mapping (link-time) • .dll tiedosto sisältää ajettavan koodin (run-time) • Polymorphic interface DLL • Sisältää yhden tai useamman määritellyn exportin • DLL: n käyttäjä saa export in kautta instanssin luokkaan, jonka kautta komponenttia käytetään • Pluginit • Symbian GUI applikaatiot ( .app) ovat polymorfisia DLL:ja
DLL käytännössä • Funktioden kutsuminen DLL: sta • #include <header.h> • MMP- filessä: LIBRARY MyDll.lib • DLL: n luominen • MMP- filessä • TARGET MyDll.dll • TARGETTYPE DLL • UID 0x1000008d KMyDllUid • Kääntäjä luo .lib-tiedoston
Dll käytännössä • Funktio, jota halutaan kutsua DLL:n ulkopuolelta pitää exportoida • Makrot: EXPORT_C ja IMPORT_C • Headerissa (.h) class MyClass { public: IMPORT_C void DoSomething(); private: void SomethingElse(); }; • Koodissa (.cpp) EXPORT_C void MyClass::DoSomething() { // blah blah }
DLL:sta saatavat hyödyt • Tehokas muistin käyttö • DLL tarvitsee ladata vain kerran vaikka käyttäjiä olisi useampi • Koodin uudelleenkäyttö • Työn säästö • Tilan säästö • Kapselointi • Polymorfisilla DLL:lla plugin-arkkitehtuurit
User Library File Server Kernel Device Drivers Tiedostojärjestelmä F32 • Hoitaa ohjelmien lataamisen Kernelille • Server • Tarjoaa • Tiedostot ja hakemistot • Drivet • Tiedostonimien parsinta • Streamit
Tiedostojärjestelmä • VFAT • Tiedostonimet • DOS/Windows tyyliset tiedostonimet • ”c:\nokia\images\pic.jpg” • . ja .. eivät tuettuja • Tukee erillaisia mediatyyppejä • ROM • FLASH RAM • MMC • CF
File Server RFs Session App File server session • RFs luokka kapseloi session • Yhteys clientilta file serverille • Yhdellä threadilla voi olla useita yhtäaikaisia sessioita auki • Päätoiminnot • Tiedonsiirto • Tiedostojen ja hakemistojen hallinta