symbian alapú szoftverfejlesztés

55
Symbian alapú szoftverfejlesztés ELTE PSZT – 2008. november

Upload: winter-owens

Post on 02-Jan-2016

21 views

Category:

Documents


2 download

DESCRIPTION

Symbian alapú szoftverfejlesztés. ELTE PSZT – 2008. november. Symbian operációs rendszer. SIBO – Psion Computers (1980) EPOC - irodai kisszámítógép (1980-1998) Symbian OS – (alapítva 1998 : Nokia, Motorola, Psion, Ericsson, 2002: Sony-Ericssson , Siemens) - PowerPoint PPT Presentation

TRANSCRIPT

Symbian alap szoftverfejleszts

Symbian alap szoftverfejlesztsELTE PSZT 2008. novemberSymbian opercis rendszerSIBO Psion Computers (1980)EPOC - irodai kisszmtgp (1980-1998)Symbian OS (alaptva 1998 : Nokia, Motorola, Psion, Ericsson, 2002: Sony-Ericssson, Siemens)Mrfldk: 2000-ben megjelent 6.0-s verzi

Segdanyagokwww.symbian.com/bookswww.symbian.com/developerwww.symbian.developer/public/index.htmlhttp://forum.nokia.com/main.htmlSDK online dokumentci: C:\S60\devices\S60_3rd_FP2_SDK_v1.1\docs\eclipse.exeOnline dokumentci

Okos telefonokers processzornagymret kijelzviszonylag nagy memriainformci kezel programokegyni alkalmazsok

egyszer kezelhetsgmegbzhatsgerforrsaival nem pazarl (memria, szolgltatsok, energia fogyaszts)gyors reakciidfolyamatos zemmdElvrosokmegbzhatnincs adatvesztsnem dobja el a vonalatoptimlis a memria felhasznlsnincs memria szivrgsminden hibt rtelmesen kezelnyitott a kls fejlesztsek irnybaSymbian OS felptseJavaAlkalmazs szint szolgltatsokOpercis rendszer szolgltatsaiAlap-szolgltatsokKernel s hardware integrciMIDPCLDCJVMFelhasznli interfsz szinkronizciUI alkalmazs keretrendszerUI eszkz-kszletPIM

zenet-kezelsBngszs

Adat-szinkronltalnosszolgltatsokKommunikcis szolgltatsokGrafikai szolgltatsokPC-s kapcsolat szolgltatsaiAlacsonyszintszolgltatsokFjlszerver

Kernel szolgltatsokEszkzmeghajtk

A fejleszts alapelemeiSymbian C++ sajtossgokElnevezsi konvencikKivtel- s memriakezelsAlaptpusok, sztringek, tmbkThinTemplate mintaHibakezels mdjaAszinkron kezels (ActiveObject)Symbian C++ sajtossgokNincs kivtel. Helyette: TRAP s User::LeaveNincs RTTI (dinamikus castols nem megengedett)Kdolsi mintk a memriaszivrgs kiszrsre: ktfzis konstrukci, CleanUpStackSajt elnevezsi konvencik:nem a vltoz tpusa, hanem szerepe szerint trtnik az elnevezs (T,C,R,M)memriakezels segtse fggvnynevekkel: prefixek, postfixek

Symbian C++ sajtossgokNincs STL, helyette sajt generikus adatszerkezeteket hasznlString helyett deszkriptorokTbbszlsg kezelse: ActiveObject, ThreadTemplate-ek hasznlata: ThinTemplateElnevezsi konvencikltalnos szablyokOsztlyok (T,C,M,R)Egyb tpusokVltozkMetdusokOsztlydeklarcik elhelyezkedseltalnos szablyokTpusok, vltozk, metdusokAngol nv, amerikai angol rsmd (Color, Colour)Szavakat egybe rjuk, minden szt nagybetvel kezdnkOsztlynevek: fnevek; metdusnevek: igkNv vgn konvenci szerinti zrbet (L, LC, LD)T osztlyok (Type)Egyszer tpusokNem trolnak heapen objektumokatNincs szksgk destruktorra (az alaprtelmezett j)Msol konstruktort s rtkad opertort is ritkn hasznlLegtbbszr a stack-en foglal helyet

Nem ignyelnek destruktort, ezrt nem problma, ha nem kerl vgrehajtsra (leavels).T osztlyok - plda

C osztlyok (Class)Bonyolultabb funkcionalits osztlyoksosztlya a CBaseVirtulis destruktorral KELL rendelkeznie (memria felszabadts)Tagvltozk automatikusan kinullzdnakBirtokolnak heapen trolt objektumokat (memriakezels!)Fggvnyhvsnl referenciaknt, vagy pointerknt adjuk t (nem ignyelmsol konstruktort vagy rtkad opertort)

A destruktor hvst minden esetben biztostani kell.

R osztlyok (Resource)Valamilyen szerves szer program ltal biztostott erforrsra tartalmaznak azonostt. (Pl. az RFile osztly az RFS osztly erforrst hasznlja )Azonost miatt helyet foglalhatnak a stack-en isA felszabadts az erforrst birtokl objektum (szerver) dolgaSzl befejezdsekor automatikusan felszabadulFoglals: Open, Create, AllocateElengeds: Close, Destroy, Free

R osztlyok - plda

M osztlyok (Mixin)Interfsz, absztrakt protokollC++: absztrakt osztlyokCsak virtulis metdusuk van, legtbbszr implementci nlklSzigor tbbszrs rklds: egy C osztly csak egy msik C osztlybl s tbb M osztlybl rklhet (ugyanabbl az M osztlybl csak egyszer)Osztlytpusok - sszefoglalsT: egyszer tpus; nincs destruktora; csak T-bl, vagy M-bl rkldhet; rtkknt tadhat; stack-en trolhatC: csak a heapen foglalhat; van destruktora; pontosan egy C s tetszleges M osztlybl szrmazhat; nem adhat t rtkkntM: interfsz; csak virtulis metdusok; nincsenek tagvltozk; nem pldnyosthatR: erforrs, melyet meg kell nyitni s be kell zrniKivtelek, egyb tpusokS: tagfggvny nlkli struktrkStatikus osztlyok: User, Math, MemH: HBufCD: Kernel oldali osztlyokE: felorolsok(enum)K: Konstansoki: tagvltozk (pl. iNum)a: argumentumok (pl.: void SetNumber (TInt aNumber);)

MetdusokLekrdez s bellt metdusokiNum tagvltozhoz Num() lekrdez SetNum() bellt metdusBonyolultabb lekrdezshez GetNum();Kilp metdusok (Leavel)Azok a metdusok, amelyek kzvetlenl vagy kzvetve User::Leave hvst eredmnyezhetnekLehetsges vgzdsek: L, LC, LDOsztlydeklarcik - egyezmnyekpublic, protected, private: mindig ki kell rniSorrend: tagfggvnyek, tagvltozkMetdusok argumentumait a deklarciban is ki kell rniAz sosztly virtulis metdusait kln csoportostjuk, megjellve, honnan rkldtekHa sok inline fggvny van, kln fjlba kell helyezniKivtelkezelsMemriakezelsHibakezelsDinamikus objektumok - heapMinden szl rendelkezik sajt heap terlettelSymbian OS alatt a CBase osztlyok pldnyait a heap-en helyezzk elAz osztly adattagjai ltrejttkkor kinullzdnakA virtulis destruktor biztostja, hogy a felszabadts helyesen megtrtnjenKivtelkezels, memriakezelsKivtelkezelsi konvencikCleanup StackKtfzis konstruktorKivtelkezelsA Symbian eldjnek fejlesztsekor a C++ fordtk nem ismertk a kivtelkezelstA C++ kivtelek tbblet memrit s tbb szmtst ignyelnekSymbian: egy-kt konvenci kisebb erforrs ignyObjektum automatikus ltrehozsa a stack-en

Objektum ltrehozsa a heapen plda

Hiba esetn abbahagyja a vgrehajtst.Trap Harrness s Leave

Kivtelkezelsi konvencikC++SymbianThrowCatchFggvnydeklarci: Thrownew opertor: 0-t ad visszaUser::LeaveTRAP, TRAPDzr Lnew (ELeave): kivtelt dob, ha nincs memriaKivtelkezels C++-banHa kivtelkezels trtnikA program stack visszafejtsre kerl a catch szintjigAz objektumok destruktorai meghvdnakA mutatk elvesznek (esetleg smart pointert lehet hasznlni)

int efloat dObject cObject *bint *aSomeThing exKivtelkezels C++-banHa kivtelkezels trtnikA program stack visszafejtsre kerl a catch szintjigAz objektumok destruktorai meghvdnakA mutatk elvesznek (esetleg smart pointert lehet hasznlni)

int efloat dObject cObject *bint *aSomeThing exKivtelkezels C++-banHa kivtelkezels trtnikA program stack visszafejtsre kerl a catch szintjigAz objektumok destruktorai meghvdnakA mutatk elvesznek (esetleg smart pointert lehet hasznlni)

float dObject cObject *bint *aSomeThing exKivtelkezels C++-banHa kivtelkezels trtnikA program stack visszafejtsre kerl a catch szintjigAz objektumok destruktorai meghvdnakA mutatk elvesznek (esetleg smart pointert lehet hasznlni)

Object c : ~ObjectObject *bint *aSomeThing exKivtelkezels C++-banHa kivtelkezels trtnikA program stack visszafejtsre kerl a catch szintjigAz objektumok destruktorai meghvdnakA mutatk elvesznek (esetleg smart pointert lehet hasznlni)

Object *b (Elveszett: sizeof(Object) leak)int *aSomeThing exKivtelkezels C++-banHa kivtelkezels trtnikA program stack visszafejtsre kerl a catch szintjigAz objektumok destruktorai meghvdnakA mutatk elvesznek (esetleg smart pointert lehet hasznlni)

Object *b (Elveszett)int *a (Elveszett)SomeThing exsizeof(Object) + sizeof(int) mret memriaszivrgs.Symbian C++ hibakezelsNincs C++ kivtelNincs veremvisszafejtsDestruktorokat nem hvja megEgsz szmot lehet eldobni s elkapnistackCleanupStackint efloat dObject cObject *bObject cc.Finalize()int *aObject *bdelete bint ecodint *afree(a)Hibakezels - LeaveA Symbianban a hiba kezelsre a User knyvtr Leave metdusa szolgl. Az olyan fggvnyeket, amelyek a User::Leave metdust hvjk leave-el fggvnyeknek nevezzk.Minden leave-el fggvny neve L betre vgzdik.Mikor leave-elhet egy fggvny?

Ha kzvetlenl meghvja a User::Leave() fggvnytHeapen foglal helyet new (ELeave) metdussalMs leave-el fggvnyt hv.

Hibakezels + Leave

Leave kezelse TRAP segtsgvel.Tbb fggvnyhvs esetn mindegyiket bele kellene tenni egy TRAP konstrukciba.A CleanupStack hasznlata egyszersti ezeket a fggvnyhvsokat.CleanupStack

A UseL() fggvny memrit foglal s leave-elhet.Az x automatikus vltoz a heap-re mutat. Ha UseL() leave-el, akkor a delete nem hajtdik vgre, a CX ltal lefoglalt terlet rvn marad.

A CX helyfoglalsa utn a r mutat pointert elhelyezzk a Cleannup Stack-enHa UseL() nem leave-el, akkor MI szedjk le a cmet a stackrl.Ha UseL() leave-el, akkor a Laeve kezel eljrs.CleanupStack alkalmazsa

Egyszerre tbb elemet is leemelhetnk a stackrl.

Pointert tartalmaz adattagot ne tegynk a CleanupStack-re. Az ltala mutatott terlet felszabadtsa az adattagot tartalmaz osztly feladata, nem a Leave-el mechanizmus.Tilos!!A PushL() nem leave-el (elrefoglals miatt)Ktfzis konstrukciKtfzis konstrukci

Problma: A CY pldnyostsakor a CY konstruktora leave-el!Ktfzis konstrukci

Ktfzis konstrukciA konstruktort kt rszre bontjuk:1. rsz: Biztonsgos, nem leave-el a pldnyra mutat pointer biztosan felkerl a CleanupStack-re2. rsz: A veszlyesebb leave-el rsz. De ekkor mr j helyen van a pointer.Ktfzis konstrukci

A kt fzist a NewL, NewLC fggvnyekbe becsomagoljk.Ktfzis konstrukci - sszefoglalsAz osztly standard konstruktorban nem hvunk leave-el kdotA leave-el hvsokat egy kln msodik fzis konstruktorba tesszk. (ConstructL)Az osztly pldnyostsakor:

Meghvjuk a standard konstruktort (new)A flig ltrejtt objektumot feltesszk a CleanupStack-reMeghvjuk a msodik fzis konstruktort (ConstructL)(Levesszk a CleanupStack-rl)A kt fzist a NewL, NewLC fggvnyekbe becsomagoljk.TagvltozkAmikor egy osztly tagvltozt hozunk ltre a heapen, akkor azt nem szabad feltenni a CleanupStack-re!!Leave esetn meghvdik a gazda osztly destruktora s az trli a tagvltoztHa emellett a CleanupStack-en is fenn lenne a tagvltoz, akkor ktszer prbln trlni, ami HIBA.Kdhatkonysg. ThinTemplate

Hibk elleni vdekezs_ASSERT_ALWAYS_ASSERT_DEBUGUser::Panic_TEST_INVARIANT_UHEAP_MARK, _UHEAP_MARKENDAszinkron szolgltatsok, ActiveObjectAszinkron esemnyek: billenty lenyoms, i/o mvelet befejezdse, idztk jelzsei, Lpsek: Igny bejelentse vrakozs az esemnyre reagls az esemnyreActiveSheduler ActiveObject PrioritsOfferKeyEventLKliens-szerver keretrendszerfjlszerverablakkezel szerverkommunikc kezelsadatbzis-kezelshatridnaplA CServer osztlybl szrmaznak.Cleanup-safe HelloWorld

Konzolos alkalmazsnl a CleanupStack-et neknk kell ltrehozni.

Fjlkezels console alkalmazs

VgeTInt n;

enum TColors{KRed,KBlue};

class TMyNumber{public:

void SetNumber (TInt aNumber);TInt Number() const;private:TInt iNumber;};TInt doExampleL()

{RFs fSession;User::LeaveIfError(fSession.Connect());

RFile file;

TInt ret =file.Open(fSession,_L("C:\\resource\\apps\\second.txt"),EFileWrite);if(ret)ret =file.Create(fSession,_L("C:\\resource\\apps\\second.txt"),EFileWrite);if(!ret)file.Write(_L8("Write some new data"));

file.Close();

fSession.Close();

return ret;}void CMyClass::Foo(){TInt myInteger;TBufC buffer;. . .

//main body of the function

} //variables are 'lost' on exit from the functionLOCAL_C void MainL(){CMyClass* myPtr = new CMyClass;if(myPtr){myPtr->Foo(); //Can safely access data & functions}delete myPtr;}LOCAL_C void MainL(){CMyClass* myPtr = new (ELeave) CMyClass;myPtr->Foo();

. . .

delete myPtr;}void CMyClass::Foo(){TRAPD (error, HandleKeyL());if(error != KErrNone){//Ha a HandleKeyL() leave-el, //akkor ide addik a vezrls, //s lekezelhetjk a hibt}}

case ECleanupCmdUse3:{CX* x=new(ELeave) CX;TRAPD (error, x->UseL();if(error){delete x;User::Leave(error);}delete x;}case ECleanupCmdUse3:{CX* x=new(ELeave) CX;CleanupStack::PushL(x);x->UseL();x->UseL();x->UseL();CleanupStack::PopAndDestroy(x);}void CX::UseL(){TInt* pi=new(ELeave) TInt;delete pi;}

case ECleanupCmdUse3:{CX* x=new(ELeave) CX;x->UseL();delete x;}case ECleanupCmdUse3:{CX* x=new(ELeave) CX;CleanupStack::PushL(x);x->UseL();CleanupStack::PopAndDestroy(x);}case ECleanupCmdUse3:{CX* x1=new(ELeave) CX;CleanupStack::PushL(x1);CX* x2=new(ELeave) CX;CleanupStack::PushL(x2);x1-iX->UseL();CleanupStack::PopAndDestroy(); // y}class CX : public CBase{public:void UseL();public:TInt iInt;};void CX::UseL(){TInt* pi=new(ELeave) TInt;delete pi;}

class CY : public CBase{public:CY();~CY();public:CX* iX;};

CY::CY() // bad bad{iX=new(ELeave) CX;}

CY::~CY(){delete iX;}

{CY* y=new(ELeave) CY;CleanupStack::PushL(y);y->iX->UseL();CleanupStack::PopAndDestroy(); // y}class CX : public CBase{public:void UseL();public:TInt iInt;};void CX::UseL(){TInt* pi=new(ELeave) TInt;delete pi;}

CY* y;CY* temp = User::AllocL(sizeof(CY)); //Allocate memorytemp->CY::CY(); //C++ constructory=temp;

class CZ : public CBase{public:static CZ* NewL();static CZ* NewLC();void ConstructL();~CZ();public:CX* iX;};void CZ::ConstructL(){iX=new(ELeave) CX;}

CZ::~CZ(){delete iX;}

CZ* CZ::NewL(){CZ* self=new(ELeave) CZ;CleanupStack::PushL(self);self->ConstructL();CleanupStack::Pop();return self;}

CZ* CZ::NewLC(){CZ* self=new(ELeave) CZ;CleanupStack::PushL(self);self->ConstructL();return self;}//A nem template trol egyik metdusaCAlapTomb: public Cbase{const TAny* Elem(TInt index) const;};

// A template trol ugyanezen metdusaclass CTomb public CAlapTomb{inline const T& Elem (TInt aIndex) const{return (*((const T*) CalapTomb::Elem(aIndex)));}};int HelloWorldL(){CConsoleBase* console = Console::NewL(_L("Hello World"),TSize(KConsFullScreen,KConsFullScreen));console->Printf(KTxtMessage);console->Printf(KTxtPressAnyKey);console->Getch(); // get and ignore characterdelete console;return 0;}

TInt E32Main(){__UHEAP_MARK;CTrapCleanup* cleanup = CTrapCleanup::New();TInt retVal = KErrNone;if(cleanup){TRAP(retVal,HelloWorldL());__ASSERT_ALWAYS(!retVal, User::Panic(_L("Hello World Panic"),retVal));delete cleanup;}__UHEAP_MARKEND;return retVal;}int main(){ printf("Hello world!\n"; return 0;}TInt doExampleL(){RFs fSession;User::LeaveIfError(fSession.Connect());RFile file;TInt ret = file.Open(fSession,_L("C:\\resource\\apps\\second.txt"),EFileWrite);if(ret){ret = file.Create(fSession,_L("C:\\resource\\apps\\second.txt"),EFileWrite);}if(!ret){file.Write(_L8("Write some new data"));}file.Close();fSession.Close();return ret;}

TInt E32Main(){__UHEAP_MARK;CTrapCleanup* cleanup = CTrapCleanup::New();TInt retVal = KErrNone;if(cleanup){TRAP(retVal,doExampleL());__ASSERT_ALWAYS(!retVal, User::Panic(_L("Hello World Panic"), retVal));delete cleanup;}__UHEAP_MARKEND;return retVal;}int main(){ File* fp = fopen("file.txt",w); if (fp) fprintf(fp, "Write some data"); fclose(); return 0;}