Kurz5 - Kapitola7

17. června 2007 v 11:08 | http://www.sweb.cz/kurz_evt/ |  Programování pro WinCE

7.7 Jak to všechno pracuje

Možná jste již navázali kontakt se svou schránkou. Podívejme se, jak k tomu došlo...
Pro komunikaci s poštovní schránkou jsem zvolil objekt m_Connection třídy CPop3Connection. Tuto třídu jsme si vypůjčili od dvojice Naughter a Andersen. Třída CPop3Connection nabízí několik metod pro práci s POP3 protokolem. Program začne objekt m_Connection využívat, až v programu zvolíte příkaz "Connect". V těle členské metody CMainFrame::OnConnect() se odehrává většina práce.
Funkce si nejprve vytvoří nemodální dialog pro zobrazování průběhu připojování k serveru (viz díl 5.4). Upozorňuji, že stavový dialog není využíván příliš inteligentně. Při dosažení každé další mety je ukazatel postupu zvednut o 20% a je vypsána činnost, na které se pracuje.
Je-li dialog připraven, nejprve zvětšuji Timeout objektu m_Connection. Pro komunikaci přes mobilní telefon je přednastavený čas často malý, proto jsem jej zvětšil na 15 sekund. Jako první krok směrem k serveru je pokus o navázání spojení metodou m_Connection.Connect. Jejími parametry jsou jméno připojovaného serveru, adresa schránky a heslo. Uživatelské jméno zůstane pro tento program nevyužito.
Pokud se spojení nepodařilo navázat, ukončíme metodu hlášením a zrušením stavového dialogu. Proměnné dwError a sError sbírající číslo chyby a chybové hlášení jsou pozůstatkem z fáze ladění, není nutné je používat. V případě problémů je možné je začít vypisovat a používat pro ladění. Podobným způsobem jsou ukončeny v případě chyby i další kroky v komunikaci.
Jestliže je spojení navázáno, otestujeme je příkazem NOOP. Tím se ujistíme, že server s námi komunikuje. Pak pomocí m_Connection.Statistics uložíme do proměnné nMail, kolik zpráv ve schránce čeká.
Poté následuje smyčka, ve které se snažíme všechny zprávy přečíst a zobrazit v pohledu aplikace. Pokusíme se nejprve o přečtení pouze hlavičky zprávy bez těla. V případě, že hlavička nepřijde (ať z důvodu chyby nebo proto, že to server nepodporuje), zkusíme ještě přečíst celou zprávu. Bohužel, tím ztratíme kouzlo přenosu co nejmenšího množství dat, ale zprávu můžeme získat na druhý pokus. Přenosem pouhé hlavičky totiž ušetříme přenášení velkého množství dat, které může představovat vlastní tělo zprávy.
Hlavička zprávy (nebo celá zpráva) se ukládá do proměnné message třídy CPop3Message. Tuto třídu nám přinesly soubory Pop3.h a Pop3.cpp a je používaná v CPop3Connection. Povšimněte si, že při vybírání zpráv ze schránky jsou počítány od 1, při předávání do CListView počítáme položky od 0. Na závěr po přenosu všech zpráv ještě uklidím.
Metoda CMainFrame::OnDisconnect() a úprava destruktoru třídy CMainFrame jsou asi zřejmé. Navázané spojení se serverem bychom měli ukončit ve vhodný okamžik (na pokyn uživatele nebo při ukončení programu).
Pokud jste se pokusili aplikaci přeložit pro starší verzi Windows 2.11, asi se objevilo hlášení, že v souboru Pop3.cpp jsou použity dvě neznámé funkce. ZeroMemory, podobně jako CopyMemory a další funkce, je jenom makro, které je v následující verzi Windows CE (pro Pocket PC) již dostupné. Je možné jej objevit v hlavičkovém souboru WinNT.h v SDK pro Pocket PC. Stačí hledat...
Druhá funkce je trochu horší. Protože se však v Pop3.cpp porovnávají jen tříznakové řetězce "+OK" bez ohledu na velikost písmene, napsal jsem si pomocnou funkci sám. A kupodivu to fungovalo :-)
Pak stačí tyto funkce doplnit v úvodu souboru Pop3.cpp a i stařičké stroje dostanou šanci...
// Nahrada funkci nepodporovanych ve Win 2.11
#define ZeroMemory(Destination,Length) memset((Destination),0,(Length))
int _strnicmp( const char *string1, const char *string2, size_t count )
{
if(string1[0] != string2[0]) return 1;
if(toupper(string1[1]) != toupper(string2[1])) return 1;
if(toupper(string1[2]) != toupper(string2[2])) return 1;
return 0;
}
Informace, které se v okně pohledu zobrazí, však mohou být poměrně nečitelné. Důvodem je to, že jazyky, kterým nestačí ASCII tabulka, si vynutily kódování textů ve zprávě i v její hlavičce. Kódování může být různé a mohou se užívat i různé znakové sady. Příště díl zaměříme na odkódování informací.

Co bychom si měli z této lekce zapamatovat?

  • Funkce, které chybí ve starších verzích Windows CE, je možné doplnit.
 

Buď první, kdo ohodnotí tento článek.

Nový komentář

Přihlásit se
  Ještě nemáte vlastní web? Můžete si jej zdarma založit na Blog.cz.