Upload
jonco
View
38
Download
0
Embed Size (px)
DESCRIPTION
Symbian ohjelmointi. 2. Luento Juha Turunen ([email protected]). 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 - PowerPoint PPT Presentation
Citation preview
TEKNIIKAN JA TALOUDEN YLIOPISTO
www.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ä
Esimerkkideskriptori
• Length = 4• Maximum length = 8• Size = 4 tai 8 (ASCII vs. UNICODE)
B L A H
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
TDesCiLengthPtr()Length()
TBufCBaseTDesiMaxLength
MaxLength()
TPtrCiPtr
TBufC<n>iBuf : TText[n]
HBufC TPtriPtr
TBuf<n>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.
CArrayFixFlat<Class T>
element_0 element_1 element_2
array buffer
CArrayFixSeg<Class T>
element_n element_n + 1 element_n + 3
segmentit linkitetty toisiinsamuodostaen jatkuvan listan
element_n+4 element_n + 5
CArrayVarFlat<Class T>
element_0 element_1 element_2
array buffer
CArrayVarSeg<Class T>
segmentit linkitetty toisiinsamuodostaen jatkuvan listan
element_n element_n+1 element_n+3
element_n+4 element_n+5
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:t
.dll
.exe DLLFunction call
Static interface DLL
.h .lib
Application
Polymorphic interface DLL
.app
.ldd
.pdd
two types
.h
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
Static interface DLL
Fn1()
Fn4()
123456...
code
Clientexecutable
X.dll
123456...
EXPORT_C void Fn1()
code
X.lib
exportstable
.
.
.
.
.
.EXPORT_C void Fn4()
X.h
IMPORT_C void Fn1()
IMPORT_C void Fn4()
#include "x.h"
.
.
.
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
Tiedostojärjestelmä F32
• Hoitaa ohjelmien lataamisen Kernelille• Server• Tarjoaa
– Tiedostot ja hakemistot– Drivet– Tiedostonimien parsinta– Streamit
UserLibrary
UserLibrary
FileServer
FileServer
KernelKernel DeviceDrivers
DeviceDrivers
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 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
RFsSession
FileServer
FileServer AppApp