Interfata Utilizator Universala Pentru Dispozitive Wireless Sincronizare Dispozitive

Cuprins

1. Introducere 5

Folosirea dispozitivelor mobile pentru cresterea productivitatii 6

Ce inseamna dispozitiv wireless si ce caracteristici are 7

2. Stadiul actual 11

2.1. Solutii existente. Avantaje/dezavantaje. 11

Air2Web 11

MODAL 12

OpenCOLA 12

2.2. Considerente economice 14

2.3. Comunicatii wireless – considerente tehnologice 15

3. Arhitectura sistemului 17

3.1. Prezentare continut prin HTML 22

3.2. Documente bine formate si XML 23

3.3. Stylesheeturi XSL/XSLT 24

3.4. Dispozitive wireless si WAP/WML 27

3.5. PalmOS: calitatea programelor si informatie offline 30

3.6. Windows CE 31

3.7. Symbian GT si generatia urmatoare de telefoane mobile 33

3.8. Tehnologie alternativa – iMode si cHtml 35

Compact HTML (cHTML) 38

3.9. Tehnologii WEB : JavaScript, VBScript, JSP, Servleti 39

4. Specificatii de proiectare 40

4.1. Prezentarea ideii 40

4.2. Specificatii din punctul de vedere al furnizorului de informatie 42

4.3. Specificatii din punctul de vedere al utilizatorului 44

4.4. Moduri de realizare 45

Transmiterea datelor 46

Formatul datelor de intrare 47

Metode de prelucrare a datelor de intrare 51

4.5. 4.5 Studiu comparativ al metodelor de realizare 54

5. Implementare si testare 55

Implementare solutie pentru dispozitive online fara memorie (wap/wml) 55

Implementare solutie pentru dispozitive offline cu posibilitate de stocare (palmOS) 60

6. Concluzii 72

7. Bibliografie 74

8. Anexa ………………………………………………………………………………………………………67

=== proiect ===

Cuprins

8. Anexa ………………………………………………………………………………………………………67

Introducere

Ideea de baza a proiectului a pornit de la necesitatea omului de a fii tot timpul informat. Astfel daca initial existau organizatoare pentru a stoca cateva lucruri simple (de la cateva numere de telefon la agenda zilnica sau informatii utile cand oamenii nu erau la birou), tehnologia in continua dezvoltare a permis miniaturizarea si depasirea barierelor impuse de acele organizatoare. Astfel au aparut primele deviceuri mobile. Acestea au rezolvat partial nevoia omului de a fii in permanenta in contact cu mediul de lucru si cu nevoia acestuia de a fii informat, stiut fiind faptul ca in zilele noastre informatia este cheia oricarei afaceri. Astfel daca initial totul a pornit de la nevoia de a controla starea unei afaceri, pe parcursul evolutiei s-a constatat ca acestea pot fi folosite si pentru inlocuirea mediilor clasice de informare sau chiar ca dispozitive de agrement. Aceasta a fost progresul firesc al dispozitivelor mobile.

Tendinta actuala este de a reduce dimensiunea dispozitivelor si de a accesa serviciile oferite de reteaua Internet. Astfel mai multe companii duc o lupta acerba de a-si promova propriile deviceuri , aceasta avand in vedere ca nu exista la momentul actual un standard in privinta sistemului de operare sau macar a interfetei din punct de vedere utilizator al acestora; astfel ca in functie de deviceul folosit aplicatiile folosite comunica chiar la un alt nivel ISO/OSI.

Impactul pe care il au aceste deviceuri este relevat de graficele urmatoare, grafice calculate in urma unor statistici efectuate in Statele Unite ale Americii, unde fenomenul Wireless are cei mai mult adepti, atat datorita marii dezvoltari tehnologice cat mai ales a pretului redus pe care acestea il au. Pretul in mare masura cat si facilitatile oferite de aceste deviceuri si puterea din ce in ce mai mare a procesoarelor cu care sunt dotate, fac din aceste deviceuri inlocuitoarele de maine ale calculatoarelor personale. Astfel pentru aceste dispozitive portabile au fot concepute aplicatii atat pentru uz personal ( de ex. jocuri sau agenda, scheduler, baza de date pentru parole sau cheltuielile de pe cardul de credit) cat si , mai nou, servicii legate de Internet. Astfel marii provideri de telefonie mobila (OmniSky) sau de echipamente de comunicatie (vezi. 3COM) au pus la punct protocoale noi pentru incapsularea si transmiterea datelor.

Astfel utilizatorii de deviceuri mobile din US au acces la o serie de sisteme de accesare a Internetului din locatii mobile : prin modemuri Omnisky, prin modemuri Ricochet, prin tehnologie Bluetooth sau chiar prin infrarosu.

Ideea de a realiza o interfata generica a venit astfel ca o consecinta fireasca a faptului ca exista mai multi producatori care nu intotdeauna sunt dispusi sa adere la standardele existente.Si asta cu atat mai mult cu cat aceste deviceuri sunt construite pe diverse arhitecturi/microprocesoare facand uneori imposibile chiar aceste lucruri.

Odata si cu dezvoltarea de noi tehnologii software s-a facut posibila creearea unor translatoare de la un tip de date la altul.

De asemenea odata cu dezvoltarea portalurilor Internet , adica a unor siteuri ce concentreaza informatia intr-un anumit domeniu a aparut nevoia de a putea lua acele informatii si citi de exemplu pe drum (in masina, in autobuz, in metrou). Astfel toate aceste lucruri au condus la incercarea de a realiza o metoda comuna si usoara atat posesorilor de portaluri cat si utilizatorilor de a creea/vedea informatiile oferite.

Folosirea dispozitivelor mobile pentru cresterea productivitatii

Structura afacerilor din ziua de azi continua din ce in ce mai mult sa se bazeze pe calculatoare si tehonologi de comunicare. Viteza de raspuns in cadrul afacerilor este esentiala si este singurul motiv pentru care companiile continua sa investeasca in tehnologi noi care sa le ofere ceva in plus fata de concurenta. Astfel companiile investesc in aplicatii care imbunatatesc comunicarea cu clientii, furnizorii, partenerii si angajatii.

Astazi viteza este cheia afacerilor. Procese care durau saptamani acum se intampla in zile, decizii care luau zile acum se iau in ore sau minute. Actiuni care iniante puteau astepta pana la sfarsitul unei zile de lucru cand angajatul de pe teren ajungea inapoi la birou sau directorul ajunge la hotelul unde e cazat dupa o zi de drum astazi nu mai pot astepta atat. Oamenii trebuie sa fie mult mai accesibili, oamenii de afaceri sa raspunda mult mai prompt cu ajutorul telefoanelor mobile , a pagerelor sau a dispozitivelor fara fir. Pentru fiecare angajat care se afla in teren un astfel de dispozitiv este necesar.

Cu toate acestea mare parte a dispozitivelor mobile din ziua de azi sunt folosite intr-un sens mult mai strict decat calculatoarele in general. Calculatoarele astazi sunt legate intr-o retea a companiei si au acces instantaneu la starea curenta a acesteia. Fie ca este vorba de aranjarea unei intalniri,de verificat inventarul sau de dat telefoane utilizatorii au nemvoie imediata la aceste date pentru a duce la bun sfarsit munca. Cu toate ca multi poseda dispozitive fara fir pentru a comunica , ei nu folosesc aceste dispozitive pentru a accesa datele companiei ci pentru a comunica cu oameni care au acces la aceste date. Este evident ca ar fi mult mai productiv pentru angajatul de pe teren sa aiba acces direct la datele companiei. Aceasta este acum posibila prin aplicatiile care ruleaza pe aceste dispozitive – fie ca sunt telefoane mobile, PDA sau pagere ca platforma de aplicatii.

Ce inseamna dispozitiv wireless si ce caracteristici are

Angajatii din teren au astazi la dispozitie mai multe deviceuri. Exista pagere (unidirectionale sau chiar bidirectionale), telefoane mobile care din ce in ce mai mult au browsere incluse, si PDA fara fir (PDA = asistent personal digital). Aceste dispozitive au cateva caracteristici comune si cateva particularitati de asemenea. De exemplu, toate aceste deviceuri sunt universal accesibile – fiecare angajat ce poseda asa ceva este accesibil prin el indiferent de locatia lui. Telefoanele sau pagerele pot sa-l alerteze pe angajat ca este cautat. Aceasta ofera un beneficiu substantial chiar si de ex. asupra aplicatiilor care ruleaza pe un calculator care in general nu pot atrage atentia unei persoane decat daca acestea ruleaza deja. Telefoanele pot sa ofere informatii despre locatia unei persoane si astfel sa-i dea informatii pe baza locatiei respective. Astfel daca angajatul isi stie locatia aceasta doar salveaza o parte din timpul de introducere a datelor, insa daca angajatul nu isi stie locatia este un avantaj evident.Concluzia este ca dispozitivele fara fir au un avantaj major asupra celor legate de un calculator. Intr-adevar dispozitivele mobile au si niste limitari insa aplicatiile care ofera avantajele lor unice pot compensa lipsurile.

In general multe din aplicatiile wireless pe care le vedem azi sunt orientate spre consumatorul obisnuit. Aceasta pentru ca aplicatiile sunt relativ simple si usor de implementat. Totusi, ca o cauza directa a evolutiei Internetului, oportunitatea de a aplica noile tehnologii wireless in afaceri depasesc cu mult piata consumatorului obisnuit.

Astfel Handheld-urile pot avea urmatoarele capabilitati :

Exista multe aplicatii ale acesora si anume :

managementul proiectelor

managementul timpului

controlul inventarului

logistica

managementul vanzarilor

service-ul

operatii de intretinere.

Numitorul comun al tuturor acestor aplicatii este faptul ca toate trebuie sa ofere utilizatorului informatii despre datele cerute. Problema cea mai des intalnita este ca fie din cauza stocului, fie din cauza pretului foarte dinamic al acestor echipamente o societate deseori se vede nevoita sa foloseasca mai multe astfel de dispozitive, cu protocoale total diferite, chiar si cu medii de transmisie diferite.

Astfel o platforma care sa ofere o interfata comuna, unic configurabila din punctul de vedere al sistemului care ofera sau este interogat pentru date devine necesara.

Stadiul actual

Solutii existente. Avantaje/dezavantaje.

Air2Web

Pe cat de simpla pare si este ideea, in momentul de fata exista pe piata o singura firma care ofera astfel de servicii pentru firme dispuse sa se adreseze unei audiente mai largi. In momentul in care am realizat faptul ca o astfel de solutie este usor implementabila trebuie amintit ca nu exista nici o firma pe piata. Existau doar versiuni diseparate de programe care converteau automat de la un tip de date (de preferat XML sau chiar HTML) la altul specific dispozitivelor mobile (WML sau PalmOS). Diferentele hardware mari dintre aceste dispozitive au facut ca o astfel de solutie sa para imposibila. Intr-adevar la prima vedere aceasta pare greu de realizat, insa daca se ia in considerare faptul ca majoritatea , din punct de vedere al utilizatorului sunt la fel – adica au un ecran (cu rezolutie destul de mare pentru a putea afisa informatie sau chiar poze), si au o modalitate de introducere si selectie a datelor (de cele mai multe ori un “creion” sau o tastatura virtuala). De asemenea familiarizarea utilizatorilor cu modul de navigare pe internet a redus foarte mult posibilele cerinte din partea unui astfel de program. Astfel daca pe un ecran de dimensiuni reduse se afiseaza informatia, prin simpla scoatere in evidenta a unui termen sau chiar sublinierea acestuia , majoritatea utilizatorilor inteleg deja realizarea unei legaturi la un alt document.

Astfel firma Air2Web a realizat o solutie de adresare a mai multor tipuri de dispozitive mobile. Pentru a sublinia mai clar targetul acestei solutii merita amintiti cativa clienti impreuna cu modul lor de folosire :

UPS – pentru a afla de oricunde unde este un pachet trimis anterior, sau pentru a a fla costurile si timpul de tranzit al pachetelor, sau chiar unde se afla cel mai apropiat oficiu

CBS Sportsline – pentru a afla real-time unele informatii sportive incluzind scorul anumitor partide, oferte de schimb pentru jucatori sau detalii despre jucatori.

BassHotels (afiliat Crowne Plaza, Holiday Inn, Staybridge sau Inter-Continental) – pentru a face gasi un hotel functie de preferinte , pentru a gasi calea de acces la el sau chiar pentru a face rezervari on-line.

NetBank – pentru a verifica extrasul unui cont personal sau chiar cota actiunilor pe bursa de valori.

BarPoint – pe baza codului UPC introdus in dispozitiv, fie de la tastatura fie de la un cititor de cod de bare se poate avea acces instantaneu la baza de date cu produse.

MODAL

MoDAL a fost dezvoltat ca o parte a UIA (Universal Information Appliance). UIA este conceptul care ii va permite unui posesor de PDA sa controleze deviceuri si sa acceseze informatia disponibila in retea prin invatarea mediului in care este folosit dispozitivul respectiv. Un utilizator de al interfetei MoDAL va fi capabil sa ia interfete si sa programeze agenti de informatie pentru aceste dispozitive si va putea chiar sa le controleze. Aceste servicii se bazeaza pe elemente de user-interface interconectate intre ele prin spatiile duale – Tspaces.

O aplicatie MoDAL prezinta utilizatorului o iterfata client pentru un dispozitiv specific. Serviciile disponibile unui utilizator de MoDAL pot sa fie programate de la complexitatea unui intrerupator pentru un bec la o aplicatie complexa ce implica interfete evoluate sensibile la evenimente independente aplicate sistemului..TSpaces este elementul de legatura intre interfata si comenzile date sistemului. Viziunea aspura evolutiei sistemului este ca un utilizator al unui mic PDA (de cele mai multe ori limitat ca si capabilitati hardware sau software) prin internediul puterii Tspaces si a lui MoDAL sa profite din plin de avantajele unei lumi distribuite.

In momentul de fata pachetul include un interpretor de MoDAL , un proxy scris in Java si niste exemple program care ruleaza pe un emulator de PalmOS. Utilizatorul poate sa scris propriile programe modal folosind acest pachet si sa le testeze. Totusi versiunea curenta este doar un subset de comenzi MoDAL si demonstreaza doar capabilitatile solutiei si integrarea cu Java si Tspaces.

OpenCOLA

Cuvantul “COLA” din OpenCOLA vine de la Arhitectura colaborativa de gasire a obiectelor. Spre deosebire de aplicatia prezentului proiect, acest protocol a fost dezvoltatat pentru eliminarea unora din problemele pe care motoarele de cautare pe Internet le au. Astfel spre deosebire de motoarele de cautare, un Director OpenCOLA este tot timpul in cautare de documente si fisiere care pot intra in sfera de interes a utilizatorului, fara a fi nevoie de supervizare sau interactiune. Un astfel de agent comunica cu altii din retea ajungand atingand astfel scopul propus. In timp ce un motor de cautare normalare o baza de date centrala care foloseste agenti care sa caute pentru noi resurse si un motor de “datamining” pentru a face datele cautabile, Directoarele OpenCOLA cauta ele insele pe Internet.

Spre deosebire de motoarele de cautare de interes general, fiecare Director cauta doar un anumit tip de document, in functiile de criteriile stabilite de utilizator. Aceste Directoare Inteligente pot fi vazute ca un motor de cautare cu un singur scop. Ele pot colabora in efectuarea cautarii si combina eforturile. Astfel daca un motor standard creaza si updateaza o singura baza de date centralizata, Directoarele OpenCola construiesc mai multe retele mici care cauta impreuna pentru resurse relevante.

Acestea pot fi invatate.Astfel daca atunci cand au gasit un document, I se specifica ca acesta este bun, Directorul cauta pentru documente asemenea. Daca documentele gasite nu sunt bune se poate specifica acest lucru si nu va mai aduce astfel de documente.

Softwareul care compune reteaua distribuita OpenCola constituie doar jumatate din ce inseamna de fapt acest protocol. Cealalta jumatate este constituita de interactiunea umana intre utilizatorii OpenCola care au aceleasi interese. Valoarea reala a sistemului se gaseste intr-o regula de design simpla : suntem de acord ca data din retea nu reprezinta nimic ea insasi ci doar in relatie cu ceea ce utlizatorii umani au nevoie. Nici un sistem software oricat de sofisticat ar fi nu poate spera sa gaseasca sigur toate documentele pe care o persoana le-ar dori fara nici o interventie umana. In loc de a prevedea un viitor unde sisteme de cautare complet autonome cauta informatii folositoare, mai degraba va exista un viitor in care aceste cautari sunt corectate de oameni.

Considerente economice

Pentru operatorii retelelor de comunicatii mobile, WAP promite sa diminueze costurile si sa creasca baza abonatilor prin imbunatatirea serviciilor existente, ca interfetele voce-posta electronica si sistemelor preplatite, si prin facilitarea unei game largi de servicii si aplicatii noi, ca managementul contului si indicatii asupra facturilor. Noile aplicatii pot fi introduse rapid si usor fara nevoia de infrastructura aditionala sau modificari ale telefonului. Aceasta va permite operatorilor sa se diferentieze de competitorii lor cu noi servicii de informatii personalizate. WAP este un cadru de lucru interoperabil, permitind furnizarea de solutii end-to-end la cheie care vor un avantaj competitiv de durata, vor costitui loialitatea clientilor si vor mari veniturile.

Aplicatiile vor fi scrise in WML (wireless markup language), care este un subset al XML (extensible markup language). Utilizind acelasi model ca si Internetul, WAP va permite dezvoltatorilor de aplicatii si continut sa adopte limbajul WML care va pava drumul pentru ca serviciile sa fie scrise si introduse in reteaua operatorului repede si usor. Pentru ca WAP este un standard deschis, global si interoperabil, furnizorii de continut au acces imediat la bogatia de potentiali clienti care vor cauta asemenea aplicatii care sa imbunatateasca ofertele de servicii furnizate bazei lor de abonati existenti si potentiali. Clientii serviciilor mobile devin tot mai avizi de a primi o functionalitate crescuta de la dispozitivele lor mobile, iar WAP deschide usa spre acesta piata neatinsa care se asteapta sa ajunga la 100 de milioane de dispozitive ce permit accesul WAP pana la sfirsitul anului 2000. Acesta va da dezvoltatorilor posibilitatea unor venituri semnificative.

Utilizatorii finali ai WAP vor beneficia de acces usor si sigur la informatii importante din Internet si servicii ca unificarea mesageriei, operatiilor bancare si divertismentului prin intermediul dispozitivelor mobile. Informatiile intranet, ca bazele de date ale corporatiilor, pot fi deasemenea accesate prin intermediul tehnologiei WAP. Datorita unei largi game de producatori de dispozitive ce suporta deja initiativa WAP, utilizatorii vor avea o semnificativa libertate de alegere cind vor selecta terminalele mobile si aplicatiile pe care acestea le suporta. Utilizatorii vor putea sa ceara si sa primeasca informatii intr-un mediu controlat, rapid si cu costuri mici, fapt ce face ca serviciile WAP sa fie mai atractive pentru clientii care doresc mai multa functionabilitate de la terminalele lor mobile.

Ca scop initial al WAP, Internetul va determina multe din directiile implementarii WAP. Se asteapta ca furnizorii de servicii Internet (ISP) sa exploateze adevaratul potential al WAP. Dezvoltatorii de continut web vor date si acces direct la indivizii la care vor sa ajunga. In plus, acesti dezvoltatori vor recunoaste uriasul potential al bazelor de clienti ai operatorilor; astfel, ei vor dori si vor fi capabili sa ofere preturi pentru continutului lor. Capacitatea extinsa a WAP va permite furnizorilor de informatii despre vreme si calatorii sa utilizeze WAP. Acest mecanism extins permite un avantaj distinctiv supra WWW si reprezinta un potential urias pentru furnizorii si operatorii retelelor mobile.

Comunicatii wireless – considerente tehnologice

Scopurile sistemelor de comunicatie mobila, multi-acces, sunt: calitate apropiata de cea a serviciilor prin cablu, acoperire cvasi-universala, cost redus al echipamentelor, numar minim de statii radio fixe. Implementarea sistemelor de comunicatie celulara cu sute de canale active a devenit practica odata cu dezvoltarea sintetizatoarelor de frecventa compacte si ieftine. Prezenta microprocesorului permite implementarea unor protocoale sofisticate de control al mesajelor vocale si de date.
Structura in celule a transmisiilor radio permite deplasarea receptoarelor intre celule fara a fi intrerupta legatura, transferul facandu-se automat prin procedeul denumit „handover”. In cadrul unui spectru de frecvente sunt disponibile mai multe sute de canale. Pentru fiecare conversatie este folosit un canal al unei statii de baza. La „handover” statia mobila este redirectionata pentru emisie pe un nou canal activ in noua celula.

Conceptul central in cadrul teoriei comunicatiilor celulare este cel al reutilizarii frecventelor. Daca fiecare frecventa ar fi asociata unei singure celule, capacitatea totala a sistemului ar egala numarul total de canale si deci nu ar putea exista decat cateva mii de abonati intr-un sistem. Prin reutilizarea canalelor in celule multiple sistemul poate creste fara a fi limitat geografic. Reutilizarea depinde in principal de faptul ca atenuarea campului electromagnetic in banda de comunicatie celulara tinde sa creasca mai repede cu distanta decat o face in spatiu liber. Un sistem rationalizat si ideal de utilizare a frecventelor celulelor de comunicatie poate fi descris folosind o acoperire clasica a unei zone cu celule hexagonale.

Tehnologia CDMA ofera de fapt raspunsul la problema de capacitate, iar solutia consta in folosirea unor purtatoare cu latime de banda mare si puteri reduse in locul partitionarii spectrului de comunicatie in sloturi independente, cu latime ingusta si putere mare de transmisie. Sensibilitatea la zgomot si interferente este mult redusa, iar reutilizarea frecventei este universala, adica mai multi utilizatori pot folosi aceeasi purtatoare CDMA. Dar nu numai globalizarea este singurul atribut al viitorului standard in comunicatiile celulare. Acesta va dispune de o capacitatea de trafic si o calitate a transmisiei substantial imbunatatite, de o maxima siguranta a pastrarii legaturii la transferul intre celule, un mecanism fiabil de transport de date de tip Internet si de o reducere a costurilor de amplasare si operare datorat numarului redus de celule necesar acoperirii zonelor active. Telefoanele vor putea fi si mai mult miniaturizate deoarece puterea medie de transmisie va fi egala cu o fractiune din cea actuala, in standard GSM, iar efectele suparatoare ale interferentelor cu alte dispozitive electronice vor fi, in principiu, eliminate definitiv.

Arhitectura sistemului

Inventarea calculatorului a fost o consecinta naturala a progresului omenirii. Insa odata cu aceasta nu s-a dorit doar folosirea acestuia la efectuarea unor calcule complexe sau in coordonarea unor activitati in mediu industrial nepropice omului ci si introducerea acestuia in casele oamenilor atat pentru folosirea lui in scopuri distractive cat mai ales pentru invatare si folosire in diverse domenii. Odata cu aparitia si dezvoltarea acestuia, oamenii si-au pus problema comunicarii si odata cu aceasta a reducerii dimensiunii lui. Astfel o statistica arata ca numarul de utilizatori creste semnificativ in fiecare an.

Odata cu dezvoltarea internetului , s-au dezvoltat si tehnologiile de transimsii de date si de interfatarea a diverselor dispozitive, acestea devenind standarde pe parcursul trecerii timpului.

Internetul este alcatuit din mai multe retele de calculatoare interconectate intre ele.El se bazeaza in principal pe o retea de calculatoare puternice raspindite in toata lumea,care functioneaza continuu,alcatuind o asa numita coloana vertebrala("backbone").Aceste calculatoare se afla,de la inceputul anilor '90,in proprietatea unor companii private care au interese in domeniul telecomunicatiilor sau calculatoarelor,companii care au preluat responsabilitatea de a asigura buna functionare a retelei Internet, in momentul in care s-a luat decizia de a permite folosirea acesteia si in scopuri comerciale.

Spre deosebire de coloana vertebrala umana,ale carei elemente sint alcatuite din acelasi material si sint asezate unele in continuarea altora avind in plus intre ele elemente de legatura puternice si flexibile,coloana vertebrala a Internetului nu este omogena iar legaturile dintre elementele sale nu sint nici pe departe atit de ingenios construite precum omoloagele lor din corpul uman.Veriga slaba este reprezentata de legaturile dintre nodurile retelei(cele care alcatuiesc "coloana vertebrala") si de punctele de interconectare a diferitelor retele care alcatuiesc Internetul.Ca urmare,mentinerea stabilitatii Internetului este o munca permanenta pentru administratorii de retea de la diferite nivele.

Modernizarea Internetului va presupune deci omogenizarea componentelor de baza ale retelei,implicind aici si stabilirea unor standarde,care sa fie acceptate de toate companiile implicate in administrarea Internetului ca si de acelea care produc tehnologia necesara functionarii acestuia.Daca tinem cont de faptul ca puterea calculatoarelor si capacitatea lor de stocare si prelucrare a datelor sint in continua crestere rezulta ca pentru viitor va trebui sa ne facem griji doar pentru conductele de transmitere a datelor,cele care chiar si astazi sint elementul major care intirzie dezvoltarea Internetului.Retelele telefonice clasice,folosite concomitent pentru convorbiri prin voce si transmitere de date nu au nici capacitatea si nici fiabilitatea necesare pentru a asigura transmiterea fluxurilor informationale din ce in ce mai importante care sint prevazute a naviga prin reteaua Internet in secolul care tocmai a inceput.

Imbunatatirea tehnologiei nu a fost o prioritate pentru marile companii de telecomunicatii,lucru usor de explicat daca luam in considerare faptul ca pina recent veniturile acestor companii proveneau in special de la abonati care foloseau retelele de telefonie pentru comunicatii prin voce.Internetul a schimbat radical situatia in ultimii ani inclinind balanta in favoarea transmisiilor de date.

In consecinta, companiile de telecomunicatii sint acum dispuse sa investeasca venituri importante in modificarea infrastructurii.Nici o companie nu se va decide insa sa investeasca masiv in modernizarea infrastucturii decit daca are un segment important de piata asigurat,care sa asigure recuperarea cheltuielilor facute.Inainte de a construi va trebui cistigat razboiul pietelor de desfacere.In urmatorii zece ani pietele nationale se vor deschide,in toata lumea,catre multinationalele din domeniul telecomunicatiilor,rezultate prin fuziuni sau asocieri intre companii puternice din Europa,America de Nord si Asia.Acestea vor oferi preturi mai bune abonatilor decit companiile de telefonie nationale cu traditie,si in aceasta situatie este esential ca fiecare companie de telefonie,oricit de mica, sa incerce sa-si pastreze cit mai mult din segmentul de piata pe care il detine.

Companiile nationale au pe moment avantajul proprietatii asupra "buclei locale("local loop"),adica al firelor de telefonie subterane care asigura legatura intre centralele telefonice si aparatele telefonice ale abonatilor.Orice alta companie care doreste sa intre pe piata trebuie sa plateasca pentru folosirea buclei locale.Desi acest lucru este in buna parte responsabil de lipsa concurentei in domeniul telecomunicatiilor prin fir in multe tari europene,in ultima instanta nimic nu va putea opri disparitia monopolurilor detinute de companiile nationale.Cel mai probabil acestea vor fi inlocuite de monopolul la scara mondiala pe care il vor institui asupra tuturor tipurilor de telecomunicatii cele citeva mari companii care vor ramine in scena dupa urmatorul val de fuziuni si achizitii.

Multinationalele vor face tot ce le va sta in putere pentru a intra pe pietele nationale necucerite inca,apelind eventual la preturi de dumping pentru a forta falimentul companiilor asa-zis nationale. Mai mult,folosirea dispozitivelor fara fir("wireless") pe scara larga pentru comunicatii vocale si transmitere de date va asigura in viitor o noua modalitate de ocolire a buclei locale.

O discutie despre tehnologia utilizata de Internet nu ar fi completa daca nu am spune citeva cuvinte si despre programele pe care le folosim atunci cind navigam pe Web.Chiar si acestea trebuie sa evolueze in asa fel incit sa poata folosi la maximum puterea calculatoarelor actuale si viitoare.In prezent insa nu a fost depasita inca situatia de razboi intre diferitele companii care propun astfel de programe.

In privinta browserelor asistam la o perioada de acalmie,determinata de acapararea celui mai mare segment al pietei de catre Microsoft,cu ultima varianta a lui Internet Explorer.Principalul concurent,Netscape,a fost obligat sa abandoneze lupta directa si sa se lase cumparat de America On Line,cel mai mare furnizor de servicii Internet din lume.Conflictul este insa deschis in privinta programelor de mesagerie instantanee("instant messaging"),socotite de mare viitor,motiv pentru care cel putin o duzina de astfel de programe se lupta pentru a deveni standardul in domeniu.Nici in privinta altor imbunatatiri aduse browserelor nu exista un consens general.Cel mai bun exemplu il constituie limbajul JAVA pentru care nu a fost posibila definirea unui standard din cauza companiilor Sun si Microsoft care au fiecare o varianta a acestui limbaj pe care doresc sa o impuna.Transmiterea de imagini si sunete in timp real prin intermediul tehnologiei de tip "streaming" are parte de o soarta asemanatoare,in momentul de fata existind doua companii,Microsoft si Real Networks care propun programe similare.

Odata depasita perioada de dispute pentru impunerea standardului propriu si acapararea unui segment cit mai mare din piata vom putea asista la schimbarea "revolutionara" a aspectului site-urilor Web,cu un accent din ce in ce mai mare pe alcatuirea unei realitati virtuale incitanta, complexa si fantastica in acelasi timp.Introducerea de grafica 3D,clipuri audio-video,animatii avansate si a sunetului stereo surround vor accentua senzatia de imersiune intr-un spatiu virtual.Interactivitatea cu continutul site-urilor Web va fi si ea imbunatatita in asa fel incit actualul clic pe hyperlink-uri va deveni o amintire a trecutului.Se va incerca folosirea tuturor simturilor omului pentru crearea unei atmosfere speciale in care interactiunea va implica nu numai simtul vazului sau al auzului ci si simtul tactil si al mirosului.

Navigarea pe Internet va fi asemanatoare pentru inceput cu plimbarea printr-un joc de tip "first-person", iar ulterior va fi mai asemanatoare cu o plimbare pe strada,avind posibilitatea sa dam comenzi vocale si sa comunicam cu alte persoane intilnite sau sa interactionam cu obiectele prezente in peisaj prin intermediul unui corp virtual.Avem astfel imaginea unui Internet cu adevarat ajuns la maturitate tehnologica,capabil sa preia si sa armonizeze caracteristicile celor mai avansate programe create pentru calculator, in asa fel incit rezultatul final sa fie o experienta existentiala virtuala care sa rivalizeze cu existenta reala si in acelasi timp sa o completeze ,acesta fiind scopul final urmarit de toti cei implicati in dezvoltarea Internetului

Tendinta actuala este de a reduce dimensiunea dispozitivelor si de a accesa serviciile oferite de reteaua Internet. Astfel mai multe companii duc o lupta acerba de a-si promova propriile deviceuri , aceasta avand in vedere ca nu exista la momentul actual un standard in privinta sistemului de operare sau macar a interfetei din punct de vedere utilizator al acestora graficul alaturat aratand mai faptul ca in functie de deviceul folosit aplicatiile folosite comunica chiar la un alt nivel ISO/OSI.

Impactul pe care il au aceste deviceuri este relevat de graficele urmatoare, grafice calculate in urma unor statistici efectuate in Statele Unite ale Americii, unde fenomenul Wireless are cei mai mult adepti, atat datorita marii dezvoltari tehnologice cat mai ales a pretului redus pe care acestea il au. Pretul in mare masura cat si facilitatile oferite de aceste deviceuri si puterea din ce in ce mai mare a procesoarelor cu care sunt dotate, fac din aceste deviceuri inlocuitoarele de maine ale calculatoarelor personale. Astfel pentru aceste dispozitive portabile au fot concepute aplicatii atat pentru uz personal ( de ex. jocuri sau agenda, scheduler, baza de date pentru parole sau cheltuielile de pe cardul de credit) cat si , mai nou, servicii legate de Internet. Astfel marii provideri de telefonie mobila (OmniSky) sau de echipamente de comunicatie (vezi. 3COM) au pus la punct protocoale noi pentru incapsularea si transmiterea datelor. Astfel utilizatorii de deviceuri fara fir din US au acces la o serie de sisteme de accesare a Internetului din locatii mobile : prin modemuri Omnisky, prin modemuri Ricochet, prin tehnologie Bluetooth sau chiar prin infrarosu.

Prezentare continut prin HTML

Navigând pe web, vezi multe tipuri de pagini si situri, si inevitabil observi ca între ele exista diferente semnificative, care le confera o calitate si o functionalitate diferita, în functie de tehnologia de web în care au fost create. Exista mai multe tipuri de pagini de web, si adesea în ele se combina tehnologii diferite de proiectare, menite sa creeze efecte speciale sau sa realizeze diverse functii, în functie de intentia proiectantului si de obiectivele sitului. In continuare vor fi prezentate în mare cele mai populare dintre aceste tehnologii. Chiar daca un utilizator nu este întotdeauna si un proiectant de pagini web, adesea el simte nevoia sa înteleaga de ce anumite lucruri nu functioneaza la fel în toate browserele, sau cum se pot vedea (mai bine sau cât de putin) anumite pagini de web.

În primul rând, la baza tehnologiilor de web putem spune ca se afla codul HTML. Denumirea vine de la Hypertext Markup Language, si este un sistem de marcaje care se foloseste pentru a construi paginile de web astfel încât browserele de toate felurile sa le poata reda pe ecran în mod vizibil si clar, conform intentiei autorului. Adesea în adresele de pagini web se vede terminatia (extensia) html sau htm. Acestea desemneaza fisiere scrise în codul HTML. Pentru orice proiectant de pagini web, acesta este punctul de pornire în învatarea crearii de pagini. De asemenea, orice browser de web este capabil sa afiseze pagini în HTML. Totusi, trebuie retinut ca exista unele elemente HTML care nu sunt recunoscute de toate browserele. Codul HTML evolueaza, si browserele mai vechi nu stiu sa trateze unele marcaje mai noi, asa ca le ignora. De aceea apar diferente în felul în care se vad paginile în browsere diferite.

Trebuie retinut ca HTML nu este un limbaj de programare, ci un cod de marcare a fisierelor de text ca sa poata fi formatate si afisate în browser alaturi de imagini, si sa contina linkuri catre alte fisiere sau resurse din Internet. De asemenea, el nu a ramas pe loc, ci a cunoscut dezvoltari (evidente tot în extensiile unor fisiere de pe web) care i-au adaugat o functionalitate sporita si posibilitati de colaborare cu alte tehnologii de pe web si din reteaua de computere: DHTML (Dynamic HTML), XHTML (Extended HTML), WML (Wireless Markup Language) sunt câteva exemple.

Documente bine formate si XML

Extensible Markup Language, abreviat XML, descie o clasa de obiecte numite documente XML si descrie partial comportamentul unor programe de computer care le proceseaza. XML este o aplicatie profil sau o forma restrictiva a SGML-ului, Standard Generalized Markup Language [ISO8879]. Prin constructie, documentele XML se conformeaza documentelor SGML.

Documentele XML sunt realizate din unitati de stocare numite entitati, ce contin date parsate sau neparsate. Datele parsate sunt realizate din caractere, unele dintre ele formând date caracter iar altele ca marcaje. Marcajele codifica o descriere a schemei de stocare a documentului si structura logica. XML furnizeaza un mecanism pentru a impune constrîngeri asupra schemei de stocare si a structurii logice.Un modul software numit procesor XML este utilizat pentru a citi documente XML si pentru a da acces la structura si continutul lor. Se considera ca un procesor XML îsi face munca în spatele unui alt modul, numit aplicatie. Aceasta specificatie descrie comportamentul cerut unui procesor XML în termeni ce spun cum trebuie sa citeasca datele XML si ce informatii trebuie sa-i furnizeze aplicatiei.

Scopurile proiectate pentru XML sunt:

– XML trebuie sa fie simplu de utilizat pe Internet.

– XML trebuie sa suporte o mare verietate de aplicatii.

– XML trebuie sa fie compatibil cu SGML.

– Trebuie sa fie usor sa fie scrise programe ce vor procesa documente XML.

– Numarul facilitatiilor optionale din XML sunt reduse la minimum, ideal, la zero.

– Documentele XML trebuie sa fie citibile de catre utilizatori si clare într-un mod rezonabile.

– Designul XML ar trebui sa fie pregatit rapid.

– Designul XML trebuie sa fie formal si concis.

– Documentele XML trebuie sa fie usor de creat.

– Caracterul lapidar din marcajele XML sa fie de o importanta minima.

Chiar daca, de obicei, limbajul XML nu este folosit direct pentru crearea paginilor, proiectantii paginilor WEB trebuie sa cunoasca acest standard pentru a crea site-uri profesionale. XML pare, in acest moment, singura noastra sansa de a obtine un format pentru transferul informatiilor care sa fie, cu adevarat, independent de platforma. In urmatoarele citeva epizoade ale acestui serial va vom prezenta conceptele care stau la baza acestui limbaj.

XML este prescurtarea de la extensible Markup Language si este, in principal, un format pentru stocarea datelor. La ora actuala XML a fost adoptat de majoritatea companiilor din industria IT. Singurul moment in care s-a mai obtinut o astfel dc uniformitate a fost atunci cand TCP/IP a fost adoptat ca protocol pentru retele. XML este un standard international si se bucura de sustinere din partea companiilor din intreaga lume.

Stylesheeturi XSL/XSLT

XSL a aparut deoarece XML ofera posibiitati de afisare a datelor care depasesc posibilitalile oferite de HTML. XML permite autorilor sa insemne datele cu elemente definite de autor care vor specifica natura datelor, avand ca rezultat structuri de date mai bine selectate si mai clar organizate decat cu HTML. Dar, ca datele din interiorul unui element sa fie inlelese pe deplin, acestea trebuie afisate intr-o maniera care sa comunice scopul lor. Elementului trebule sa i se dea un stil. XSL permite afisarea datelor dintr-un element sau dintr-o serie de elemente intr-un mod unic. Datele pot avea o singura caracteristica stilistica sau mai multe.Datele pot fi afisate avand un aspect consistent in document, sau in mai multe documente. XML poate insera data la pozitiile adecvate, iar XSL o poate stiliza corespunzator rolului avut in acea pozilie. Mai simplu, XSL permite formatari mai cormplexe decat CSS. Totug, paginile mai sofisticate vor folosi ambele tehnici pentru a obtine un aspect consistent, cu date structurate.

XSL si CSS pot lucra impreuna deoarece este posibila si colaborarea dintre XSL si HTML. XSL are la baza doua idei esentiale: mai intai, va permite sa extragei datele din documentul XML, si in al doilea rand va permite formatarea acestor date. Dar, daca doriti, atunci puteti fobosi XSL pentru extragerca datelor si batranul HTML pentru formatarea acestora.

XSL permite autorilor sa formateze documentele XML. Foloseste sintaxa XML, permitind specialistilor XML sa dea un stil docurnentelor si datelor fara a fi obligati sa invete CSS sau DSSSL. Caracteristica cea mai puternica a XSL este abilitatea de a mapa o singura sursa de date in mai multe pozitii de pe ecran insemnand prezentarea multipla a unui document XML sau HTML pe ecran – si de a formata datele din fiecare pozitie.

La formatarea datelor, XSL trece prin doua faze. Mai intai, produce un arbore sursa prin potrivirea sabloanelor specificate cu elementele XML. Acest arbore este apoi prelucrat pentru a produce un arbore rezultat bazat pe actiunile specificate in regulile de machetare, prezentate mai jos. Apoi un interpretor XML preia datele si instruchiunile XSL si transforma arborele intr-un document care va fi afisat de clientul Web. XSL e capabil sa reorganizeze datele, deci arborele rezultat poate fi complet diferit de cel sursa.

Cu alte cuvinte, pornind de la un document XML in care sunt elemente continand datele. XSL preia aceste elemente si creeaza arborele sursa, apoi se aplica regulile de machetare pentru a produce un arbore rezultant in care fiecarui element ii este specificat un stil diferit. In final, procesorul XSL traduce elementele formatate in cod HTML care poate fi afisat de un navigator Web. Datele vin din documentul XML, regulile pentru formatare care pot include si reorganizarea datelor vor fi preluate din declaratia de stiluri XSL.

Baza XSL o reprezinta regulile de machetare, care stabilesc cum va aparea domentul XML original in documentul final. Fiecare regula de machetare este compusa dint-un sablon si o macheta. Sablonul indica elementul din arborele sursa caruia i se va aplica regula respectiv. Macheta va specifica ce se va intampla cu sablonul pentru a produce o parte relevanta din arborele rezultat. In esenta, o regula de machetare spune: gasete urmatoarele elemente, apoi punele in aceasta ordine si aplica aceasta formatare, apoi punele in arborele rezultat pentru a fi preluate de parser. Daca vedeti sursa XML ca materie prima, iar documentul HTML ca produs final, atunci regulile de machetare reprezinta procesul tehnologic. In esenta, aceste reguli transforma datele XML brute in informatii afisabile.

Sabloanele sunt siruri de caractere care se potrivese cu numele elementelor din documentul XML. Acestea specifica clementele carora doriti sa le aplicati regulile de machetare. De exemplu, daca un document XML este inventarul revistelor, acesta ar putea incepe cu un element numit <item> si in interiorul acesteia putem avea un element numit <tip_item>. Daca doriti sa aplicati un stil tuturor datelor elementului <tip_item>, atunci se cere din XSL sa se gaseasca modelul tip revista, apoi sa le aplice sablonul si sa le adauge in arborele rezultat. Aceasta coincidenta a modelelor de baza e notata ca o coincidenta a elementului machetei:

<xsl:template match=”tip_item”>

</xsl:template>

Puteti cere o cautare simpla, cum ar fi dupa numele elementului, sau puteti cauta ascendent pentru a gasi elemente descendente de orice grad. De exemplu, urmatorul element de macheta

<xsl:template match=”tip_item”/”ui_element”/”nume_item”>

</xsl:template>

va gasi elementele numite nume_item din sectiunea “ui_element” al sectiunii “tip_item” a documentului XML.

Sunt posibile multe alte tipuri de cautari, dar cele de baza si ascendente sunt cele mai uzuale.

Odata ce un model a fosi asociat elementelor sale, vor intra in actiune regulile de formatare ale sablonului. Sablonul consta din instructiuni pentru formatarea datelor gasite in macheta. Sabloanele sunt inima regulilor de machetare – partea din XSL care preia majoritatea lucrului. Scopul sabloanelor este de a aplica formatarea, iar aceste posibililati sunt complexe. De fapt, formatarea se poate aplica in mai multe feluri, incluzind construirea macrourilor de formatare.

Un sablon XSL spune care obiecte de formatare se vor aplica anumitor mostre. Obiectele de formatare sunt elemente de stil, cum ar fi grosimea literei, culoarea fundalului si spatierea. XSL otera un numar mare de obiecte de formatare facand parte din vocabularul de formatare propriu si toate acestea ar trebui sa coincida cu vocabularul CSS si DSSSL. De fapt, deoarece unul din motivele aparitiei sistemului de obiecte de formatare cste de a oferi povibilitatea de a avea iesire nu numai pe ecran ci si pe imprimanta, acest sistem este cel mai cuprinzator din specificatia XSL. Categoric, sistemul anticipeaza aplicatii pentru formatare asemanatoare pachetelor DTP, dar pina la aparitia acestora, specificatia va oferi fundalul necesar pentru facilitati de formatare ca numerotarea paginilor, chenare accentuate si multe, multe altele.

Scopul portiunii de formatare a machetei este de a crea, in arborele rezultat, obiectele care vor fi formatate si apoi sa le aplice formatarea. Un obicet creat poate fi de mai multe tipuri variind de la obiecte de structura – care definesc stilul principal al paginii sau al secventei de pagini – pina la obiecte matematice pentru reprezentarea ecuatiior si obiecte tip tabel pentru implementarea tabelelor. Totusi, obiectele cele mai frecvente sunt cele de tip flux, iar functionalitatea lor variaza de la simple blocuri de text pana la specificari mult mai complexe despre cum obiectele de tip flux vor fi grupate pentru a le aplica o formatare comuna.Acest ultim tip de obiect – sceventa de fluxuri- este utilizat din plin deoarece permite utilizatorului sa aplice formatari uzuale unor secvente de date dintr-un element anume al documentului XML.

Machetele XSL contin instructiuni pentru actiuni ca numerotarea elementelor dintr-o lista sau testarea unor conditii. Totusi, cea mai uzuala comanda este xsl:process, utilizata pentru a cere aplicarea unei formatari specifice fie tuturor descendentilor elementului (xsl:process-children), fie unui descendent anume (xsl:process). De fapt, instructiunea xsl:process-children este cea mai uzuala dintre toate.

Una dintre caracteristicile cele mai puternice a XSL este posibilitatea de a fi foarte selectivi cu datele carora le vom aplica formatarea. Mai intai, instructiunea xsl:process select va permite sa specificati ca doar un anume descendent va fi formatat. Mai mult, doua instructiuni conditionale xsl:if si xsl:choose va permit sa fiti si mai selectivi. Prima instructiune va cauta un model in elementele XSL si va executa instructiunile pentru ficeare element gasit. A doua, xsl:choose, este destinata pentru una sau mai multe instructiuni when, aplicand formatarea primului element pe care-l gaseste.

Daca nu gaveste nici un element, va cauta instructiunea optionala otherwise si va aplica instructiunea asociata acesteia. Cu alte cuvinte, XSL permite o programare limitata ca parte a machetei si, in realitate, include un sistem de creare de macrouri pentru programarea mai avansata a detalillor de formatare.

Dispozitive wireless si WAP/WML

La ora actuala, cea mai noua "inventie" în materie de tehnologii Internet este tehnologia WAP (de la Wireless Application Protocol – "Protocol pentru Aplicatii de Telecomunicatie Fara Fir"), care permite oricarui utilizator de telefon celular dotat cu suportul adecvat sa aiba acces la informatii si servicii de Internet. Acest protocol da acces la Internet si milioanelor de utilizatori de telefoane celulare, chiar daca nu dispun de un computer.

Telefonul celular cu suport WAP (sau WAP ready) arata ca un celular obisnuit, dar ai posibilitatea sa îl configurezi si sa îl folosesti pentru acces la Internet, daca furnizorul tau de semnal radio îti asigura un astfel de serviciu pe lânga serviciul obisnuit de telefonie fara fir. La cel mai simplu nivel, vei avea acces la paginile WAP, care sunt niste pagini de web în mod text, în general (desi se pot include si imagini simple, în cele doua culori permise de afisajul celularului). Informatiile apar pe ecran dupa conectarea la serverul care le gazduieste sau le furnizeaza, sub forma de linii de text.

Unele dintre cuvintele din textul afisat pot fi linkuri catre alte pagini, si butoanele celularului permit navigarea de la un link la altul, prin text sau prin meniuri, urmata de activarea linkului selectat, pentru încarcarea paginii indicate de link. Pot fi incluse si mici formulare în care se poate scrie text cu ajutorul tastelor celularului (de pilda, adrese de WAP sau chiar mesaje de E-mail), ceea ce permite trimiterea de date catre serverul respectiv, si în final o interactivitate în stilul celei de pe Internet, încetinita doar de tastatura diferita si ceva mai greoaie decât cea de computer.

Serviciile WAP sunt abia la început, dar nu este greu sa ne imaginam ce amploare vor lua ele, dupa utilizarile pe care le pot avea. Sa ne imaginam cartea de telefon pusa într-un sit WAP: în loc sa suni la o operatoare care trebuie sa caute într-o baza de date, si poate întelegi gresit o cifra, cauti tu însuti în baza de date – de fapt, tu doar spui numele persoanei sau al firmei cautate, si un program de pe server cauta pentru tine – si primesti pe ecran numarul dorit, foarte clar. Sau vrei sa vezi cursul valutar curent, ori cursul actiunilor la bursa, sau ultimele stiri din presa, în timp ce te afli în masina, între doua orase sau asteptând la semafor. Ca sa nu mai vorbim de faptul ca poti sa-ti vezi mesajele de E-mail si sa trimiti mesaje de E-mail, chiar si de pe strada. Iar daca soseste un mesaj nou pe adresa ta de E-mail, esti anuntat de celular printr-un semnal sonor.

WAP foloseste o tehnologie "client-server", bazata si derivata din tehnologia WWW. Standardul WAP folosit in acest moment este WAP 1.1.

WAP a fost creat pentru a functiona cu orice standard de telefonie mobila digitala: Time Division Muliple Acces (TDMA), Code Division Multiple Acces (CDMA), Global System for Mobiles (GSM), Universal Mobile Telephone System (UMTS) si altele.

Principalele componente ale sistemului sunt:

– un microbrowser incorporat in unitatea mobila (telefon, PDA, etc) – un Gateway, care traduce comenzile protocolului Internet folosit de serverele WWW in comenzi specifice protocolului WAP si converteste continutul oferit de serverul WAP/WWW intr-un format optimizat pentru echipamenetele mobile

– un server WAP/WWW, care poate fi un server Web normal, accesat de gateway-ul WAP si capabil sa ofere continutul paginilor Web intr-un format WML (Wireless Markup Language, un limbaj de scriere asemanator HTML, Hyper Text Markup Language, dar mai simplu, adaptat cerintelor comunicatiilor mobile

In momentul in care un utilizator foloseste serviciul WAP, telefonul efectueaza o cerere in WML, prin intermediul browserului. Aceasta cerere este preluata de Gateway-ul WAP, care gaseste informatia ceruta din Internet fie in formatul standard HTML, fie (preferabil) in formatul specific WML1. Raspunsul este trimis inapoi de Gateway-ul WAP catre utilizatorul mobil prin intermediul suportului de transport folosit de operatorul respectiv: CSD, SMS etc.

PalmOS: calitatea programelor si informatie offline

Arhitectura deschisa si flexibila care sta la baza palmOS da dezvoltatorilor o baza ideala pentru a creea si livra solutii de succes. In loc de a incerca sa inglobezi toate facilitatile unui desktop computer intr-un ambalaj mai mic, palmOS este special construit pentru managementul aplicatiilor mobile. In era supraincararii informatiei, palmOS da utilizatorului mobil un scop pentru a accesa si pentru a avea grija de informatia cruciala vietii profesionale sau personale. Spre deosebire de un desktop care este optimizat pentru a cereea documente , palmOS este facut sa dea acces instantaneu la informatie, oricunde si oricand e nevoie.

Noul tip de calculator a fost adoptat cu entuziasc de mii de dezvoltatori, dand palmOS cea mai larga baza software din toate platformele mobile intalnite. Succesul platformei palmOS a creat o econimie de succes pentru produsele palmOS si a atras multe din comapiile inovatoare din lume, inclusiv Nokia sau Sony care au fost de acord sa integreze solutii bazate pe acest sistem de operare.

Utilizatorul obinuit poate invata mai mult despre filozofia din spatele palmOS si poate sa-si faca o idee despre ceea ce inseamna economie pentru aceste deviceuri.

Palm si partenerii lui conduc dezvoltarea urmatoarei generatii de dispozitive mobile prin adaugarea unor noi functionalitati pentru utilizatorii fara a sacrifica simplitatea si usurinta de folosire care au facut din deviceurile cu palm un standard.

Pe viitor deviceurile mobile vor deveni instrumente necesare pentru oricine obisnuieste sa foloseasca informatie, sa faca tranzactii si sa comunice cu altii.

Palm are grija sa construiasca fundatia pentru acest viitor cu o deosebita grija pentru urmatoarele domenii :

– conexiuni si servicii wireless : deviceurile palm deja include cateva din cele mai inovative produse de comunicare wireless de pe piata, inclusiv popularul PalmVII sau telefonul Visor. Toate deviceurile palm sunt echipatesa comunice fara fir si deja multi a adaptat software pentru a comunica de exemplu cu un telefon mobil. Noi dviceuri cu modemuri incorporate sau notificatoare de email vor fi construite. Palm dezvolta si sustine de asemenea standardul de transimisie radio locala Bluetooh pentru a comunica cu telefoanele mobile si cu alte dispozitive.

– tranzactii sigure : solutii robuste sunt deja implemntt pentru palmOS. Exista un parteneriat intre palm si conducatorii procesarii tranzactiilor sigure sa puna la punct infrastructura care va permite deviceurilor palm sa devina portofel electronic sau chiar cartela de identifiare si sa serveasca ca un gateway pentru majoritatea tranzactiilor sigure.

– grafica si multimedia : palmurile au deja multe optiuni multimedia, de la inregistratoare de voce, prelucrari de poze, ecran color si terminand cu sute de jocuri.

Chiar daca Palm si partenerii lui au creat viitorul calculatoarelor mobile, ei vor mentine simplitatea si usurinta in folosire care au facut atat de popular acest device.

Windows CE

Windows CE este un system de operare modular, real-time pentru deviceuri mici pe 32 biti, mobile, inteligente si conectatabile. Cu suport imbunatatit de real-time, functionalitate multimedia si capabilitati sporite de internet, Windows CE da posibilitatea dezvoltatorilor sa creeze dispozitive inalt customizabile, conectate si mai ales compacte.

Dezvoltarea pentru Windows CE prezinta un set unic de provocari pentru aceia care sunt deja obisnuiti cu programarea pentru sistemele de opereare din familia Microsoft Windows. Aplicatiile windows trebuie recompilate inainte de a rula pe o platforma CE (care nu este neparat una cu procesor x86). In unele cazuri din cauza diferentelor dintre APIul standard Windows si cel CE, codul nu va putea fi portat fara schimbari substantiale.In plus, memoria si rezolutia ecranului obliga devoltatorii de WinCE sa se gandeasca intr-o lumina diferita.

In mod curent, deviceurile CE se gasesc in 3 forme :

– handheld PC – un device ce suporta un display de 640×240, cu touch-screen si o mica tastatura, optional sunet si un slot CompactFlash sau PCMCIA.

– palm PC – deviceuri de dimensiunea unei palme cu o rezolutie de 240×320 pixeli , fara tastatura sau mouse insa optional cu sunet sau slot CompactFlash.

– auto PC – system auto ce suporta activare prin voce,comunicatii wireles si un sistem predefinit de navigare.

Toate aceste interfata ruleaza ca un shell ce e foarte similar cu standardul Windows. Acesta consta din acelasi tip de user-interface cu ferestre,impreuna cu un taskbar jos care poate fi folosit sa lansezi si sa contrlezi aplicatii. Multi din industrie spun ca aceasta interfata ca o limitre si astfel Microsoft a modificat-o incepand cu versiunea 3.0. Filozofia design de interfata face mai clara diferenta intre PalmOS si WindowsCE. In timp ce Palmul a fost facut sa fie foarte eficient si simplu de utilizat, CE a fost facut sa aduca familiaritatea windowsului pe un ecran mai mic. Multor utilizatori de CE le place aceasta interfata comuna dar o problema este ca utilizatorii de deviceuri trebuie deseori sa faca taskuri diferite pentru a atinge acelasi tel ca si utilizatorii de sisteme desktop. Din cauza clickurilor usoare si a selectiilor din meniuri pentru a te uita de ex. la numarul de telefon al cuiva , aceasta face ca deviceurile Palm sa o ia inaintea celor CE din punct de vedere al actiunilor.

Deocamdata totusi aceasta cursa tocmai a inceput. Ne putem aminti cu usurinta cand vechile versini de Windows erau foarte putin folosite si dominatia pe piata era doar un vis.

Symbian GT si generatia urmatoare de telefoane mobile

EPOC este cu adevarat primul sistem de operare orientat spre platforme mobile. El nu este constrans sa ruleze pe o arhitectura PC sau pe o arhitectura pe 16 biti. El foloseste din plin potentialul modulelor sale de a da un set puternic de instrumente de dezvoltare si de utilizare dintr-o imagine ROM. Arhitectura sa 3-tier inseamna ca poate fi livrat pe o gama variata de sisteme de operare si permite producatorilor de dispozitive sa construiasca interfete unice si ergonimice. Cu suport din partea catorva producatori de telefoane mobile si cu o baza din ce in ce mai mare de licentieri (printre care Sony este cea mai recenta) EPOC va avea cu siguranta un cuvant de spus pe piata dispozitivelor wireless.

Fiind un sistem 3-tier constand din Baza, Middleware si Eikon GUI, sistemul EPOC permite portarea acestuia pe diferite configuratii hardware fara alterarea serviciilor Middleware pe baza carora acesta este construit. La fel aceasta permite si construire unor GUI noi care sa faciliteze adapatarea acestora.

Serviciile de baz ale Middleware sunt :

Stocare si prelucrare de streamuri

System de management baze de date relationale

Posibilitati de afisare text si continut (editor tip “rich text” si tabele)

Server de Windows

Obiecte incapsulate

Suport pentru fonturi, bitmapuri si printare.

In paralele sunt suportata serviciile de comunicare incluzand Socketi seriali, Dial-up networking , TCP-IP, agenda si servicii telefonice, fax si infrarosu.

EPOC ofera dezvoltatorilor 3 optiunti. Fiecare optiune este suportata printr-un SDK disponibil liber la siteul Symbian. SDKurile permit dezvoltarea codului si rularea acestuia intr-un emulator pe PC inainte de a fi impachetate intr-un fisier SIS pentru distributie.

OPL

OPL sau Limbajul de programare al organizatoarelor are originea odata cu primul device Psion. In esenta este un limbaj stil BASIC. Principalul avantaj al lui OPL este ca in afara dezvoltarii folosind SDKul poate fi scris si rulat direct pe un dispozitiv EPOC. De aemenea codul scris si compilat cu ajutorul emulatorului poate fi imediat copiat si rulat.

Dezavantajul OPL este ca nu permite accesul direct la unele din serviciile EPOC decat prin intermediul fisierelor OPX (niste dlluri scrie in C++ care pot accesa aceste clase de baza). In compensare o serie de OPMuri sunt disponibile.OPMurile sunt niste rutine OPL care implementeaza functiile des folosite si pot fi partajate intre aplicatii.

Java

EPOC suporta JDK 1.1.4. La fel ca laOPL dezvoltarea unor metode native are nevoie de C++. Procesul de dezvoltare implica scrierea codului in orice mediu Java, testarea locala apoi transferul fie catre emulator sau catre orice device EPOC pentru testarea finala.

De notat ca Swing este suportat insa AWT este recomandat din cauza ca Swing are nevoie de multa memorie si putere CPU.

C++

C++ este mediul de dezvoltare pentru EPOC. La fel ca Java dezvoltarea in C++ are loc pe un PC, insa spre deosebire de OPL el da acces la toate functiile EPOC. Pentru a dezvolta C++ este nevoie de Microsoft Visual C++ 5 sau 6. Dezvoltarea este un pic mai dificila deoarece codul este compilat cu VC++ si rulat apoi in emulator. Odata testat si corectat acesta este recompilat cu GNU C++ pentru EPOC.

C++ pentru EPOC este un pic mai dificil decat cel normal pentru VC++. Si aceasta este din 2 motive. Primul este ca EPOC foloseste VC din 1994/95 si deci nu a beneficiat de noile imbunatatiri ale acestuia. A doua si probabil cea mai importanta, cei care au proiectat EPOC au facut o serie de lucruri pentru a optimiza codul si pentru a reduce memoria folosita si puterea proesorului (fiind vorba totusi de un dispozitiv portabil). De exemplu primii 4 biti dintr-un cuvant sunt folositi sa indice tipul descriptorului astfel acestia fiind limitati la 250 milioane caractere si nu la 4 miliarde cat sunt in mod normal liberi. Dar cauza principala si care se pare ca a generat cele mai multe probleme este imposibilitatea de a folosi cod static in DLLuri care are o insemnatate destul de mare la portare. Aceasta a fost facuta deoarece codul statice poate consuma toata memoria dispozitivului inainte sa apuce sa faca ceva.

Tehnologie alternativa – iMode si cHtml

I-mode a fost introdus pe piata japoneza in feb 1999 si de atunci a adunat penste 8 milioane de utilizatori cu o medie de venit de 25$/utilizator.

Cu un telefon i-mode se pot usor accesa serviciile online obisnuite cum ar fi verificarea si transferul de fonduri din contul din banca, gasirea informatiilor dispoibile despre un restaurant sau alte obiective ale unui oras pe langa serviciile normale de comuncare vocala.

In plus fata de aceste servicii de voce, utilizatorii pot accesa o mare gama de siteuri prin simpla apasare a tastei i-mode. Serviciile normale include mobile bancking si rezervari de bilete.I-mode functioneaza peste o retea de transmisie de pachete la 9600bps astfel ca taxele de comunicare sunt pe baza traficului facut si nu pe baza timpului stat online. Prin i-mode se poate citi e-mailul si se pot trimite mesaje intre terminalele i-mode.

S-a incercat lansarea tehnologiei I-mode si pe alte piete insa desi marea parte a operatorilor din Statele Unite credeau ca tot ce trebuie sa faca e sa beneficieze de experienta i-mode si sa o lanseze in SUA si ca vor avea rezultate similare. Dar aceasta nu este destul. Se pare ca i-mode a avut succes mai mult ca un produs popular si apropiat culturii japoneze si nu ca un serviciu wireless. Cea mai mare diferenta este chiar modul in care se percepe Internetul. Astfel in SUA cei mai multi dintre utilizatorii internet se incadreaza in profilul : adolescent sau om de afaceri cu acces la calculatorul personal pe o line telefonica de minimi 33 kbps – majoritatea avand experiente legate de DSL si de modemuri de cablu pe cand in Japonia mai mult de 85% din utilizatorii I-mode nu au vazut internet in alta parte decat pe ecranul telefonului lor. Ei nu au experienta fisierelor grafice detaliate. Ei nu sunt obisnuiti sa se poate misca in ambele directii intre linkuri internet pentru a ajunge de la un site la altul, astfel ei nerealizand importanta faptului ca mergand inapoi la meniul principal pentru a schimba un site cu altul nu este deloc eficient. In schimb utilizatorii serviciilor i-mode obtin informatie mai usor decat inainte cand si unde vor ei. Mai mult decat atat NTT DoCoMo si-a construit propria retea wireless astfel incat costurile sa fie mici si acoperirea aproape totala. Cei mai multi sunt obisnuiti sa foloseasca telefoanele mobile inauntru si stiu ca serviciile de date sunt o alta utilizare a telefonului. Spre deosebire de aceasta in SUA si de altfel in majoritatea retelelor acoperirea in cadrul cladirilor este sub parametrii si probabil va ramane asa pentru destul de mult timp.

Operatorii de servicii mobile trebuie sa-si dea seama ca daca cineva va dori acces internet mobil acesta va trebui sa functioneze impecabil atat inauntru cat si in afara cladirilor. O astfel de crestere este estimata sa se produca doar in momentul cand acoperirea telefoanelor mobile va fi destul de mare ca acesea sa devina telefoanele principale folosite.

Tehnologia i-mode se bazeaza ca mediu de transmisie pe standardul compact html.

Compact HTML (cHTML)

Standardul Compact HTML este un subset al lui HTML 2.0, HTML 3.2 si HTML 4.0. Mai jos sunt descrise majoritatea facilitatilor ce NU sunt incluse in standard :

– imagini JPEG

– tabele

– harti senzitive de imagini

– mai multe stiluri si fonturi de caractere

– imagini si culori de fond

– frameuri

– style-sheeturi

Se defineste totusi ca standardul ca includa suport pentru imaginile Gif. Trebuie notat ca acest standard nu are nevoie de cursor bi-dimensional pentru navigare ci poate fi operat folosind doar 4 butoane. Se presupune de asemenea ca paginile bine construite sa incapa in spatiul ecran si defilarea sa nu fie necesara. Se recomanda ca paginile cHTML sa aiba urmatoarele dimensiuni limita :

Intrare : maxim 512 octeti.

Selectie: maxim 4096 octeti.

Desi o astfel de limitare tine in mare parte de dificultati de implementare ele sunt folositoare la dezvoltarea noilor dispozitive.

O alta recomandare este ca de exemplu browserul sa suporte alegera directa a linkurilor prin folosirea butoanelor cu cifre. Astfel daca de ex. pe o pagina apar 5 linkuri, al treilea sa poata fi accesat prin apasarea butonului 3.

Tehnologii WEB : JavaScript, VBScript, JSP, Servleti

Dar proiectantii de pagini de web au simtit nevoia sa introduca si elemente de programare în pagini, fie pentru a accelera realizarea anumitor functii si efecte, fie ca masura de securitate pentru a-si asigura drepturile de autor si secretul asupra anumitor artificii de proiectare, sau pentru a împiedica anumite investigatii sau operatii permise prea liber de codul HTML. Este renumit limbajul JAVA, dezvoltat de compania SUN, special pentru a spori securitatea aplicatiilor de web si a siturilor, prin introducerea de appleturi în paginile HTML. Browserul trebuie sa aiba activat suportul pentru JAVA ca sa poata permite vizualizarea de appleturi.

Mici limbaje de programare (de scripting) s-au dezvoltat ca tehnologii de web, si probabil primul (sau unul din primele) este Javascript. Lansat initial de compania Netscape, a cunoscut o popularitate destul de mare, astfel încât si compania Microsoft a trebuit sa introduca în browserul sau (Internet Explorer) suport pentru Javascript. Acest microlimbaj permite introducerea de secvente (script-uri) în paginile HTML, sau poate fi folosit în fisiere separate (cu extensia js) apelate din codul HTML, pentru a realiza functii speciale în browser. El poate include si comenzi pentru browser, sau poate testa tipul browserului, astfel încât comportamentul browserului poate fi dictat de catre ceea ce se gaseste în paginile care contin Javascript.

Pentru a permite crearea unei interfete de web cu aplicatiile create în limbajul de programare Visual Basic, compania Microsoft a lansat Visual Basic Scripting (fisiere cu extensia vbs), care s-au dovedit însa si o cale de patrundere pentru unii virusi de e-mail, la executia acestor scripturi. Desigur, acesta nu este un motiv pentru a se renunta la VBS, ci un impuls pentru perfectionarea lui, ceea ce se întâmpla continuu cu fiecare limbaj de programare pentru web.

Ele au avut un rol important în dezvoltarea aplicatiilor de web interactive, în care vizitatorul unui sit poate introduce date pe baza carora va primi anumite informatii sau va avea acces diferentiat la anumite servicii.

Si tehnologiile pentru operarea cu baze de date au cunoscut o dezvoltare în directia aplicatiilor de web, astfel încât unele dintre ele (ca MySQL) permit realizarea de aplicatii compleye în care toate informatiile sunt stocate în baze de date, uneori cu posibilitatea ca vizitatorii sa înscrie informatii în aceste baze de date.

S-au dezvoltat si tehnologii multimedia pentru web, care necesita anumite componente de browser, numite plug-ins, care pot fi copiate din Internet si instalate pe computerul propriu pentru a se putea vizualiza fisierele grafice si de animatie, sau înregistrarile audio realizate cu astfel de tehnologii. Cele mai fascinante efecte sunt prezente pe web în siturile realizate prin tehnologia Shockwave Flash, lansata de Macromedia. Siturile realizate cu Flash sunt adevarate capodopere artistice digitale, dar este nevoie si de o buna conectare la Internet ca sa poata fi vizitate.

Specificatii de proiectare

Prezentarea ideii

Ideea lucrarii a pornit in principiu de la faptul ca exista o diversitate de dispozitive portabile la ora actuala in lume si nu exista inca un standard comun de interfatare a lor fie unele cu altele fie cu un sistem central. Atunci ideea unei interfete comune este iminenta si poate fi usor solutionata prin dezvoltarea unei aplicatii care sa stie sa interpreteze datele date in limbajul acestei interfete comune si sa le adapteze pentru toate deviceurile. Astfel diversitatea de deviceuri implica o diversitate a modurilor de interfata. De ex. marea parte a telefoanelor mobile suporta limbajul WML , limbaj incapsulat in WAP pentru transport. Unele mai noi , cat si PDA cu sistem de operare winCE suporta chiar un browser web ce conforma standardului HTML transportat cu HTTP.

Alta mare categorie de deviceuri este cea cu sistemul de operare palmOS. Exista cateva aplicatii care pot translata si afisa un subset de taguri HTML insa standardul oferit de sistemul de operare este PQA (palm query aplication), in fapt o incapuslare pe biti a HTML 3.2. Din nefericire insa acest subset este suportat doar de o parte a deviceurilor create de palm si anume palmVII care se bucura de acces wireless prin intermediul unei retele celulare a 3COM pusa la punct in marile orase americane si in Londra.

Ideea de baza a acestui proiect este de a defini un limbaj comun , pe baza specificatiilor XML prin care sa poata fi definite interfete utilizator pentru marea partea a sistemelor suportate de dispozitivele mobile : WAP/WML, WinCE, PalmOS si chiar si HTML.

Astfel daca posesorul unui site sau a unui portal de informatii sau chiar a unei baze de date ce doreste sa afiseze informatiile pe aceste deviceuri, va trebui doar sa se asigure ca serveste datele in formatul specificat in acest document si fiecare utilizator de dispozitiv mobil, prin intermediul acestui gateway poate sa vada datele puse la dispozitie.

Caracteristicile acestei interfete trebuie sa permita celui care isi face programul sa poata emite astfel de date sa creeze mai multe feluri de viewuri, sa poata adresa documentele intre ele prin linkuri, sa poata sa primeasca raspunsuri referitoarea la datele interogate intr-un limba bine definit.

Astfel el trebuie sa poata defini mai multe tipuri de viewuri : liste, tabele sau pur si simplu afisari pe ecran functie de coordonatele alese cum este ilustrat in exemplul de mai jos :

De asemenea interfata trebuie sa permita zone senzitive (date) legate prin linkuri (de exemplu daca userul alege sa vada actiunile, el sa fie dus automat la pagina cu actiuni – in cazul de fata Rasdaq sau Nasdaq, sau chiar a titlurilor informatiilor care ii sunt puse la dispozitie grupate pe categorii )

De asemenea interfata trebuie sa permita afisare cu mai multe marimi de fonturi sau cu diverse proprietati schimbate (culoare daca este posibil, culori inverse, subliniere, ingrosare).

Din punct de vedere tehnic aceasta se realizeaza astfel :

– interfata este scrisa conform standardului XML (document bine format si valid daca este prezenta descrierea interfetei – fisierul DTD).

– pentru afisarea ca WML , va exista un servlet care fie va lua de la o adresa web bine definita , prin intermediul unui cache, pagina de descriere a interfetei fie local pentru mai multa viteza de procesare si cu ajutorul XSLT o va prelucra astfel incat aceasta sa conforme cu standardul WML 1.1.

– pentru afisarea pe palmOS sau winCE, un program special pentru acesta va fi scris care va stii sa creeze automat viewurile impreuna cu elementele necesare interfetei utilizator.

– pentru afisare pe dispozitivele capabile sa afiseze documente HTML, fie un servlet va lua descriere interfetei si o va modifica pe baza unui document XSLT intr-un fisier HTML corect, fie daca celcare creeaza interfata doreste acest lucru, pagina XSLT va putea fi luata direct de la acesta. Aceasta pentru a oferi o flexibilitate sporita utilizatorilor WEB sau cu deviceuri mobile performante.

Specificatii din punctul de vedere al furnizorului de informatie

Avantajul folosirii acestei solutii de catre furnizorii de informatie traditionali este ca ei pot astfel trimite datele spre o piata mai mare si anume cea acoperita de legaturile wireless. Astfel daca in mod normal targetul acestora erau strict utilizatorii care trebuiau sa intre pe siteul furnizorului ca sa citeasc sau cei adresabili prin trimiterea unor e-mailuri, prin extinderea acestor servicii spre piata dispozitivelor mobile creste simtitor impactul.

De asemenea solutia acopera golul lasat de lipsa tehnologiei de a accesa uniform o varietate de dispozitive.

Exista o serie de cerinte ce trebuie indeplinite din acest punct de vedere pentru a face solutia atractiva si usor de folosit din punctul de vedere al celui care pregateste informatie pentru aceste terminale. Astfel :

Aplicatia trebuie sa fie una noua – Aplicatiile pentru terminalele mobile trebuie sa fie concepute de la zero special pentru acestea si nu sa fie portari ale aplicatiilor desktop sau sa se incadrezein specificatiile unei aplicatii pentru Internet deja dezvoltata si care are succes. Asta deoarece succesul unei aplicatii mobile tine de alte conditii si particularitati decat cea a unui site web. De asemenea dispozitivele mobile nu trebuie sa fie privite ca alternative la PC ci un nou mod de a interactiona. Furnizorii trebuie sa fie constienti de faptul ca unele taskuri se pot face doar pe PC altele doar pe terminalul mobil.

Aplicatia trebuie sa fie interactiva – Stilul de aplicatii paginate nu creaza aplicatii mobile apreciate. Acestea trebuie sa fie interactive astfel incat utilizatorul sa acceseze serviciul cand are nevoie de el si nu acesta sa ii fie pus la dispozitie fortat. O solutie wireless nu trebuie sa includa doar notificari de la server ci trebuie sa asigure utilizatorului posibilitatea de a cere. Implementand ambele tipuri de tranzactii (initiate de server sau initiate de user) se asigura ca utilizatorul sa beneficieze de servicii cand vrea el si nu dupa un program predefinit.

Operatiile efectuate de utilizator trebuie sa fie user-friendly – Aceasta parte este tratata mult mai detaliat in subcapitolul urmator.

Nu trebuie uitat nivelul de cunostiinte al utilizatorului – Utilizatorii de dispozitive mobile pot sau pot sa nu fie in tema cu navigarea Web (dovada ca posesorii de telefoane mobile sunt mult mai multi decat cei cu acces Internet). Furnizorii trebuie sa fie constienti ca nu toate conventiile Web sunt usor intelese de un utilizator incepator (astfel de exemplu hiperlinkul poate sa nu fie la fel de usor inteles pe un terminal mobil). Legat de aceasta trebuie mentionat ca daca timpul de navigare pana la informatia solicitata devine prea mare exista riscul ca utilizatorii sa se plictiseasca si sa nu-l mai foloseasca.

Informatia trebuie personalizata – Luand in considerare dimensiunile mici ale ecranului si costul asociat cu navigarea wireless informatia trebuie personalizata la nivel de gustul fiecaruia, stil de viata si nivel de confort.

Furnizorii de informatie trebuie sa fie constienti de limitarile dispozitivului – Diferenta dintre dispozitive pornind de la marimea ecranului si terminand cu puterea procesorului variaza si astfel acestea trebuie luate in considerare. Un exemplu mai clar este cel legat de capabilitati audio – astfel este binecunoscut ca efectele audio cresc substantial nivelul de atractivitate al fiecarei aplicatii insa de ex. nu toate dispozitivele suporta acest lucru

Trebuie luata in considerare locatia utilizatorului – Cel mai mare avantaj al dispozitivelor wireless este ca pot fi folosite oriunde. Insa terminalele cu adevarat competitive se deosebesc prin faptul ca pot sa asigure si informatii legate strict de zona unde se afla utilizatorul – de ex. cele mai apropiate restaurante sau moduri de distractie.

Trebuie eliminata navigarea ierarhica – Aplcatiile trebuie sa fie cu nivel mic de indirectare. Un studiu arata ca 50% dintre utilizatori se simt pierduti cu fiecare click dat.

Trebuie luata in considerare securitatea tranzactiilor – Aplicatiile folosite pe dispozitivele mobile trebuie sa aiba un nivel mult mai mare decat cele de pe PC deoarece avand in vedere dimensiunea acestora riscul sa fie furate este mult mai mare.

Specificatii din punctul de vedere al utilizatorului

Cand se analizeaza si proiecteaza o aplicatie pentru un PDA urmatoarele considerente trebuiesc luate in seama :

– Navigare intuitiva

O proiectare buna a aplicatiei incepe cu fluxul ei natural. Utilizatorul se gandeste in termenii problemei pe care incearca sa o rezolve si nu cum sa foloseasca dispozitivul ca sa rezolve problema. Uneletele trebuie sa fie transparente utilizatorului. De fiecare data cand ultilizatorul trebuie sa se opreasca sa-si dea seama cum sa foloseasca unealta, el devine nervos si frustrat – astfel aparand riscul ca el sa nu gaseasca calea sau sa uite de fapt problema pe care incerca sa o rezolve. Interfetele intuitive sunt usor de vandut, mai usor pentru utilizatori de rulat si cel mai putin probabil sa transforme produsul in unul nefolosibil (chiar returnat sau aruncat).

– Consistenta

O buna aplicatie foloseste metafore pentru a face mai usor utilizatorului sa descopere intuitiv cum sa faca anumite activitati. De fiecare data cand este posibil, aceste metafore trebuiesc folosite pentru a mentine aplicatia simpla.

– Activitatile cheie sa fie cat mai usor accesibile

O aplicatie va avea multe functii insa din toate, doar 15-20% vor fi cel mai des folosite. De exemplu un utilizator de email citeste o gramada de e-mailuri pe PDAul personal inainte sa raspunda sau chiar sa compuna unul nou. Intelegand care sunt activitatile cheie si reducand pasii de realizare a lor va face experienta utilizatorului mult mai placuta.

– Rezolvarea de activitati noi trebuie sa fie usor descoperibila

Cand utilizatorul executa taskuri care nu au mai fost executate inainte, de ex. Sa scrie un email in loc sa citeasca unul, el trebuie sa-si dea seama singur cum sa faca aceasta fara un ajutor din exterior de la alt utilizator sau manual. Aceste functii nu trebuie plasate in calea principala dar trebuie sa fie pe nivelul imediat urmator pentru a putea fi usor gasite si folosite.

– Operatiile neobisnuite nu trebuie sa fie usor descoperite ci usor de tinut minte

Daca utilizatorul are de facut o operatie care este fie rara, fie complexa interfata nu trebuie sa fie atat usor de manevrat cat mai ales usor de tinut minte calea pana la ea pentru folosiri ulterioare. De ex. poate ca un utilizator trebuie sa citeasca manualul inainte sa invete cum sa forwardeze un email (o operatie rara) insa odata ce a facut acest lucru el nu ar trebui sa citeasca din nou manualul sa afle cum poate sa faca acest lucru din nou ci pria experienta ar trebui sa-l conduca automat la o astfel de operatie (astfel ea fiind usor de tinut minte).

Cea mai buna metodologie pentru dezvoltat aplicatii complexe si in acelasi timp usor de folosit este prin urmarea urmatorilor pasi :

se dezvolta profilul utilizatorului care va folosi aplicatia

se imparte aplicatia in probleme care trebuiesc solutionate de fiecare utilizator

se determina operatiile necesare pentru rezolvarea problemelor

se faca o impartire pe prioritati a acestora

se face macheta interfetei pe baza datelor culese mai sus.

Se testeaza interfata in conformitate cu regulile enumerate.

Moduri de realizare

Transmiterea datelor

In momentul de fata , daca un posesor de site internet doreste sa se adreseze unei mase mai mari de oameni si anume celor ce folosesc dispozitive mobile (care dupa cum s-a vazut in graficele anterioare este intr-o continua crestere) este nevoit sa isi faca o versiune pentru fiecare model de dispozitiv mobil folosit pe scara larga. Astfel pe langa efortul de compactare si prezentarea a diverselor informatii pe site, acesta va trebui apoi convertit in format WML sau in alte moduri pentru a putea fi usor afisat. O varianta mult mai usoara pentru aceasta este aceea de a formata de la inceput datele intr-o structura XML (dupa cum se stie WML are o structura de tip XML , iar HTML poate fi convertit). Apoi pe baza unor specificatii de transformare se pot genera documente HTML, WML sau se pot transmite direct ca XML si prelucra pe dispozitivele respective (cazul PalmOS, WinCE sau Java).

Astfel un portal, fie creeaza pagini statice XML fie le genereaza dinamic sau chiar le foloseste pentru a transforma si afisa mai usor continutul. Pentru transformarea pe server fiecare dispozitiv porneste de la o pagina de intrare, sa-i zicem acesteia <nume dispozitiv>. Intern aceasta apeleaza de fapt un servlet care returneaza un fisier specific dispozitivului. Daca este vorba de o legatura, parametrii acesteia fie sunt transformati odata cu documentul (de ex. intr-un tag <a href=>, fie sunt transformati de dispozitiv).

Arhitectura sistemului este alcatuita dintr-unul sau mai multe servere care genereaza continut XML in format predefinit. Un alt server sau poate chiar unul din cele dinainte contine solutia de transformare in functie de dispozitivele inregistrate.

Astfel cum majoritatea aplicatilor de tip portal web au o baza de date cu informatia, fie ca aceasta se converteste automat la HTML pentru a indeplini functia portalului in stransa legatura cu niste machete de pagini (pentru a putea usor personaliza portalul sau chiar pentru a obtine servicii adaugata – publicitate directa, indirecta prin aplicatii ale altor siteuri sau chiar mici joculete), fie ca se converteste in format XML dupa un DTD predefinit este la fel de simplu.

Avantajul solutiei propuse este ca unele siteuri mai mici (de ex. cele ale ziarelor sau ale publicatiilor periodice mai rare) care in principiu de fiecare data sunt actualizate manual pot tinti spre o audienta oferita de purtatorii de deviceuri mobile. Sau chiar firmele care au pagini de prezentare. Astfel acestea odata cu realizarea paginii vor trebui sa realizeze si documentele XML specificate.

Formatul datelor de intrare

Fluxul de intrare este unul destul de simplu.Astfel operatorul siteului introduce datele fie separat fie odata cu informatiile pentru portal (in general aceasta se face automat). Acestea stau in baza de date pana cand este nevoie de ele. Acest lucru se poate intampla in doua cazuri , functie de dispozitivul mobil pentru care se doreste afisarea.Daca este vorba de un dispozitiv online atunci in momentul cand utilizatorul solicita informatia, dispozitivul se leaga la aplicatie si aceasta la randul ei ia infomatia din portal, o formateaza si o intoarce utilizatorului. Pentru un dispozitiv offline (adica care nu are posibilitatea de a fii permanent intr-o legatura de date cu un server – fie din motive tehnologice , fie economice) exista un program de sincronizare a acestuia cu ultimele noutati. Astfel exista mai multe dispozitive al caror scop este si de organizator si care se pot conecta la un calculator doar printr-o legatura locala. Pentru astfel de dispozitive utilizatorul specifica ce tip de informatie doreste si pe cate nivele. Aceste informatii sunt stocate apoi pe dispozitivul mobil si pot fi accesate off-line.

Din punctul de vedere al prezentarii informatiei exista cateva tipuri predefinite de moduri de afisare. Acestea includ: liste, tabel (si respectand dimensiunea ecranului acesta se rezuma pana la urma la maxim 2-4 coloane), si informatie formatata. De asemenea aceste informatii sunt accesibile printr-o adresa Xpath. Forma de prezentare se poate extinde si cu formulare de interogare astfel incat solutia poate fi aplicata si pentru a obtine feed-back din partea utilizatorului sau pentru elaborarea unor solutii mai complexe gen comert electronic sau rezervari on-line.

Pentru diferitele moduri de prezentare a informatiei exista diferite atribute.

Astfel :

modul view : are un titlu si eventual o data.

modul lista : o lista de itemuri din care unele pot fi cap de tabel (adica categorii). Lista poate avea un titlu si o data la care a fost updatata.

modul tabel : un tabel de prezentare a informatiei. Are ca si caracterstici numarul de coloane.

Astfel din cele de mai sus rezulta ca fiecare document este identificat prin tipul lui , prin titlu si data la care a fost updatat. Aceasta data este foarte importanta atat pentru utilizatorii online pentru a stii ce vechime are documentul si mai ales pentru cei offline pentru a stii cand s-a sincronizat ulltima oara si mai ales in procesul sincronizarii sa nu se aduca de 2 ori acelasi document avand in vedere ca transferul informatiilor se face pe o legatura seriala de viteza mica comparativ cu vlumul datelor ce pot fi transferate si chiar cu memoria dispozitivului.

Astfel pentru prezentarea informatiei se poate folosi XML-ul:

<?xml version='1.0'?>

<Document type=”view”>

<Title>Stiri bancare</Title>

<Date>22/06/2004</Date>

<View>BNR a respins solicitarea Jaquila de amanare a termenului pentru majorarea capitalului BIR. Banca Nationala a Romaniei a respins marti , solicitarea grupului Jaquila de amanare, cu 10 zile. </View>

</Document>

Pentru prezentarea sub forma de tabel avem titlul si data documentului, apoi tagul pentru tabel cu atributul col pentru numarul de coloane. De asemenea tagul desc care poate fi optional si cuprinde descrieri ale coloanelor (ca procent din afisarea pe ecran sau pe vitor pentru extinderea cu culori).

<?xml version='1.0'?>

<Document type=”table”>

<Title>Rasdaq</Title>

<Date>22/06/2004</Date>

<Table col=3>

<desc>

<col>60%</col>

<col>30%</col>

<col>10%</col>

</desc>

<tr>

<td>Aurora</td>

<td>3.000</td>

<td>+3.26</td>

</tr>

…..

</Table>

</Document>

De asemenea un alt caz particular de tip de afisare este si tipul lista. Aceasta se deoebeste de tipul tabel prin faptul ca unele itemuri pot sa fie diferite de modul de afisare normal si astfel sa se simuleze categorii.

<?xml version='1.0'?>

<Document type=”list”>

<Title>Stiri bancare</Title>

<Date>22/06/2004</Date>

<List>

<li mode=bold>IT News</li>

<li>28/06 Asbis organizeaza seminarul</li>

…..

</List>

</Document>

Aceste documente pot fi combinate intr-un singur XML si acesta se poate cosidera ca format al datelor de intrare.

La aceasta se adauga si legaturi pentru navigarea intre documente. Legaturile intre documente se pot specifica ca si cale de acces absoluta sau relativa pana la documentul XML, urmand ca acestea sa fie prelucrate odata cu informatia inainte de prezentare. Astfel la documentele XML prezentate mai sus se pot adauga linkuri prin modificarea urmatoarelor taguri :

– la modul tabel prin adaugarea unei proprietati link tagului td.

– la modul list prin adaugarea proprietatii link tagului li.

Metode de prelucrare a datelor de intrare

Datele de intrare se pot prelucra in mai multe moduri functie de tehnologiile dorite si de modul de dispunere al partilor componente (2-tier sau 3-tier).

Astfel primul mod este ca datele de intrare sa fie accesibile direct din portalul sursa, acestea fiind prelucrate in momentul cand s-au introdus.

O alta metoda recomandata pentru solutiile mici este de a face toate transformarile prin intermediul unor templateuri XSL la cererea expresa a utilizatorului mobil.

Trecand la o arhitectura partial distribuita putem folosi un servlet pentru a genera continutul documentelor specifice fiecarui dispozitiv dar putem folosi in paralel si vechile metode.

Arhitectura care este optima din punctul de vedere al cerintelor si al modului de implementare este ca un program (numit generic Servlet in diagrama , insa la fel de bine poate sa fie o pagina ASP sau JSP ce foloseste un parser de XML sau un interpretor de XSL) sa acceseze datele de intrare prin http si apoi sa le converteasca la formatul dorit si sa le livreze utilizatorului.

4.5 Studiu comparativ al metodelor de realizare

In vederea realizarii unei comparatii a metodelor de implementare trebuie analizata fiecare solutie din urmatoarele puncte de vedere :

spatiul ocupat pe disc de fisierele generate.

timpul de raspuns din momentul in care cererea utilizatorului ajunge la aplicatie. Aici este vorba de timpul de prelucrare a datelor de intrare cat mai ales de timpul in care datele de intrare ajung la instrumentul de prelucrat.

tipul de dispozitive suportate – adica daca se pot genera si fisiere binare cum este cazul cHTML sau PQA (un subset al HTML3.2) sau doar fisiere ascii.

scalabilitatea sistemului – numarul de utilizatori care pot face cerere si primesc raspuns intr-un timp rezonabil de la sistem (maxim 5 sec).

arhitectura distribuita sau nu – in cazul unei arhitecturi distribuite o astfel de solutie poate servi mai multe surse de informatie

Comparatie a arhitecturilor prezentate mai sus :

– Metoda cu date predefinite

Dezavantajul acestei metode este ca ocupa spatiu disc pentru fiecare dispozitiv in parte existand o copie a datelor.Scalabilitatea este foarte mare intrucat nu este vorba decat de servit pagini in loc de a le si genera.In principiu functioneaza ca un cache si se poate combina cu alte solutii pentru imbunatatirea timpului de raspuns. Alt avantaj este de a face automat toate prelucrarile automat in momentul actualizarii informatiilor.

– Metoda numai cu sabloane XSL

Are avantajul de a fi usor customizabile paginile finale prin ajustarea continutului sablonului. Timpul de raspuns este destul de bun prin faptul ca datele sunt luate de pe local.

– Metoda cu acces local

Se pot implementa orice dispozitiv deoarece cele care au nevoie de cod binar se pot servi prin intermediul servletului celelate beneficiind de avantajele prezentate anterior.

– Metoda cu acces remote

Spatiul ocupat pe disc este minim, timpul de acces este redus in cazul in care accesul prin http se face printr-un proxy (setat cu timpul de expirare echivalent cu cel al actualizarii informatiei), toate dispozitivele posibile sunt suportate, scalabilitatea poate fi acoperita printr-o arhitectura distribuita. Deci aceasta este solutia cea mai buna dintre cele prezentate.

Implementare si testare

Implementare solutie pentru dispozitive online fara memorie (wap/wml)

WAP este ca un concept. Este un set de definitii despre cum ar trebui sa mearga lucrurile. Pe retea, o pagina web este un fisier (document) stocat pe un server web. In WAP, documentele se numesc pachete si fiecare pachet contine unul sau mai multe carduri. Continutul unui card este cea ce este afisat in fereastra browserului WAP. Pe Internet in general limbajul este HTML. Pe WAP limbajul este WML. Aceste doua limbaje sunt in mare masura similare, de acea vom considera ca sunt exact la fel (in realitate insa nu sunt).
O pagina HTML foarte simpla ar putea arata asa:
<H1>Helo world!
Codul HTML de mai sus ar putea fi format in mod gresit. In primul rand tag-ul </H1> de sfarsit lipseste si ar trebui sa existe si o sectiune <HEAD> si <BODY> si asa mai departe. Totusi, toate browserele web obisnuite vor putea sa afiseze corect pagina de mai sus in mod corect.

Codul WML e mult mai strict. De exemplu, toate tag-urile trebuie inchise. Cu alte cuvinte, formatarea trebuie sa fie corecta, erorile nu pot fi acceptate. Motivul e ca, asa numita poarta WAP, cu capacitate foarte redusa, va converti codul WML intr-un format "comprimat" inainte de a fi trimis unui browser WAP.
Acelasi lucru care era mai sus, in WML ar trebui sa arate cam asa:
<?xml version="1.0"?>

<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "htp://www.wapforum.org/DTD/wml_1.1.xml">

<wml>

<card id="mycard" title="My first card">

<p>Helo world!</p>

</card>

</wml>

Cel mai important este header-ul. Prima litera care este receptionata de de browser trebuie sa fie < caracterul care incepe linia <?xml version="1.0">. orice alt caracter (chiar si un space) va sparge cardul.

Extensia de fisier .wml este extensia de fisier obisnuita pentru fisierele WML. Pentru WML, tipul MIME este text/vnd.wap.wml. Foarte putine servere web vin prefigurate astfel incat sa poata manipula fisierele WML, deci acest lucru trebuie facut inainte de a putea incepe sa oferiti pachete WML.

Componentele WAP, poarta WAP si browserul WML de obicei sunt foarte stricte in cea ce priveste erorile de sintaxa. Daca aveti probleme reduceti codul pana la limita minima. Acest lucru este valabil pentru primele doua linii ale codului care sunt definitiile XML si DTD iar daca vreti sa scrieti codul atunci e posibil sa apara multe erori. In versiunea WAP actuala, primele 21 caractere de cod trebuie sa fie dupa cum urmeaza. Trebuie excluse urmatoarele: spatii, carriage returns, line feds si orice alte caractere care nu apar mai jos.
<?xml version="1.0"?>

Daca pentru a testa codul utilizati un browser soft WML cum ar fi WinWAP sau WapMan, s-ar putea ca acesta sa nu functioneze pe un dispozitiv WAP real. Dispozitivele WAP reale sunt mult mai stricte decat emulatoarele.

Specificatiile WAP necesita utilizarea limbajului WML. E posibil sa fi auzit de dispozitive WAP care suporta HTML, insa nu se pune problema si in acest caz. Exista mai multe dispozitive fara fir asemanatoare cu dispozitivele WAP, insa acestea utilizeaza HTML pur (cum ar fi dispozitivele Microsoft Mobile Explorer care suporta atat HTML cat si WML). Dispozitivele MME sunt intr-adevar doua dispozitive complet diferite intr-o singura carcasa. Apoi mai exista variante HTML cum ar fi Compact HTML utilizat de browserele iMode. Pe scurt, daca vorbim de dispozitive WAP, vorbim de limbajul WML.

Exista mai multe motive pentru utilizarea limbajului WML in mediul WAP in locul limbajului HTML. Cel mai important motiv ar fi ca WML necesita latime de banda foarte redusa fata de HTML. Evident ca, odata cu introducerea tehnologiei care ofera o latime de banda mai mare pentru dispozitivele fara fir, acest motiv devine mai putin important. Totusi, vor mai trece cativa ani buni pana ce aceste tehnologii vor fi disponibile pe plan mondial.

Un alt motiv important este ca HTML-ul necesita o putere de procesare relativ mare pentru randare. Capacitatea de procesare inseamna putere, iar pe un dispozitiv fara fir, acest lucru inseamna consum de energie de pe baterii. Putere de procesare mai mica, inseamna baterii cu o durata de viata mai mare.

In plus, HTML necesita ecrane pentru afisarere mai mari decat cele de pe mobile. Desigur ca e posibil sa aveti ecrane mari pe telefoanele mobile sau alte dispozitive mobile, insa cu cat e mai mare dispozitivul, cu atat va fi mai putin mobil. Chiar si cu iMode care suporta culori si asezare in pagina similara cu HTML-ul, ecranele de afisare au ajuns deja la marimea maxima pe care cineva ar dori sa o duca cu sine in fiecare zi.

Paginile sau documentele WML se mai numesc si pachete(decks). Fiecare pachet consta din una sau mai multe carduri. Fiecare pachet incepe si se termina cu tag-ul <wml> , fiecare carte incepe si se termina cu un tag <card>.
Atunci cand un micro browser WML acceseaza un document WML (sau pachet), acesta citeste intregul pachet iar navigarea intre carduri se face fara a fi necesara incarcarea altor date. Acesta este un lucru important de stiut, toate cardurile din pachet se vor afla in memoria micro browserului WML pana ce browserul primeste comanda de reincarcare a intregului pachet.

Tag-ul <a name> de HTML si tag-urile <card> ale WML-ului sunt foarte asemanatoare.

<wml>
<card id="start_menu">
…some code…
</card>
<card id="purchase">
…some more code…
</card>
</wml>

Pachetele si cardurile sunt accesate astfel:
[deckname][#cardname].
Daca numele pachetului este omis, browserul va cauta un card numit cardname in pachetul care se afla la acel moment in memorie. Daca se omite #cardname, browserul va incarca pachetul numit deckname si va sari la primul card din pachet. Daca le includeti pe ambele, browserul va incarca pachetul numit deckname si va sari la cartea numita #cardname. Cu alte cuvinte, destul de asemanator cu tag-ul HTML <A NAME>.

Avand la intrare un fisier XML de forma :

<?xml version='1.0'?>

<Document id="xmlxslt" type=”view”>

<Title>Stiri bancare</Title>

<Date>16</Date>

<Info>BNR a respins solicitarea Jaquila de amanare a termenului pentru

majorarea capitalului BIR. Banca Nationala a Romaniei a respins marti , solicitarea grupului Jaquila de amanare, cu 10 zile …

</Info>

</Document>

Pentru transformarea in HTML se aplica un fisier XSLT de forma :

<?xml version='1.0'?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/2004/XSL/Transform" version="1.0">

<xsl:template match="/">

<HTML>

<BODY>

<B>Title: </B><xsl:value-of select="Document/Title" /><BR/>

<B>Date: </B><I><xsl:value-of select="Document/Date" /><BR/>

<B><xsl:value-of select="Document/Info"/> </B> <BR/>

</BODY>

</HTML>

</xsl:template>

</xsl:stylesheet>

Pentru transformarea in WML se poate aplica un fisier de forma :

<?xml version='1.0'?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/2004/XSL/Transform" version="1.0">

<xsl:output omit-xml-declaration="yes"/>

<xsl:template match="/">

<wml>

<card id="card1" title="DocumentView">

<p>

<b>Title: </b><xsl:value-of select="Document/Title" /><br/>

<b>Date: </b><i><xsl:value-of select="Document/Date" /></i><br/>

<b><xsl:value-of select="Document/Info" /> </b> <br/>

</p>

</card>

</wml>

</xsl:template>

</xsl:stylesheet>

De asemenea transformarea acestui document se face din server, fie din Java, fie din orice mediu de dezvoltare web pentru care exista un parser XML. De exemplu aceasta se poate face din Microsoft ASP astfel :

<%

'–Creeaza o instanta a unui document DOM –

Set xml = Server.CreateObject("MSXML2.DOMDocument")

xml.async = false

'– Incarca documentul XML–

xml.load (Server.MapPath("XMLDemo.xml"))

Set xsl = Server.CreateObject("MSXML2.DOMDocument")

xsl.async = false

'– Incarca coditiile de transformare XSLT –

xsl.load (Server.MapPath("WML.xsl"))

'–Seteaza tipul MYME –

Response.ContentType = "text/vnd.wap.wml"

'–Trimite headerele pentru WML –

Response.Write <?xml version='1.0'?>

Response.Write "<!DOCTYPE wml PUBLIC ""-//WAPFORUM//DTD " & _

"WML 1.1//EN"" ""http://www.wapforum.org/DTD/wml_1.1.xml"">"

'–Aici se executa transformarea –

Response.write (xml.transformNode(xsl))

%>

Fisierul de mai sus foloseste parserul XML de la Microsoft MSXMLL3.

Implementare solutie pentru dispozitive offline cu posibilitate de stocare (palmOS)

Dispozitivele Palm pot rula din punctul de vedere al utilizatorului de internet doua tipuri de aplicatii : aplicatii “web-clipping” care pot fi considerate mini pagini web si aplicatii normale GUI. In functie de aplicatia rulata acestea mai pot folosi un “conduit” (care este un program ce ruleaza pe calculatorul de birou la care este legat Palmul pentru sincronizare si pentru actualizarea datelor – e-mail, documente, agenda).

Aplicatii Web Clipping (WCA)

Pentru designerii web cat si pentru utilizatorii incepatori este mult mai simplu sa creeze o aplicatie WCA in locul unei aplicatii traditionale. Un set de aplicatii WCA sunt de fapt niste pagini html comprimate intr-un anumit format binar numit PQA (aplicatii de interogare Palm) si care se pot downloada si rula. Utilizatorii completeaza paginile HTML date de aceste dispozitive. Cand ei apasa butonul Send, aplicatia care le interpreteaza se manifesta intocmai ca un browser web si prin intermediul proxyului Palm.net le translateaza in cereri HTTP si le forwardeaza serverului web al companiei. In mod normal acestea sunt preluate de un script CGI care genereaza pagina urmatoare. Aceasta pagina este data proxyului Palm.net care o comprima , o formateaza conform standardului PQA si o trimite deviceului.

Pentru a crea aplicatii WCA se scriu o serie de pagini HTML si se ruleaza prin Web Clipping Application Builder.

Chiar daca a crea pagini WCA este similar cu a crea alte aplicatii web ele arata destul de diferit. Paginile WCA trebuie sa fie mici si compacte deoarece sunt destinate unui ecran mic si sa poata fi descarcate pe o conexiune lenta de date. Icoanele pentru aplicatii WCA sunt aratate in meniu de start la fel ca orice alta aplicatie palm. De fapt ele ruleaza in cadrul unei aplicatii speciale numita WCAViewer si in momentul in care sunt selectate de utilizator acesta arata continutul lor.

Aplicatii PalmOS

Aplicatiile GUI care ruleaza pe dispozitivele Palm sunt in general aplicatii simple, cu un singur thread, gestionate printr-o coada de evenimente. O singura aplicatie ruleaza la un moment dat. Utilizatorii nu ies dintr-o aplicatie, ei pur si simplu aleg sa ruleze alta aplicatie. Ca raspuns palm-ul opreste aplicatia curenta si lanseaza cea nou selectat. Desi sistemul este orientata pe evenimente el poate face taskuri si in afara cozii de evenimente la cererea sistemului. De exemplu daca utilizatorul foloseste facilitatea Find pentru a cauta toate aplicatiile pentru un anumit cuvant fiecare aplicatie e lansata si cauta in baza de date pentru o inregistrare continand cuvantul respectiv.

Programele PalmOS sunt compilate in fisiere PRC si apoi downloadate pe dispozitiv. Acelasi program ruleaza pe toate dispozitivele Palm chiar daca acesta e facut de Handspring, Symbol sau Sony. Unele dispozitive au totusi facilitati individuale care pot fi implementate.

Mediile de dezvoltare pentru PalmSO sunt intr-o gama mare de limbaje de la C, C++ pana la Basic sau Java. Fiecare alege un mediu de dezvoltare pe baza experientei personale. Cel mai folosit limbaj este C si add-ons sunt disponibile pentru a folosi C++. Cu aplicatiile scrie in C sau C++ , sistemul de operare PalmOS are mai multe functionalitati pentru aplicatie din punct de vedere al managementului memoriei, desenatul pe ecran si altele.Pentru a rula Basic sau Java este nevoie de un program care va trebui sa existe pe dispozitiv pentru a putea rula programul. Astfel acestea nu sunt la fel de compacte ca si aplicatiile scrise in C. In mod normal aceste programe suplimentare sunt libere pentru utilizator iar unealta de dezvoltare poate sa adauge diferite beneficii care sa mareasca codul generat.

Daca se alege C sau C++ Palm ofera gratis un SDK, impreuna cu fisierele header si un numar de progame auxiliare care pot fi de ajutor.

Aplicatiile PalmOS sunt bazate pe faptul ca o singura aplicatie poate rula la un moment dat. Astfel o singura aplicatie poate citi din coada de evenimente a sistemului, si unei singure aplicatii la un moment dat ii revine controlul.

// PilotMain

DWord PilotMain(Word cmd, Ptr cmdPBP, Word launchFlags)

{

Word error;

error = RomVersionCompatible (version20, launchFlags);

if (error)

return error;

if (cmd != sysAppLaunchCmdNormalLaunch) return sysErrParamErr;

StartApplication();

FrmGotoForm(CurrentView);

EventLoop();

StopApplication();

return 0;

}

Pot exista mai multe versiuni de sistem de operare, fiecare cu functiile lui si pentru a nu avea probleme primul pas in dezvoltarea unei aplicatii este de a verifica versiunea acestuia.

De fiecare data cand se porneste o aplicatie aceasta primeste si un cod de pornire. Acesta este folosit pentru a putea avea facilitati multi-tasking la nivel de sistem de operare desi la nivel de aplicatie nuexista suport pentru aceasta din motive de licentiere a sistemului. Astfel fiecare aplicatie indiferent de starea ei poate primi diferite coduri de pornire de la sistem (de ex pentru cautarea globala in toate bazele de date indiferent de formatul acestora).

Fiecare aplicatie are o functie ce se ocupa de preluarea evenimentelor din coada de mesaje sistem si distribuirea acestora incepand cu sistemul, apoi cu sistemul de meniuri si la sfarsit cu functia de tratare din aplicatie. Astfel se pot intercepta mesaje sistem si ignora (de ex. se poate face o aplicatie – de obicei folosit la jocuri – sa nu se poata iesi din ea decat cu confirmare.

//Event Loop

static void EventLoop(void)

{

EventType event;

Word error;

do

{

EvtGetEvent(&event, evtWaitForever);

if (! SysHandleEvent(&event))

if (! MenuHandleEvent(0, &event, &error))

if (! ApplicationHandleEvent(&event))

FrmDispatchEvent(&event);

}

while (event.eType != appStopEvent);

}

Din punct devedere user-interface ecranul este folosit de form-uri. Acestea trebuiesc asociate cu coada lor de evenimente astfel incat sa se poata activa independent si la activare fiecare sa primeasca evenimentele componentelor proprii :

// ApplicationHandleEvent

static Boolean ApplicationHandleEvent(EventPtr event)

{

FormPtr frm;

Word formId;

Boolean handled = false;

if (event->eType == frmLoadEvent)

{

// Load the form resource specified in the event then activate the form.

formId = event->data.frmLoad.formID;

frm = FrmInitForm(formId);

FrmSetActiveForm(frm);

// Set the event handler for the form. The handler of the currently

// active form is called by FrmDispatchEvent each time it receives an event.

switch (formId)

{

case NetPortalMainForm:

FrmSetEventHandler(frm, MainFormHandleEvent);

break;

case NetPortalViewForm:

FrmSetEventHandler(frm, ViewFormHandleEvent);

break;

case NetPortalStartForm:

FrmSetEventHandler(frm, StartFormHandleEvent);

break;

case NetPortalServPrefForm:

FrmSetEventHandler(frm, ServPrefFormHandleEvent);

break;

case NetPortalPrefForm:

FrmSetEventHandler(frm, PrefFormHandleEvent);

break;

case NetPortalPlugginForm:

FrmSetEventHandler(frm,PlugginFormHandleEvent);

break;

case NetPortalTablePlugginForm:

FrmSetEventHandler(frm,TablePlugginFormHandleEvent);

break;

}

handled = true;

}

return handled;

}

Aplicatia foloseste mai multe tipuri de formuri pentru fiecare tip de document. Astfel exista un form pentru Configurare, unul pentru vedere de tip View, unul de tip Info si altul de tip Table. De asemenea pentru a fii mai usor de folosit exista un form initial de tip mai special – un form View cu 4 elemente. Asta pentru a putea avea acces rapid la 4 cele mai folosite documente.

Conduit-uri

Un conduit este un plug-in in tehnologia HotSync care se activeaza in momentul cand se apasa butonul HotSync® de pe suportul dispozitivului sau de pe modem. Un conduit sincronizeaza datele intre aplicatia de pe palm si calculatorul personal.

Daca se doreste de ex. arhivarea datelor pe PC exista un conduit de baza numit BackUp. In acest caz tot ce trebuie facut este sa se seteze un bit in baza de date care trebuie arhivate si care sa indice ca datele trebuie salvate. Nici un alt conduit nu mai este necesar. De exemplu pentru o baza de date mai speciala un conduit trebuie sa citeasca informatia de pe palm inregistrare cu inregistrare, sa co converteasca pentru PC si sa o scrie in baza de date de pe PC (care poate sa fie un fisier Excel sau orice altceva).

Conduiturile sunt scrise folosind Visual C++ sau Visual Basic si PalmCDK. La fel ca si SDKul pentru partea de aplicatie , CDK ofera acces la functiile SyncManager si unelte ajutatoare si documentatie. De asemenea ofera cateva

exemple de conduituri pentru a intelege logica si pentru a le adapta usor uzului personal.

In afara CDK o serie de solutii oferite de alti producatori exista si ajuta la dezvoltarea acestora. Programele care sincronizeaza aplicatiile de pe Palm cu un servere se numesc tot conduit dar diferenta fata de cele construite cu CDK este ca ele nu se bazeaza pe SyncManager.

Aplicatia conduit este de fapt un dll ce trebuie sa respecte o anumita regula de apelare a functiilor.HotSync Manager apeleaza in principal functia OpenConduit si altele daca sunt implementate. Aceastei functii ii revine sarcina de a sincroniza baza de date de pe desktop cu baza de date de pe PDA. In cazul interfetei aceasta functie aduce continut XML prin HTTP si il inregistreaza in bazele de date de pe PDA (baze care sunt automat descoperite la pronirea programului).

ExportFunc long OpenConduit(PROGRESSFN pFn, CSyncProperties& rProps)

{

AFX_MANAGE_STATE(AfxGetStaticModuleState());

long retval = 0;

byte hRemoteDatabase=0;

CONDHANDLE conduitHandle = (CONDHANDLE)0;

if (retval = SyncRegisterConduit(conduitHandle))

return(retval);

if (ReadConfiguration()) {

statusServNo = 0;

statusDocWritten = 0;

pStatusDlg = new CStatusDlg();

if (pStatusDlg->Create(IDD_DIALOG1,NULL) ) {

pEdit1 = (CEdit *) pStatusDlg->GetDlgItem(IDC_EDIT1);

pEdit2 = (CEdit *) pStatusDlg->GetDlgItem(IDC_EDIT2);

}

rProps.m_SyncType = GetSyncDirection();

if (sprefS.enabled)

switch (rProps.m_SyncType)

{

case ePCtoHH:

retval = CopyPCtoHH(rProps, hRemoteDatabase);

break;

case eHHtoPC:

case eFast:

case eSlow:

break;

default:

break;

}

if (statusDocWritten>0)

statusServNo++;

if (statusServNo>1)

WriteConfiguration();

else {

CString aux;

aux.Format("NetPortal: Eroare aducere documente – %d.\n",statusServNo);

if (statusServNo!=0)

SyncAddLogEntry(aux);

}

if (pStatusDlg) {

pEdit1 = NULL;

pEdit2 = NULL;

pStatusDlg->DestroyWindow();

delete pStatusDlg;

}

SyncAddLogEntry("Sincronizare cu succes OK.\n");

}

SyncUnRegisterConduit(conduitHandle);

return(retval);

}

Se remarca functiile de inregistrare a conduitului in spatiul managerului, de citire a configuratiei, de initializare a dialogurilor pentru afisarea starii in momentul configurarii, apoi de sincronizare de tip PC to HandHeld si de terminare a operatiei de sincronizare impreuna cu un mesaj in log.

Tipurile de sincronizare ale dispozitivelor pot fi PC to HandHeld (se aduc date din Internet si se incarca in bazele de date de pe palm – in cazul nostru), HH to PC (daca s-au produs modificari in bazele de date de pe palm acestea sunt updatate pe desktop (o posibila aplicatie ce foloseste aceasta metoda este cea de trimis mailuri, mail care sta pe PDA pana la prima sincronizare cand este trimis la destinatar). Deoarece operatiile de sincronizarea dureaza destul de mult exista definite modurile slow si fast care pot fi folosite pentru a decide daca operatia curenta este una in care utilizatorul doreste doar sincronizarea rapida sau este dispus sa astepte pentru o sincronizare completa.

In partea de conduit la fel de importanta este si functia de aducere a documentelor WEB de pe internet :

int GetWebDocument(CString url,CString &result) {

unsigned long rc;

result.Empty();

try {

CString strServerName;

INTERNET_PORT nPort;

DWORD dwServiceType;

CInternetSession *pSession;

CString szStrObject;

if (!AfxParseURL(url, dwServiceType, strServerName, szStrObject, nPort) ||

dwServiceType != INTERNET_SERVICE_HTTP){

SyncAddLogEntry("NetPortal Eroare: Nu se pot folosi decat URL-uri care incep cu http://\n") ;

return 0;

}

pSession=new CInternetSession("Mozilla/4.6 [en] (WinNT; I)",

1,INTERNET_OPEN_TYPE_PRECONFIG);

if (pSession==NULL) {

SyncAddLogEntry("NetPortal: Nu se poate deschide conexiunea internet.\n") ;

return 0;

}

int m_nTimeOut = 60000;

pSession->SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,m_nTimeOut);

pSession->SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT,m_nTimeOut);

pSession->SetOption(INTERNET_OPTION_SEND_TIMEOUT,m_nTimeOut);

pSession->SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT,m_nTimeOut);

pSession->SetOption(INTERNET_OPTION_DATA_SEND_TIMEOUT,m_nTimeOut);

CHttpConnection *pServer = NULL;

CHttpFile *pFile = NULL;

pServer=pSession->GetHttpConnection(strServerName,0,nPort,NULL,NULL);

pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET,szStrObject,NULL, 1);

if (pFile->SendRequest()) {

CString st;

while (pFile->ReadString(st)) {

result+=st;

}

}

else

LogAddEntry("URL nu exista :"+url,slText,false);

if (!pFile->QueryInfoStatusCode(rc))

rc=501;

pFile->Close();

pSession->Close();

delete pSession;

} catch (CException *)

rc = 501;

return rc;

}

Functia foloseste clasele standard din MFC si are un sistem de tratare a erorilor pe baza de try…catch. Functia citeste linie cu linie datele de raspuns si le intoarce intr-un obiect de tip string. Rezultatul functiei este codul de eroare al operatiei de citire conform cu standardul HTTP (200 insemna OK). De remarcat ca in cazul unui URL redirector aceasta functie (ce intoarce 301) aduce documentul final.

Aceste date sunt apoi prelucrate si introduse in dispozitiv. Prelucrarile efectuate inainte de aducerea datelor in dispozitiv tin de reordonara numerelor intregi in format big-endian (specific procesoarelor Motorola) spre deosebire de little-endian cum este pe arhitectura Intel 80×86.

Datele sunt scrise in baza de date pe baza de inregistrari , in program folosind de fapt doua tipuri de realizare a coduiturilor. Astfel am implementat partea de acces si functia OpenConduit specifica programarii API iar partea de scriere a inregistrarilor am implementat-o folosind CRawRecordInfo ce tine de porgramarea MFC a acestora. Am folosit aceasta deoarece asa este mult mai simplu. Am incercat astfel sa imbinam avantajele fiecarui tip de programare.

Un exemplu de scriere in baza de date este dat mai jos pentru citirea URLului de unde se doreste sincroizarea, URL configurabil din PDA :

BOOL ReadConfiguration() {

byte hdl;

unsigned short recNo;

CRawRecordInfo rawRecord;

BOOL rc = TRUE;

if (SyncOpenDB("NetPortalDBConf",0,hdl) ==0) {

if (SyncGetDBRecordCount(hdl,recNo)!=0)

recNo = 0;

if (recNo>0) {

memset(&rawRecord, 0, sizeof(CRawRecordInfo));

rawRecord.m_FileHandle = hdl;

rawRecord.m_RecIndex = 0;

// allocate memory for the raw record

AllocateRawRecordMemory(rawRecord, sizeof(sprefS));

if (SyncReadRecordByIndex(rawRecord)==0) {

memcpy(&sprefS,rawRecord.m_pBytes,sizeof(sprefS));

memcpy(&sprefSOrig,rawRecord.m_pBytes,sizeof(sprefS));

}

else {

sprefSOrig.enabled = FALSE;

strcpy(sprefSOrig.server,"http://");

}

FreeRawRecordMemory(rawRecord);

ConvertShort((__int16*)&sprefS.port); //aici se converteste din big in little endian

}

else {

prefS.docSize = 10; //dimensiunea maxima a unui document

prefS.Flags = 0;

prefS.memSize = 400; //memoria maxima folosita in PDA

prefS.minBetween = 300; //la ce interval minim se face sincronizarea

CTime tt2 = CTime::GetCurrentTime();

CTimeSpan tt1(0,0,prefS.minBetween + 10,0);

tt2 = tt2 – tt1;

prefS.lastTime = tt2.GetTime();

prefSOrig = prefS;

}

}

else rc = FALSE;

SyncCloseDB(hdl);

long cTime,xx;

SyncReadSysDateTime(cTime);

CTimeSpan tt(cTime – prefSOrig.lastTime);

xx = tt.GetTotalMinutes();

xx -= prefS.minBetween;

if ( xx<=0 ) {

CString ee;

ee.Format("OK NetPortal: nu au trecut inca %ld minute de la ultima sincronizare.\n", prefS.minBetween);

SyncAddLogEntry(ee);

rc = FALSE;

}

}

else {

SyncAddLogEntry("OK NetPortal: nu s-a configurat aplicatia.\n");

rc = FALSE;

}

return rc;

}

6. Concluzii

Atat tehnologiile folosite care sunt de ultima actualitate, unele nici macar in faza de standard ci doar de propuneri fac din acest proiect unul de actualitate. De asemenea scopul declarat de a imbunatati modul de prezentare a informatiei sau poate chiar de a inlocui mediile clasice intaresc afirmatia de mai sus.

Prin extinderea acestuia cu formulare sau taguri de formatare pentru dispozitive mai avansate tehnologic, desi se pierde din universalitatea lui, se pot atrage mai mult utilizatori.Aceasta si deoarece continutul extins si bine prezentat este cheia succesului unei aplicatii PDA.

Solutia a pornit de la o idee simpla , de fapt de la o automatizare a procesului tehnologic de producere a continutului pentru PDA-uri si printr-o prelucrare atenta s-a obtinut una de efect. Utilitatea acesteia se poate constata din primul moment de folosire. Folosirea tehnologiilor existente si efortul redus pentru implementarea ei vin in sprijinul simplitatii si usurintei de aplicare.

Solutia preia partea de procesare de pe dispozitivul mobil si o transfera pe serverele furnizorului de informatie astfel reducand costurile dispoztivelor sau chiar cheltuielile de folosire prinoptimizarea latimii de banda. De asemena in asociere cu o retea de date radio poate inlocui cu succes mediile de informare conventionale (ziare, buletine electronice) intrucat se poate folosi si in “timpul mort” (in mijloacele de transport, in asteptarea unor evenimente etc.).

Solutia este una generala si se poate usor adapta oricaror noi dispozitive sau standarde. Astfel s-a remarcat impunerea pe piata a dispozitivelor cu sistem de operare epoc sau i-mode in defavoarea celor cunoscute si crezute imbatabile. Astfel odata cu rasturnarile ce au loc pe piata dispozitivelor mobile, solutia isi pastreaza carateristicile din cauza faptului ca acestea pot fi usor adaptate.

7. Bibliografie

Pagini web :

– de prezentare al clientilor Air2Web si al unor companii ce folosesc astfel de solutii :

http://www.air2web.com/wireless_liveapps.jsp

http://www.ups.com/bussol/solutions/wireless/pda.html

http://www.basshotels.com/priorityclub?_template=wrless_main.html

– exemple de transformare din XML in HTML si din XML inWML cu ajutorul XSLT si X-Path

http://www.wirelessdevnet.com/channels/wap/training/xslt4.html

http://www.wirelessdevnet.com/channels/wap/training/xslt_wml.html

http://www.xml.com

http://www.w3.org/XML

http://www.ucc.ie/xml

– documente in format PDF :

– Mobile commerce and WML : Kimmo Rytkönen, http://www.tietoenator.com

– MoDAL – Mobile Document Application Language :

http://www.almaden.ibm.com/cs/TSpaces/MoDAL/

– OpenCOLA : Open Collaborative Object Lookup Architecture

– http://www.opencola.com/

– Simeon Simeonov : The Evolution of XML Protocols , XML Journal nr. 3.

– Mahesh Chulet : A Quick Guide to WML , XML Lournal nr 5.

Extensible Stylesheet Language (XSL) Version 1.0, W3C Working Draft 27 March 2000

Nokia : Nokia WAP Toolkit Developer’s Guide.

J. Dale Gonzales : A roadmap to Wireless.

– Documentatii Palm

http://www.palm.net/

http://www.palmgear.com/

http://www.palminfocenter.com/

http://www.palmdigitalmedia.com/

Palm Computing Platform – Web Clipping Guide (www.palmos.com)

–-~~~~–– – Conduit Programmer’s Companion for Windows

–-~~~~–– – PalmOS ® Programmers Companion

8. Anexa 1 – Sursa Program PalmOS scris cu CodeWarrior 6.0

#include <PalmOS.h>

#include <PalmCompatibility.h>

#include "NetPortalRsc.h"

#include "NetPortal.h"

/***********************************************************************

* Global defines for this module

**********************************************************************/

#define version20 0x02000000

// Application database management defines.

#define NetPortalAppType '2349'

#define NetPortalDBType 'NPDB'

#define NetPortalDBConfType 'NPDC'

#define NetPortalDBPlugginType 'NPPL'

#define NetPortalDBName "NetPortalDB"

#define NetPortalDBConfName "NetPortalDBConf"

#define NetPortalDBPlugginName "NetPortalDBPluggin"

#define noRecordSelected -1

/***********************************************************************

* Global variables for this module

**********************************************************************/

static Word CurrentView,CurrentPluggin;

static DmOpenRef NetPortalDB;

static Word CurrentRecord;

static Boolean MainFormStarted;

static FontID ViewLastFont;

static Char SearchText[100];

static ScrollBarPtr scrollView;

static Char docTitle[100],viewTitle[10];

static Boolean bPrev,bNext;

static int oldPointY;

static Boolean clipCopy;

static NPPlugginTablePtr TablePlugginPtr;

static int TablePlugginFirstRec;

static UInt32 lastTimeUpdated;

static Word scrollRight;

static int PlugginType[3]={NetPortalTablePlugginForm,NetPortalPlugginForm,NetPortalPlugginForm};

/***********************************************************************

* Prototypes for internal functions

**********************************************************************/

static void StartApplication(void);

static void StopApplication(void);

static FieldPtr GetFocusObjectPtr(void);

static Boolean CreateRecord(void);

static void EditDoMenuCommand(Word command);

static void EditSaveData(FieldPtr fld);

static void ViewRetrieveData(FormType *frm,UInt16 fldIndex);

static Boolean HandleEvent(EventPtr event);

static void MainFormListDrawItem(Int itemNum,

RectanglePtr bounds, CharPtr *itemsText); // P8. draw an item in the main list

static int MainFormInit(void);

static Boolean MainFormHandleEvent(EventPtr event);

static Boolean ApplicationHandleEvent(EventPtr event);

static void EventLoop(void);

void TableDrawRecord (void *tableP,Int16 row, Int16 column, RectangleType *bounds) ;

static FieldPtr GetFocusObjectPtr(void){

FormPtr frm;

Word focus;

frm = FrmGetActiveForm();

focus = FrmGetFocus(frm);

if (focus == noFocus)

return(NULL);

return(FrmGetObjectPtr(frm, focus));

}

//intoarce 0 daca e doc field , 1 altfel , 2 daca e in afara.

static int IsDocField(int recordNo,int delta){

VoidHand recHandle;

NPDocPtr rec;

int rc;

if (recordNo == -1)

return 4;

recordNo +=delta;

if (0 <= recordNo && recordNo<DmNumRecords(NetPortalDB)) {

recHandle = DmQueryRecord(NetPortalDB, recordNo);

rec = (NPDocPtr)MemHandleLock(recHandle);

if (rec->nDoc !=0)

rc = 0;

else

rc = 1;

MemHandleUnlock(recHandle);

} else

rc = 2;

return rc;

}

static int SearchNPBD(char SearchText[],int initial){

VoidHand recHandle;

NPDocPtr rec;

int last = DmNumRecords(NetPortalDB),recordNo;

for(recordNo = initial ; recordNo<last;recordNo ++) {

recHandle = DmQueryRecord(NetPortalDB, recordNo);

rec = (NPDocPtr)MemHandleLock(recHandle);

if (StrStr(rec->data,SearchText)!=NULL) {

return recordNo;

}

// Unlock the handle to the record.

MemHandleUnlock(recHandle);

}

return -1;

}

static void ViewRetrieveData(FormType *frm,UInt16 fldIndex){

VoidHand recHandle;

NPDocPtr rec;

Char *ptr;

FieldPtr fld = FrmGetObjectPtr(frm,fldIndex),title;

ControlPtr btn;

FldSetFont(fld,ViewLastFont);

if (CurrentRecord != noRecordSelected && DmNumRecords(NetPortalDB) > 0)

{

recHandle = DmQueryRecord(NetPortalDB, CurrentRecord);

rec = (NPDocPtr)MemHandleLock(recHandle);

ptr = rec->data+ rec->nTitle;

FldSetTextPtr(fld,ptr);

StrNCopy(docTitle,rec->data,rec->nTitle);

docTitle[rec->nTitle] = '\0';

StrCopy(viewTitle,rec->ora);

MemHandleUnlock(recHandle);

FrmSetTitle(frm,viewTitle);

title = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalViewTitleField));

FldSetTextPtr(title,(Char*)&docTitle);

FldSetSelection(fld,0,0);

FldSetScrollPosition(fld,0);

btn = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalViewClipboardPushButton));

CtlSetValue(btn,0);

FldRecalculateField(fld,true);

FrmEraseForm(frm);

FrmDrawForm(frm);

}

}

static void ErrorBeep(){

SndCommandType snd;

int i;

snd.cmd = sndCmdNoteOn;

snd.param1 = 20;

snd.param2 = 3000;

snd.param3 = 0;

i = SndDoCmd(NULL,&snd,0);

}

static void MainFormListDrawItem(Int itemNum, RectanglePtr bounds, CharPtr *itemsText)

{

Handle recHandle;

NPDocPtr rec;

UInt x;

Int textLen, lstWidth;

Boolean fits;

Char buf[100], *bufPtr,buf2[]="…";

Boolean channel;

RectangleType rWin = *bounds;

int n;

recHandle = DmQueryRecord(NetPortalDB, itemNum);

rec = (NPDocPtr)MemHandleLock(recHandle);

channel = (rec->nDoc ==0);

if (channel) {

textLen = rec->nTitle+0; //3 daca linia de mai sus

(textLen>=100)? textLen = 100:0;

StrNCopy(buf,rec->data,textLen); // 2 de la "> " si conventia de strcat

}

else {

StrCopy(buf,rec->ora);

StrCat(buf," ");

textLen = StrLen(buf)+rec->nTitle+1;

(textLen>=100)? textLen = 100:0;

StrNCat(buf,rec->data,textLen);

}

if (scrollRight>StrLen(buf))

bufPtr = buf2;

else {

n = scrollRight;

while ( (n>0)&&(buf[n]!=' ') )

n–;

if (n)

n++;

bufPtr = buf + n;

}

MemHandleUnlock(recHandle);

rec = NULL;

lstWidth = bounds->extent.x – 2;

FntCharsInWidth(bufPtr, &lstWidth, &textLen, &fits);

if (!fits) {

bufPtr[textLen-1]='.';

bufPtr[textLen-2]='.';

bufPtr[textLen-3]='.';

}

// Now draw the text from the record.

x = bounds->topLeft.x;

if (channel ) {

WinInvertRectangle(&rWin,0);

WinDrawInvertedChars(bufPtr, textLen, x, bounds->topLeft.y);

}

else

WinDrawChars(bufPtr, textLen, x, bounds->topLeft.y);

}

static int OpenDBNews(){

Word error;

UInt cardNo;

LocalID dbID;

UInt dbAttrs;

UInt mode;

mode = dmModeReadWrite;

NetPortalDB = DmOpenDatabaseByTypeCreator(NetPortalDBType, NetPortalAppType, mode);

if (! NetPortalDB) {

error = DmCreateDatabase(0, NetPortalDBName, NetPortalAppType, NetPortalDBType, false);

ErrFatalDisplayIf(error, "Could not create new database.");

NetPortalDB = DmOpenDatabaseByTypeCreator(NetPortalDBType, NetPortalAppType, mode);

error = DmOpenDatabaseInfo(NetPortalDB, &dbID, NULL, NULL, &cardNo, NULL);

ErrFatalDisplayIf(error, "Could not get database info.");

error = DmDatabaseInfo(0, dbID, NULL, &dbAttrs, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

ErrFatalDisplayIf(error, "Could not get database info.");

error = DmSetDatabaseInfo(0, dbID, NULL, &dbAttrs, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

ErrFatalDisplayIf(error, "Could not set database info.");

}

CurrentRecord = noRecordSelected;

return 1;

}

static int MainFormInit(void)

{

FormPtr frm;

ListPtr lst;

UInt numRecords;

if (!MainFormStarted) {

MainFormStarted = true;

scrollRight = 0;

OpenDBNews();

}

frm = FrmGetActiveForm();

numRecords = DmNumRecords(NetPortalDB);

if (numRecords) {

lst = FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, NetPortalMainMemolistList));

LstSetListChoices(lst, NULL, numRecords);

LstSetDrawFunction(lst, MainFormListDrawItem);

if ( (0<=CurrentRecord) && (CurrentRecord <numRecords)) {

LstSetSelection(lst,CurrentRecord);

LstSetTopItem(lst,CurrentRecord);

}

}

else {

lst = FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, NetPortalMainMemolistList));

LstSetListChoices(lst,NULL,0);

FrmAlert (DbEmptyAlert);

FrmDrawForm(frm);

if (MainFormStarted) {

MainFormStarted = false;

DmCloseDatabase(NetPortalDB);

NetPortalDB = 0;

}

CurrentView = NetPortalServPrefForm;

FrmGotoForm(CurrentView);

return 0;

}

FrmDrawForm(frm);

return 1;

}

static void ViewDoMenuCommand(Word command) {

FormPtr frm = FrmGetActiveForm();

FieldPtr fld;

ControlPtr btn;

Word fldIndex,a,b;

Char *pText,*pSearch;

switch (command) {

case ViewGoHome:

CurrentView = NetPortalMainForm;

FrmGotoForm(CurrentView);

break;

case ViewGoPrevious:

if (IsDocField(CurrentRecord,-1)==0) {

if (!bNext) {

bNext = true;

btn=FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalViewNextButton));

CtlShowControl(btn);

}

CurrentRecord–;

fldIndex = FrmGetObjectIndex(frm, NetPortalViewEditFieldField);

ViewRetrieveData(frm, fldIndex);

FrmDrawForm(frm);

FrmSetFocus(frm, fldIndex);

if (IsDocField(CurrentRecord,-1)!=0){

bPrev = false;

btn=FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalViewPrevButton));

CtlHideControl(btn);

}

}

else {

bPrev = false;

btn=FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalViewPrevButton));

CtlHideControl(btn);

}

break;

case ViewGoNext:

if (IsDocField(CurrentRecord,1)==0) {

if (!bPrev) {

bPrev = true;

btn=FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalViewPrevButton));

CtlShowControl(btn);

}

CurrentRecord++;

fldIndex = FrmGetObjectIndex(frm, NetPortalViewEditFieldField);

ViewRetrieveData(frm, fldIndex);

FrmDrawForm(frm);

FrmSetFocus(frm, fldIndex);

if (IsDocField(CurrentRecord,1)!=0){

bNext = false;

btn=FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalViewNextButton));

CtlHideControl(btn);

}

}

else {

bNext = false;

btn=FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalViewNextButton));

CtlHideControl(btn);

}

break;

case EditCopytoclipboard:

btn = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalViewClipboardPushButton));

fld = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm, NetPortalViewEditFieldField));

FldGetSelection(fld,&a,&b);

if (a==b)

if (CtlGetValue(btn)==0)

CtlSetValue(btn,1);

else {

FldCopy(fld);

FldSetSelection(fld,0,0);

CtlSetValue(btn,0);

}

else

FldCopy(fld);

break;

case EditFind:

fld = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm, NetPortalViewEditFieldField));

pText = FldGetTextPtr(fld) + FldGetScrollPosition(fld);

frm = FrmInitForm(NetPortalFindForm);

FrmSetFocus(frm,FrmGetObjectIndex(frm,NetPortalFindFindField));

if (FrmDoDialog(frm) == NetPortalFindOkButton) {

fld = FrmGetObjectPtr(frm, FrmGetObjectIndex(frm,NetPortalFindFindField));

StrNCopy(SearchText,FldGetTextPtr(fld),sizeof(SearchText)-1);

FrmDeleteForm(frm);

pSearch = StrStr(pText,SearchText);

if (pSearch!=NULL) {

frm = FrmGetActiveForm();

fld = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm, NetPortalViewEditFieldField));

pText = FldGetTextPtr(fld);

fldIndex = pSearch – pText;

FldSetSelection(fld,fldIndex,fldIndex+StrLen(SearchText));

FldSetScrollPosition(fld,fldIndex);

} else

FrmAlert(NotFoundAlert);

}

else

FrmDeleteForm(frm);

break;

case OptionsIncreaseFont:

fld = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm, NetPortalViewEditFieldField));

ViewLastFont = largeFont;

FldSetFont(fld,ViewLastFont);

break;

case OptionsDecreaseFont:

fld = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm, NetPortalViewEditFieldField));

ViewLastFont = stdFont;

FldSetFont(fld,ViewLastFont);

break;

case OptionsAbout:

// Load the info form, then display it.

frm = FrmInitForm(NetPortalInfoForm);

FrmDoDialog(frm);

// Delete the info form.

FrmDeleteForm(frm);

break;

}

}

static void MainDoMenuCommand(Word command) {

FormPtr frm;

ListPtr lst;

FieldPtr fld;

Word futureRecord;

int aux,numRecords;

frm = FrmGetActiveForm();

lst = FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, NetPortalMainMemolistList));

switch (command) {

case GoHome:

frm = FrmGetActiveForm();

// Close the application's database.

if (MainFormStarted) {

MainFormStarted = false;

DmCloseDatabase(NetPortalDB);

NetPortalDB = 0;

}

FrmEraseForm(frm);

CurrentView = NetPortalStartForm;

FrmGotoForm(CurrentView);

break;

case GoPrevious:

futureRecord = LstGetSelection(lst)-1;

while ((aux=IsDocField(futureRecord,0))==0)

futureRecord–;

if (aux ==1) {

CurrentRecord = futureRecord;

LstSetTopItem(lst,CurrentRecord);

LstEraseList(lst);

LstDrawList(lst);

LstSetSelection(lst,CurrentRecord);

}

break;

case GoNext:

futureRecord = LstGetSelection(lst)+1;

while ((aux=IsDocField(futureRecord,0))==0)

futureRecord++;

if (aux ==1) {

CurrentRecord = futureRecord;

LstSetTopItem(lst,CurrentRecord);

LstEraseList(lst);

LstDrawList(lst);

LstSetSelection(lst,CurrentRecord);

}

break;

case GoFind:

aux = LstGetSelection(lst);

if (aux == noListSelection)

aux = 0;

frm = FrmInitForm(NetPortalFindForm);

/* fld = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalFindFindField));

mem = FldGetTextHandle(fld);

FldSetTextHandle(fld,NULL);

ptr = MemHandleLock(mem);

StrCopy(ptr,SearchText);

MemHandleUnlock(mem);

FldSetTextHandle(fld,mem);

*/

FrmSetFocus(frm,FrmGetObjectIndex(frm,NetPortalFindFindField));

if (FrmDoDialog(frm) == NetPortalFindOkButton) {

fld = FrmGetObjectPtr(frm, FrmGetObjectIndex(frm,NetPortalFindFindField));

StrNCopy(SearchText,FldGetTextPtr(fld),sizeof(SearchText)-1);

FrmDeleteForm(frm);

aux = SearchNPBD(SearchText,aux+1);

if (aux !=-1) {

frm = FrmGetActiveForm();

lst = FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, NetPortalMainMemolistList));

CurrentRecord = aux;

LstSetTopItem(lst,CurrentRecord);

LstEraseList(lst);

LstDrawList(lst);

LstSetSelection(lst,CurrentRecord);

}

else

FrmAlert(NotFoundAlert);

}

else

FrmDeleteForm(frm);

break;

case NavigateDelete:

CurrentRecord = LstGetSelection(lst);

if (FrmAlert(DeleteAlertAlert)==DeleteAlertOK)

switch (IsDocField(CurrentRecord,0)) {

case 0:

LstEraseList(lst);

DmRemoveRecord(NetPortalDB,CurrentRecord);

numRecords = DmNumRecords(NetPortalDB);

LstSetListChoices(lst, NULL, numRecords);

if ( (0<=CurrentRecord) && (CurrentRecord <numRecords)) {

LstSetSelection(lst,CurrentRecord);

LstSetTopItem(lst,CurrentRecord);

}

else CurrentRecord = -1;

LstDrawList(lst);

break;

case 1:

LstEraseList(lst);

DmRemoveRecord(NetPortalDB,CurrentRecord);

while (IsDocField(CurrentRecord,0)==0)

DmRemoveRecord(NetPortalDB,CurrentRecord);

numRecords = DmNumRecords(NetPortalDB);

LstSetListChoices(lst, NULL, numRecords);

if ( (0<=CurrentRecord) && (CurrentRecord <numRecords)) {

LstSetSelection(lst,CurrentRecord);

LstSetTopItem(lst,CurrentRecord);

}

else CurrentRecord = -1;

LstDrawList(lst);

break;

}

break;

case NavigateReturn:

frm = FrmGetActiveForm();

if (MainFormStarted) {

MainFormStarted = false;

DmCloseDatabase(NetPortalDB);

NetPortalDB = 0;

}

FrmEraseForm(frm);

CurrentView = NetPortalStartForm;

FrmGotoForm(CurrentView);

break;

case MainOptionsAbout:

frm = FrmInitForm(NetPortalInfoForm);

FrmDoDialog(frm);

FrmDeleteForm(frm);

break;

}

}

static void StartDoMenuCommand(Word command) {

FormPtr frm = FrmGetActiveForm();

Boolean handled;

switch (command) {

case ViewNews:

frm = FrmGetActiveForm();

FrmEraseForm(frm);

CurrentView = NetPortalMainForm;

FrmGotoForm(CurrentView);

handled = true;

break;

case ViewStocks:

frm = FrmGetActiveForm();

FrmEraseForm(frm);

CurrentPluggin = 0;

CurrentView = PlugginType[CurrentPluggin];

FrmGotoForm(CurrentView);

handled = true;

break;

case ViewWeather:

frm = FrmGetActiveForm();

FrmEraseForm(frm);

CurrentPluggin = 1;

CurrentView = PlugginType[CurrentPluggin];

FrmGotoForm(CurrentView);

handled = true;

break;

case ViewHoroscope:

frm = FrmGetActiveForm();

FrmEraseForm(frm);

CurrentPluggin = 2;

CurrentView = PlugginType[CurrentPluggin];

FrmGotoForm(CurrentView);

handled = true;

break;

case OptionsServerPreferences:

frm = FrmGetActiveForm();

FrmEraseForm(frm);

CurrentView = NetPortalServPrefForm;

FrmGotoForm(CurrentView);

handled = true;

break;

case OptionsPreferences:

frm = FrmGetActiveForm();

FrmEraseForm(frm);

CurrentView = NetPortalPrefForm;

FrmGotoForm(CurrentView);

handled = true;

break;

case StartOptionsAbout:

frm = FrmInitForm(NetPortalInfoForm);

FrmDoDialog(frm);

FrmDeleteForm(frm);

handled = true;

break;

}

}

static Boolean MainFormHandleEvent(EventPtr event)

{

Boolean handled = false;

// EventType newEvent;

FormPtr frm;

ListPtr lst;

Word futureRecord;

int aux;

switch (event->eType)

{

case lstSelectEvent: // P7. An entry in the list was selected.

frm = FrmGetActiveForm();

lst = FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, NetPortalMainMemolistList));

futureRecord = LstGetSelection(lst);

if (IsDocField(futureRecord,0)==0){

LstSetTopItem(lst,futureRecord);

LstEraseList(lst);

LstDrawList(lst);

}

handled = true;

break;

case frmOpenEvent:

MainFormInit();

handled = true;

break;

case frmCloseEvent:

break;

case menuEvent:

MenuEraseStatus(0);

MainDoMenuCommand(event->data.menu.itemID);

handled = true;

break;

case ctlSelectEvent:

frm = FrmGetActiveForm();

lst = FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, NetPortalMainMemolistList));

switch (event->data.ctlEnter.controlID) {

case NetPortalMainLeftButton:

if (scrollRight>=30) {

scrollRight-=30;

LstEraseList(lst);

LstDrawList(lst);

}

handled = true;

break;

case NetPortalMainRightButton:

scrollRight+=30;

LstEraseList(lst);

LstDrawList(lst);

handled = true;

break;

case NetPortalMainHomeButton:

frm = FrmGetActiveForm();

FrmEraseForm(frm);

// Close the application's database.

if (MainFormStarted) {

MainFormStarted = false;

DmCloseDatabase(NetPortalDB);

NetPortalDB = 0;

}

CurrentView = NetPortalStartForm;

FrmGotoForm(CurrentView);

handled = true;

break;

case NetPortalMainUpButton:

futureRecord = LstGetSelection(lst)-1;

while ((aux=IsDocField(futureRecord,0))==0)

futureRecord–;

if (aux ==1) {

CurrentRecord = futureRecord;

LstSetTopItem(lst,CurrentRecord);

LstEraseList(lst);

LstDrawList(lst);

LstSetSelection(lst,CurrentRecord);

}

handled = true;

break;

case NetPortalMainDownButton:

futureRecord = LstGetSelection(lst)+1;

while ((aux=IsDocField(futureRecord,0))==0)

futureRecord++;

if (aux ==1) {

CurrentRecord = futureRecord;

LstSetTopItem(lst,CurrentRecord);

LstEraseList(lst);

LstDrawList(lst);

LstSetSelection(lst,CurrentRecord);

}

handled = true;

break;

}

break;

case keyDownEvent:

frm = FrmGetActiveForm();

lst = FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, NetPortalMainMemolistList));

switch(event->data.keyDown.chr) {

case 11:

futureRecord = LstGetSelection(lst)-1;

while ((aux=IsDocField(futureRecord,0))==0)

futureRecord–;

if (aux ==1) {

CurrentRecord = futureRecord;

LstSetTopItem(lst,CurrentRecord);

LstEraseList(lst);

LstDrawList(lst);

LstSetSelection(lst,CurrentRecord);

}

handled = true;

break;

case 12:

futureRecord = LstGetSelection(lst)+1;

while ((aux=IsDocField(futureRecord,0))==0)

futureRecord++;

if (aux ==1) {

CurrentRecord = futureRecord;

LstSetTopItem(lst,CurrentRecord);

LstEraseList(lst);

LstDrawList(lst);

LstSetSelection(lst,CurrentRecord);

}

handled = true;

break;

}

break;

}

return(handled);

}

static Boolean ViewFormHandleEvent(EventPtr event)

{

FormPtr frm = FrmGetActiveForm();

ControlPtr btn;

Word fldIndex;

FieldPtr fld;

Boolean handled = false;

int x,y,lines;

RectangleType fldBounds;

WinDirectionType fldDir;

btn = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalViewClipboardPushButton));

if (CtlGetValue(btn)==0) {

if (event->eType == penDownEvent) {

x = event->screenX;

y = event->screenY;

fld = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm, NetPortalViewEditFieldField));

FldGetBounds(fld,&fldBounds);

if (RctPtInRectangle(x,y,&fldBounds)) {

oldPointY = y;

return true;

}

}

if (event->eType == penMoveEvent) {

x = event->screenX;

y = event->screenY;

//astea sunt dimensiunile

fld = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm, NetPortalViewEditFieldField));

FldGetBounds(fld,&fldBounds);

if (RctPtInRectangle(x,y,&fldBounds)) {

//x = delta

x = oldPointY – y;

fldDir = x>0?winDown:winUp;

if (x<0)

x = -x;

if (x>FntCharHeight()) {

lines = x/FntCharHeight();

FldScrollField(fld,lines,fldDir);

oldPointY = y;

return true;

}

}

}

}

switch (event->eType)

{

case frmOpenEvent: // The form was told to open.

fldIndex = FrmGetObjectIndex(frm, NetPortalViewEditFieldField);

bNext = bPrev = true;

ViewRetrieveData(frm, fldIndex);

FrmDrawForm(frm);

FrmSetFocus(frm, fldIndex);

if (IsDocField(CurrentRecord,1)!=0){

bNext = false;

btn=FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalViewNextButton));

CtlHideControl(btn);

}

if (IsDocField(CurrentRecord,-1)!=0){

bPrev = false;

btn=FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalViewPrevButton));

CtlHideControl(btn);

}

handled = true;

break;

case fldChangedEvent:

handled = false;

break;

case menuEvent:

MenuEraseStatus(0);

ViewDoMenuCommand(event->data.menu.itemID);

handled = true;

break;

case ctlSelectEvent:

switch (event->data.ctlEnter.controlID) {

case NetPortalViewClipboardPushButton:

btn = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalViewClipboardPushButton));

if (CtlGetValue(btn)==0) {

fld = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm, NetPortalViewEditFieldField));

FldCopy(fld);

FldSetSelection(fld,0,0);

}

handled = true;

break;

case NetPortalViewHomeButton:

CurrentView = NetPortalMainForm;

FrmGotoForm(CurrentView);

handled = true;

break;

case NetPortalViewPrevButton:

if (IsDocField(CurrentRecord,-1)==0) {

if (!bNext) {

bNext = true;

btn=FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalViewNextButton));

CtlShowControl(btn);

}

CurrentRecord–;

fldIndex = FrmGetObjectIndex(frm, NetPortalViewEditFieldField);

ViewRetrieveData(frm, fldIndex);

FrmDrawForm(frm);

FrmSetFocus(frm, fldIndex);

if (IsDocField(CurrentRecord,-1)!=0){

bPrev = false;

btn=FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalViewPrevButton));

CtlHideControl(btn);

}

}

else {

bPrev = false;

btn=FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalViewPrevButton));

CtlHideControl(btn);

}

handled = true;

break;

case NetPortalViewNextButton:

if (IsDocField(CurrentRecord,1)==0) {

if (!bPrev) {

bPrev = true;

btn=FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalViewPrevButton));

CtlShowControl(btn);

}

CurrentRecord++;

fldIndex = FrmGetObjectIndex(frm, NetPortalViewEditFieldField);

ViewRetrieveData(frm, fldIndex);

FrmDrawForm(frm);

FrmSetFocus(frm, fldIndex);

if (IsDocField(CurrentRecord,1)!=0){

bNext = false;

btn=FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalViewNextButton));

CtlHideControl(btn);

}

}

else {

bNext = false;

btn=FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalViewNextButton));

CtlHideControl(btn);

}

handled = true;

break;

case NetPortalViewUpButton:

fld = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm, NetPortalViewEditFieldField));

lines = FldGetVisibleLines(fld);

FldScrollField(fld,lines-1,winUp);

handled = true;

break;

case NetPortalViewDownButton:

fld = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm, NetPortalViewEditFieldField));

lines = FldGetVisibleLines(fld);

FldScrollField(fld,lines-1,winDown);

handled = true;

break;

}

break;

case keyDownEvent:

fld = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm, NetPortalViewEditFieldField));

lines = FldGetVisibleLines(fld);

switch (event->data.keyDown.chr) {

case 12:

FldScrollField(fld,lines-1,winDown);

handled = true;

break;

case 11:

FldScrollField(fld,lines-1,winUp);

handled = true;

break;

}

break;

case frmCloseEvent:

scrollView = NULL;

frm = FrmGetActiveForm();

fldIndex = FrmGetObjectIndex(frm, NetPortalViewEditFieldField);

FldSetTextHandle(FrmGetObjectPtr(frm, fldIndex),NULL);

// P5. Save the data from the field to the application's database.

break;

}

return(handled);

}

static int OpenDBConf(){

NPServPref spref;

NPPrefCfg pref;

VoidHand rec;

Ptr p;

Word error;

UInt cardNo;

LocalID dbID;

UInt dbAttrs;

UInt mode;

UInt16 index;

mode = dmModeReadWrite;

NetPortalDB = DmOpenDatabaseByTypeCreator(NetPortalDBConfType, NetPortalAppType, mode);

if (! NetPortalDB) {

error = DmCreateDatabase(0, NetPortalDBConfName, NetPortalAppType, NetPortalDBConfType, false);

ErrFatalDisplayIf(error, "Could not create new database.");

NetPortalDB = DmOpenDatabaseByTypeCreator(NetPortalDBConfType, NetPortalAppType, mode);

error = DmOpenDatabaseInfo(NetPortalDB, &dbID, NULL, NULL, &cardNo, NULL);

ErrFatalDisplayIf(error, "Could not get database info.");

error = DmDatabaseInfo(0, dbID, NULL, &dbAttrs, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

ErrFatalDisplayIf(error, "Could not get database info.");

error = DmSetDatabaseInfo(0, dbID, NULL, &dbAttrs, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

ErrFatalDisplayIf(error, "Could not set database info.");

//fill server pref

StrCopy(spref.server,"http://");

spref.port = 80;

StrCopy(spref.username,"");

StrCopy(spref.password,"");

spref.enabled = false;

//fill preferences

pref.docSize = 10;

pref.memSize = 400;

pref.Flags = SHOWEMPTYCHANNELS ;

pref.minBetween = 60;

pref.lastTime = 0x18005130;

index = dmMaxRecordIndex;

rec = DmNewRecord(NetPortalDB,&index,sizeof(NPServPref));

p = MemHandleLock(rec);

error = DmWrite(p,0,&spref,sizeof(NPServPref));

ErrFatalDisplayIf(error, "Could not write to new record.");

MemPtrUnlock(p);

DmReleaseRecord(NetPortalDB,index,true);

index = dmMaxRecordIndex;

rec = DmNewRecord(NetPortalDB,&index,sizeof(NPPrefCfg));

p = MemHandleLock(rec);

error = DmWrite(p,0,&pref,sizeof(NPPrefCfg));

ErrFatalDisplayIf(error, "Could not write to new record.");

MemPtrUnlock(p);

DmReleaseRecord(NetPortalDB,index,true);

}

return 1;

}

static int OpenDBPluggin(){

Word error;

UInt cardNo;

LocalID dbID;

UInt dbAttrs;

UInt mode;

mode = dmModeReadWrite;

NetPortalDB = DmOpenDatabaseByTypeCreator(NetPortalDBPlugginType, NetPortalAppType, mode);

if (!NetPortalDB) {

error = DmGetLastErr();

error = DmCreateDatabase(0, NetPortalDBPlugginName, NetPortalAppType, NetPortalDBPlugginType, false);

ErrFatalDisplayIf(error, "Could not create new database.");

NetPortalDB = DmOpenDatabaseByTypeCreator(NetPortalDBPlugginType, NetPortalAppType, mode);

error = DmOpenDatabaseInfo(NetPortalDB, &dbID, NULL, NULL, &cardNo, NULL);

ErrFatalDisplayIf(error, "Could not get database info.");

error = DmDatabaseInfo(0, dbID, NULL, &dbAttrs, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

ErrFatalDisplayIf(error, "Could not get database info.");

error = DmSetDatabaseInfo(0, dbID, NULL, &dbAttrs, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

ErrFatalDisplayIf(error, "Could not set database info.");

}

return 1;

}

static Boolean PlugginFormHandleEvent(EventPtr event)

{

FormPtr frm = FrmGetActiveForm();

VoidHand recHandle;

ControlPtr btn;

NPPlugginRecPtr rec;

Char *ptr;

FieldPtr fld;

Word fldIndex;

Boolean handled = false;

int lines,x,y;

RectangleType fldBounds;

WinDirectionType fldDir;

btn = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalPlugginClipboardPushButton));

if (CtlGetValue(btn)==0) {

if (event->eType == penDownEvent) {

x = event->screenX;

y = event->screenY;

fld = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm, NetPortalPlugginEditFieldField));

FldGetBounds(fld,&fldBounds);

if (RctPtInRectangle(x,y,&fldBounds)) {

oldPointY = y;

return true;

}

}

if (event->eType == penMoveEvent) {

x = event->screenX;

y = event->screenY;

//astea sunt dimensiunile

fld = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm, NetPortalPlugginEditFieldField));

FldGetBounds(fld,&fldBounds);

if (RctPtInRectangle(x,y,&fldBounds)) {

//x = delta

x = oldPointY – y;

fldDir = x>0?winDown:winUp;

if (x<0)

x = -x;

if (x>FntCharHeight()) {

lines = x/FntCharHeight();

FldScrollField(fld,lines,fldDir);

oldPointY = y;

return true;

}

}

}

}

switch (event->eType)

{

case frmOpenEvent: // The form was told to open.

if (OpenDBPluggin()) {

if (0<=CurrentPluggin && CurrentPluggin < DmNumRecords(NetPortalDB)) {

recHandle = DmQueryRecord(NetPortalDB,CurrentPluggin);

rec = (NPPlugginRecPtr) MemHandleLock(recHandle);

//setting form title

FrmSetTitle(frm,rec->FormTitle);

//setting Title Field

fld = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalPlugginTitleField));

FldSetTextPtr(fld,rec->SubTitle);

fld = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalPlugginEditFieldField));

ptr = rec->DocText;

ptr += StrLen(rec->SubTitle);

FldSetTextPtr(fld,ptr);

rec = NULL;

// Unlock the handle to the record.

MemHandleUnlock(recHandle);

FldSetSelection(fld,0,0);

FldSetScrollPosition(fld,0);

FldRecalculateField(fld,true);

}

else {

if (NetPortalDB)

DmCloseDatabase(NetPortalDB);

NetPortalDB = 0;

FrmAlert(SyncNeededAlert);

CurrentView = NetPortalServPrefForm;

FrmGotoForm(CurrentView);

return true;

}

fldIndex = FrmGetObjectIndex(frm, NetPortalPlugginEditFieldField);

FrmDrawForm(frm);

FrmSetFocus(frm, fldIndex);

}

else {

CurrentView = NetPortalStartForm;

FrmGotoForm(CurrentView);

}

handled = true;

break;

case frmCloseEvent:

break;

case fldChangedEvent:

handled = false;

break;

case ctlSelectEvent:

switch (event->data.ctlEnter.controlID) {

case NetPortalPlugginClipboardPushButton:

btn = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm,NetPortalPlugginClipboardPushButton));

if (CtlGetValue(btn)==0) {

fld = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm, NetPortalPlugginEditFieldField));

FldCopy(fld);

FldSetSelection(fld,0,0);

}

handled = true;

break;

case NetPortalPlugginHomeButton:

if (NetPortalDB)

DmCloseDatabase(NetPortalDB);

NetPortalDB = 0;

FrmEraseForm(frm);

CurrentView = NetPortalStartForm;

FrmGotoForm(CurrentView);

handled = true;

break;

case NetPortalPlugginPrevButton:

if (CurrentPluggin>0)

CurrentPluggin–;

else

CurrentPluggin = DmNumRecords(NetPortalDB)-1;

if (NetPortalDB)

DmCloseDatabase(NetPortalDB);

NetPortalDB = 0;

CurrentView = PlugginType[CurrentPluggin];

FrmEraseForm(frm);

FrmGotoForm(CurrentView);

handled = true;

break;

case NetPortalPlugginNextButton:

if (CurrentPluggin+1<DmNumRecords(NetPortalDB))

CurrentPluggin++;

else

CurrentPluggin = 0;

if (NetPortalDB)

DmCloseDatabase(NetPortalDB);

NetPortalDB = 0;

CurrentView = PlugginType[CurrentPluggin];

FrmEraseForm(frm);

FrmGotoForm(CurrentView);

handled = true;

break;

case NetPortalPlugginUpButton:

fld = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm, NetPortalPlugginEditFieldField));

lines = FldGetVisibleLines(fld);

FldScrollField(fld,lines-1,winUp);

handled = true;

break;

case NetPortalPlugginDownButton:

fld = FrmGetObjectPtr(frm,FrmGetObjectIndex(frm, NetPortalPlugginEditFieldField));

lines = FldGetVisibleLines(fld);

FldScrollField(fld,lines-1,winDown);

handled = true;

break;

}

break;

}

// if (!handled)

// return SclHandleEvent(scl,event);

return(handled);

}

static Boolean PrefFormHandleEvent(EventPtr event){

Boolean handled = false;

FormPtr frm;

VoidHand recHandle,fldHandle;

Char *p;

NPPrefCfg *pref,prefS;

FieldPtr fld;

ControlPtr ctl;

int error;

Int16 value;

switch (event->eType) {

case frmOpenEvent:

frm = FrmGetActiveForm();

// FrmDrawForm(frm);

if (OpenDBConf() ) {

recHandle = DmQueryRecord(NetPortalDB, 1);

pref = (NPPrefCfg *)MemHandleLock(recHandle);

prefS.docSize = pref->docSize;

prefS.memSize = pref->memSize;

prefS.Flags = pref->Flags;

prefS.minBetween = pref->minBetween;

lastTimeUpdated = pref->lastTime;

MemHandleUnlock(recHandle);

fld = FrmGetObjectPtr(frm , FrmGetObjectIndex(frm,NetPortalPrefDocSizeField));

fldHandle = FldGetTextHandle(fld);

FldSetTextHandle(fld,NULL);

if (fldHandle)

MemHandleResize(fldHandle,20);

else

fldHandle = MemHandleNew(20);

p = MemHandleLock(fldHandle);

StrIToA(p,prefS.docSize);

MemHandleUnlock(fldHandle);

FldSetTextHandle(fld,fldHandle);

fld = FrmGetObjectPtr(frm , FrmGetObjectIndex(frm,NetPortalPrefMemSizeField));

fldHandle = FldGetTextHandle(fld);

FldSetTextHandle(fld,NULL);

if (fldHandle)

MemHandleResize(fldHandle,20);

else

fldHandle = MemHandleNew(20);

p = MemHandleLock(fldHandle);

StrIToA(p,prefS.memSize);

MemHandleUnlock(fldHandle);

FldSetTextHandle(fld,fldHandle);

fld = FrmGetObjectPtr(frm , FrmGetObjectIndex(frm,NetPortalPrefMinBetweenField));

fldHandle = FldGetTextHandle(fld);

FldSetTextHandle(fld,NULL);

if (fldHandle)

MemHandleResize(fldHandle,20);

else

fldHandle = MemHandleNew(20);

p = MemHandleLock(fldHandle);

StrIToA(p,prefS.minBetween);

MemHandleUnlock(fldHandle);

FldSetTextHandle(fld,fldHandle);

ctl = FrmGetObjectPtr(frm , FrmGetObjectIndex(frm,NetPortalPrefEmptyCheckbox));

value = pref->Flags & SHOWEMPTYCHANNELS;

CtlSetValue(ctl,value);

ctl = FrmGetObjectPtr(frm , FrmGetObjectIndex(frm,NetPortalPrefHtmlCheckbox));

value = pref->Flags & STRICTHTMLCONVERSION;

CtlSetValue(ctl,value);

ctl = FrmGetObjectPtr(frm , FrmGetObjectIndex(frm,NetPortalPrefURLCheckbox));

value = pref->Flags & SHOWSOURCEURL;

CtlSetValue(ctl,value);

}

FrmDrawForm(frm);

handled = true;

break;

case frmCloseEvent:

break;

case ctlSelectEvent:

frm = FrmGetActiveForm();

switch (event->data.ctlEnter.controlID) {

case NetPortalPrefSaveButton:

lastTimeUpdated = 0;

prefS.lastTime = lastTimeUpdated;

fld = FrmGetObjectPtr(frm , FrmGetObjectIndex(frm,NetPortalPrefDocSizeField));

p = FldGetTextPtr(fld);

prefS.docSize = StrAToI(p);

fld = FrmGetObjectPtr(frm , FrmGetObjectIndex(frm,NetPortalPrefMemSizeField));

p = FldGetTextPtr(fld);

prefS.memSize = StrAToI(p);

fld = FrmGetObjectPtr(frm , FrmGetObjectIndex(frm,NetPortalPrefMinBetweenField));

p = FldGetTextPtr(fld);

prefS.minBetween = StrAToI(p);

ctl = FrmGetObjectPtr(frm , FrmGetObjectIndex(frm,NetPortalPrefEmptyCheckbox));

prefS.Flags = 0;

if (CtlGetValue(ctl))

prefS.Flags |= SHOWEMPTYCHANNELS;

ctl = FrmGetObjectPtr(frm , FrmGetObjectIndex(frm,NetPortalPrefHtmlCheckbox));

if (CtlGetValue(ctl))

prefS.Flags |= STRICTHTMLCONVERSION;

ctl = FrmGetObjectPtr(frm , FrmGetObjectIndex(frm,NetPortalPrefURLCheckbox));

if (CtlGetValue(ctl))

prefS.Flags |= SHOWSOURCEURL;

recHandle = DmGetRecord(NetPortalDB,1);

pref = MemHandleLock(recHandle);

error = DmWrite(pref,0,&prefS,sizeof(NPPrefCfg));

ErrFatalDisplayIf(error, "Could not write to new record.");

MemPtrUnlock(pref);

DmReleaseRecord(NetPortalDB,1,true);

case NetPortalPrefCancelButton:

// Close the application's database.

DmCloseDatabase(NetPortalDB);

NetPortalDB = 0;

FrmEraseForm(frm);

CurrentView = NetPortalStartForm;

FrmGotoForm(CurrentView);

handled = true;

break;

case NetPortalPrefResetButton:

lastTimeUpdated = 0;

break;

}

break;

}

return handled;

}

static Boolean StartFormHandleEvent(EventPtr event){

Boolean handled = false;

FormPtr frm;

switch (event->eType) {

case frmOpenEvent:

frm = FrmGetActiveForm();

FrmDrawForm(frm);

handled = true;

break;

case frmCloseEvent:

break;

case menuEvent:

// First clear the menu status from the display.

MenuEraseStatus(0);

// Process menu commands for the edit form.

StartDoMenuCommand(event->data.menu.itemID);

handled = true;

break;

case ctlSelectEvent:

switch (event->data.ctlEnter.controlID) {

case NetPortalStartStartButton:

frm = FrmGetActiveForm();

FrmEraseForm(frm);

CurrentView = NetPortalMainForm;

FrmGotoForm(CurrentView);

handled = true;

break;

case NetPortalStartStocksButton:

frm = FrmGetActiveForm();

FrmEraseForm(frm);

CurrentPluggin = 0;

CurrentView = PlugginType[CurrentPluggin];

FrmGotoForm(CurrentView);

handled = true;

break;

case NetPortalStartWeatherButton:

frm = FrmGetActiveForm();

FrmEraseForm(frm);

CurrentPluggin = 1;

CurrentView = PlugginType[CurrentPluggin];

FrmGotoForm(CurrentView);

handled = true;

break;

case NetPortalStartHoroscopeButton:

frm = FrmGetActiveForm();

FrmEraseForm(frm);

CurrentPluggin = 2;

CurrentView = PlugginType[CurrentPluggin];

FrmGotoForm(CurrentView);

handled = true;

break;

case NetPortalStartServPrefButton:

frm = FrmGetActiveForm();

FrmEraseForm(frm);

CurrentView = NetPortalServPrefForm;

FrmGotoForm(CurrentView);

handled = true;

break;

}

break;

}

return handled;

}

static Boolean ApplicationHandleEvent(EventPtr event)

{

FormPtr frm;

Word formId;

Boolean handled = false;

if (event->eType == frmLoadEvent)

{

// Load the form resource specified in the event then activate the form.

formId = event->data.frmLoad.formID;

frm = FrmInitForm(formId);

FrmSetActiveForm(frm);

// Set the event handler for the form. The handler of the currently

// active form is called by FrmDispatchEvent each time it receives an event.

switch (formId)

{

case NetPortalMainForm:

FrmSetEventHandler(frm, MainFormHandleEvent);

break;

case NetPortalViewForm:

FrmSetEventHandler(frm, ViewFormHandleEvent);

break;

case NetPortalStartForm:

FrmSetEventHandler(frm, StartFormHandleEvent);

break;

case NetPortalServPrefForm:

FrmSetEventHandler(frm, ServPrefFormHandleEvent);

break;

case NetPortalPrefForm:

FrmSetEventHandler(frm, PrefFormHandleEvent);

break;

case NetPortalPlugginForm:

FrmSetEventHandler(frm,PlugginFormHandleEvent);

break;

case NetPortalTablePlugginForm:

FrmSetEventHandler(frm,TablePlugginFormHandleEvent);

break;

}

handled = true;

}

return handled;

}

static void EventLoop(void)

{

EventType event;

Word error;

do

{

EvtGetEvent(&event, evtWaitForever);

if (! SysHandleEvent(&event))

if (! MenuHandleEvent(0, &event, &error))

if (! ApplicationHandleEvent(&event))

FrmDispatchEvent(&event);

}

while (event.eType != appStopEvent);

}

static void StartApplication(void)

{

MainFormStarted = false;

ViewLastFont = stdFont;

StrCopy(SearchText,"");

CurrentView = NetPortalStartForm;

CurrentPluggin = 0;

TablePlugginFirstRec = 0;

}

static Err RomVersionCompatible (DWord requiredVersion, Word launchFlags)

{

DWord romVersion;

FtrGet(sysFtrCreator, sysFtrNumROMVersion, &romVersion);

if (romVersion < requiredVersion)

{

if ((launchFlags & (sysAppLaunchFlagNewGlobals | sysAppLaunchFlagUIApp)) ==

(sysAppLaunchFlagNewGlobals | sysAppLaunchFlagUIApp))

{

FrmAlert (RomIncompatibleAlert);

if (romVersion < 0x02000000)

AppLaunchWithCommand(sysFileCDefaultApp, sysAppLaunchCmdNormalLaunch, NULL);

}

return (sysErrRomIncompatible);

}

return 0;

}

static void StopApplication(void)

{

FrmCloseAllForms ();

}

// PilotMain

DWord PilotMain(Word cmd, Ptr cmdPBP, Word launchFlags)

{

Word error;

error = RomVersionCompatible (version20, launchFlags);

if (error)

return error;

if (cmd != sysAppLaunchCmdNormalLaunch) return sysErrParamErr;

StartApplication();

FrmGotoForm(CurrentView);

EventLoop();

StopApplication();

return 0;

}

Similar Posts