Kurz5 - Kapitola6

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

7.6 Komunikace s POP3 serverem

Program nám již téměř funguje, bohužel však na prázdno. V dnešním kroku doplníme něco pro vlastní komunikaci - abychom si pořád nehráli jenom s obrázky. Pro přenos zpráv z poštovních serverů se obvykle používá tzv. POP3 protokol, jak již bylo v úvodu řečeno.
Hotovou třídu určenou přímo pro Windows CE je možné najít např. na stránkách www.naughter.com - oddíl Network Freeware, odkaz na CPJNPOP3Connection. V jeho popisu najděte v textu odkaz na úpravu provedenou pro Windows CE v roce 2003 Christianem Andersenem - soubor mailce.zip. Pokud by odkaz nefungoval, je zde záloha. Stáhněte si jej na počítač a vybalené soubory pop3.h a pop3.cpp vložte do adresáře s vaším projektem.
Mimochodem, stránky P.J. Naughtera stojí za pozornost i v jiných ohledech. Vřele doporučuji...
Dále budeme pokračovat heslovitě, rozebereme si to příště:
  1. Přidejte oba soubory do projektu Project - Add to Project - Files
  2. Do třídy CMainFrame si přidejte členskou proměnnou m_Connection typu CPop3Connection.
  3. Nyní již můžeme s proměnnou m_Connection pracovat. Upravte členskou funkci:
  4.   
    void CMainFrame::OnConnect()
    {
    // Makro pro nastaveni textu u Static polozku stavu v dialogu (budu pouzivat ukazatel pStatic)
    #define status(a) pStatic->SetWindowText(a);pStatic->Invalidate();pStatic->UpdateWindow();

    CClrMailView* pView; // Ukazatel na upraveny CListView
    pView = (CClrMailView*)GetActiveView();
    CPop3Message message; // Objekt pro praci se zpravou
    CString pom; // Pomocna textova promenna
    int nMail,nSize; // Promenne pro info o poctu a velikosti zprav

    // Vytvorim si novy dialog
    CDialog* pStatDlg;
    pStatDlg= new CDialog();
    // Dialog necham zobrazovat jako okno - ne na cele plose
    pStatDlg->m_bFullScreen=FALSE; // Neplati pro Windows CE 2.11
    if(pStatDlg != NULL)
    if(!pStatDlg->Create(IDD_STATUSCONN,this)) {
    MessageBox(_T("Dialog Error"));
    return;
    }
    // Promenne pro odkazovani na Progress Bar a Static Text dialogu
    CProgressCtrl* pProgr=(CProgressCtrl *) pStatDlg->GetDlgItem(IDC_PROGRESS);
    CWnd* pStatic= pStatDlg->GetDlgItem(IDC_TEXTSTAT);

    status(_T("POP3 Connecting"));
    pProgr->SetPos(0);

    m_Connection.SetTimeout(15000);
    // Pokud nejsem pripojeny, zkusim se pripojit
    if(!m_bConnected) {
    if (!m_Connection.Connect(m_strPOP3Server, m_strEmail, m_strPassword))
    {
    DWORD dwError = GetLastError();
    CString sError = m_Connection.GetLastCommandResponse();
    MessageBox(_T("Connection failed!"));
    if(pStatDlg != NULL) pStatDlg->DestroyWindow();
    return;
    }
    m_bConnected=TRUE;
    }

    status(_T("Test Connection"));
    pProgr->SetPos(20);
    // Otestuji spojeni prikazem NOOP
    if (!m_Connection.Noop())
    {
    DWORD dwError = GetLastError();
    CString sError = m_Connection.GetLastCommandResponse();
    MessageBox(_T("No Response!"));
    if(pStatDlg != NULL) pStatDlg->DestroyWindow();
    return;
    }

    status(_T("POP3 Connected"));
    pProgr->SetPos(40);
    // Zjistim, kolik zprav je ve schrance
    if (!m_Connection.Statistics(nMail,nSize))
    {
    DWORD dwError = GetLastError();
    CString sError = m_Connection.GetLastCommandResponse();
    MessageBox(_T("Unknown number of mails!"));
    if(pStatDlg != NULL) pStatDlg->DestroyWindow();
    return;
    }

    // Neni-li zadna, upozornim a koncim
    if(!nMail) {
    MessageBox(_T("No waiting mail!"));
    if(pStatDlg != NULL) pStatDlg->DestroyWindow();
    return;
    }
    CString pomT;
    pomT.Format(_T("%d messages"),nMail);
    status(pomT);
    pProgr->SetPos(60);
    // Jinak je ulozim do ListView
    pView->GetListCtrl().DeleteAllItems();
    for(int i=0; i<nMail; i++) // Pozor! ListView se musi plnit od polozky 0!
    {
    // Ale zpravy jsou pocitany od 1!
    if(!m_Connection.GetMessageHeader(i+1,message))
    {
    MessageBox(_T("Header extract failed!"));
    if(!m_Connection.Retrieve(i+1,message))
    {
    MessageBox(_T("Message retrieve failed!"));
    // Protoze doslo k naruseni rady zprav, nema cenu pokouset se o ziskani dalsi zpravy
    if(pStatDlg != NULL) pStatDlg->DestroyWindow();
    return;
    }
    }
    // Naplnim tri sloupce s E-maily odesilatelem, predmetem a adresou
    pom=message.GetFrom();
    pView->GetListCtrl().InsertItem(i,pom,0);
    pom=message.GetSubject();
    pView->GetListCtrl().SetItemText(i,1,pom);
    pom=message.GetReplyTo();
    pView->GetListCtrl().SetItemText(i,2,pom);
    if(i<30) pView->GetListCtrl().Update(i); // Aby bylo videt, jak maily pribyvaji pri pomalem pripojeni
    }
    // Vse se zakoncilo dobre
    status(_T("E-mails received O.K.!"));
    pProgr->SetPos(100);
    Sleep(1000);
    if(pStatDlg != NULL) pStatDlg->DestroyWindow();

    }
  5. Podobně upravte funkci:
  6.   
    void CMainFrame::OnDisconnect()
    {
    if(m_bConnected) {
    if (!m_Connection.Disconnect()) {
    DWORD dwError = GetLastError();
    CString sError = m_Connection.GetLastCommandResponse();
    MessageBox(_T("Disconnection failed!"));
    return;
    }
    MessageBox(_T("Disconnected!"));
    m_bConnected=FALSE;
    }
    }
  7. Na závěr doplňte do destruktoru CMainFrame řádek pro zrušení spojení, pokud bychom zapomněli odpojit
  8.   
    if(m_bConnected) m_Connection.Disconnect();
Po přeložení a spuštění byste si již měli být schopni prohlédnout obsah vaší schránky. Sice asi podivný, ale k tomu se dostaneme později...

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

  • Hledáním na Internetu lze nalézt hotové třídy spolupracující s MFC pro použití v aplikacích :-)..
 

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.