Enigma1 THE BIBLE - Lesson8: Http Connection and Download

Lesson8: Http Connection and Download

/*
+--------------------------------------------------------------------------
| The Bible Enigma1 Tutorial
| ========================================
| By: Bacicciosat aka Meo aka Luponero
|
| Enigma 1 API GUI tutorial with Sources Code and Comments
| (c) august 2006 by Meo
|
+---------------------------------------------------------------------------
*/

Lesson8: Http Connection and Download

Ok this is the FINAL lesson
We will create a little application.
This plugin will connect to Wikipedia Site and will Download the page about Mkportal.

If you followed this tutorial you are now able to understand code and Enigma Api.
I will not explain other.
i will post here only the complete commented source.

Code:
/*
+--------------------------------------------------------------------------
|   Bible Enigma1 Tutorial
|   ========================================
|   By: Bacicciosat aka Meo aka Luponero
|
|   Lesson 8: http connection and download demonstration.
|   (c) august 2006 by Meo
|
+---------------------------------------------------------------------------
*/

// include files nedeed by our code.
#include <stdio.h>
#include <stdlib.h>
#include <plugin.h>
#include <math.h>
#include <dirent.h>
#include <string.h>
#include <lib/gui/ewindow.h>
#include <lib/gui/ebutton.h>
#include <lib/gui/emessage.h>
#include <lib/gui/textinput.h>
#include <lib/gui/combobox.h>
#include <lib/gui/statusbar.h>
#include <lib/gui/eskin.h>
#include <lib/gdi/font.h>
#include <lib/gdi/epng.h>
#include <lib/gdi/gfbdc.h>
#include <lib/system/httpd.h>
#include <lib/gui/eprogress.h>
#include <upgrade.h>
#include <iostream>
#include <fstream>
#include <cstdio>
#include <lib/base/thread.h>
#include <lib/base/estring.h>


// The Class declaration of our Http Connection system
class Fetcher : public Object
{    
    // The temp file in which we will store the download data
    eString tempPath;
    // internal pointers and functions of download connection
    eHTTPConnection * connectionP;
    eHTTPDataSource * dataSinkP;
    void transferDone(int err);
    eHTTPDataSource * createDownloadSink(eHTTPConnection *conn);    
public:
    Signal1<void,int> downloadDone;
    void fetch();
};

// The Class declaration of our Main Window
class eBibleMainWindow: public eWindow
{
    // the label to show the text
    eLabel *label;
    // the button to start connection
    eButton *ok;
    // the connection object
    Fetcher theFetcher;
    // flag to indicate the download state
    int downloadDoneFlag;
    int inDownloadFlag;
public:
        // the constructor.
    eBibleMainWindow();
    // function to call when button is pushed 
    void Wconnect();
    // function to call when download is completed.
    void downloadDone(int err);
        // the destructor.
    ~eBibleMainWindow();
};

// The definition of the C function we will use to remove Html Tags from downloaded text
eString removeTags(eString in);
    
// The plugin entry point, Here start the code execution
extern "C" int plugin_exec( PluginParam *par )
{
    // our demo dialog instance.
    eBibleMainWindow dlg;
        // show the dialog...
    dlg.show();
        // give control to dialog.. (the dialog is modal!)
    int result=dlg.exec();
        // and after it, hide it again.
    dlg.hide();
    return result;
}


eBibleMainWindow::eBibleMainWindow(): eWindow(1)
{
    inDownloadFlag = 0;
        // move our dialog to 100.100...
    cmove(ePoint(100, 70));
        // ...and give x and y dimensions.
    cresize(eSize(520, 436));
        // set a title.
    setText("Enigma Bible Lesson 8: http connection");
    
    // create a label to show a text.
    label=new eLabel(this);
    // give a position
    label->move(ePoint(10, 0));
    // set the label dimensions
    label->resize(eSize(490, 380));
    // set the label text
    label->setText("This a demo http connection. We will connect to Wikipedia Site and will Download the page about Mkportal that is a CMS wrote and distributed by Meo aka Bacicciosat. We will parse the Wikipedia page and show in this window the Wikpedia definition of Mkportal.");
    // set the wrap flag to the label
    label->setFlags(RS_WRAP);

    // create button and set properties
    ok = new eButton(this);
    ok->setText("Connect");
    ok->move(ePoint((clientrect.width() - 150)/2, clientrect.height() - 60));
    ok->resize(eSize(150, 40));
    ok->setShortcut("green");
    ok->setShortcutPixmap("green");
    ok->loadDeco();

    // function to call when button is pushed
    CONNECT(ok->selected, eBibleMainWindow::Wconnect);

}

void eBibleMainWindow::Wconnect()
{
    // Set the flag that indicates we are in downlading status
    if(!inDownloadFlag) {    
        inDownloadFlag = 1;
        // Hide Label to change text
        label->hide();
        // Set new text for the label
        label->setText("Wait please connection to Wikipedia site in progress...");
        // Show the label with New Text
        label->show();
        // Function to call when donwload is complete
        CONNECT(theFetcher.downloadDone, eBibleMainWindow::downloadDone);
        // Set the flag indicates that we are starting connections
        downloadDoneFlag = 0;
        // Call function to start http connection
        theFetcher.fetch();
    }
}

void Fetcher::fetch()
{    
      // declare variable
    eString url;
    // assign to the variable the url we want to connect
    url = "http://en.wikipedia.org/wiki/Mkportal";
    // assign to class variable the temporary file we will use to store the dowanloaded data
    tempPath = "/var/tmp/bdemo.tmp";
    // inizialize the control error flag
    int error = 0;
    // start connection
    connectionP = eHTTPConnection::doRequest(url.c_str(), eApp, &error);
    // Show a Messagebox in case of connection error
    if(!connectionP || error)
    {    eMessageBox msg("Error downloading " + url + "(" + eString().sprintf("%d", error) + ")", _("Details"), eMessageBox::btOK);
        msg.show();     msg.exec();     msg.hide();
    }
    else
    {
        //if the connection is estabilished start the download funcions
        CONNECT(connectionP->transferDone, Fetcher::transferDone);
        CONNECT(connectionP->createDataSource, Fetcher::createDownloadSink);
        // set the user-agent name
        connectionP->local_header["User-Agent"] = "PLBOT";
        connectionP->start();
    }
}

void Fetcher::transferDone(int err)
{    
    // If no error we can call the downloadDone function
    if(!err)
    {    connectionP = NULL;
        // Tell caller download is ready
        /*emit*/ downloadDone(err);
    }
    else
    {
        //else show a Messagebox with Error description.
        eString sMsg = "Error " + eString().sprintf("%d", err);
        eMessageBox msg(sMsg, _("User Abort"), eMessageBox::iconWarning|eMessageBox::btOK);
        msg.show();     msg.exec();     msg.hide();
    }
}
// internal download procedure (standard)
eHTTPDataSource * Fetcher::createDownloadSink(eHTTPConnection *conn)
{    dataSinkP = new eHTTPDownload(connectionP, (char *)tempPath.c_str());

    return(dataSinkP);

}

void eBibleMainWindow::downloadDone(int err)
{
    // set the flag that indicates that download is complete
    if(!downloadDoneFlag)
    {    downloadDoneFlag = 1;
        // create a buffer to read the temp file with download data.
        char buf[512];
        // declare the variables we will use in this function
        eString strview, strview1;
        // open temporary file cotaining the downloaded data 
          FILE *f = fopen("/var/tmp/bdemo.tmp", "rt");
           if (f)
           {
            //Add an introduction text
            strview = "Mkportal CMS. Author Meo aka Bacicciosat aka Luponero. www.mkportal.it/n/nWikipedia:/n";
            // find the line we want (The mkportal definition in the wiki page we downloaded)
            while (fgets(buf, 512, f))
             {
                if (strstr(buf, "is a free Portal"))
                break;
            }
            // store this line in the variable
            strview1 = eString(buf);
            // remove html tags
            strview1 = removeTags(strview1);
            //  concate strings to compose our output text
            strview += strview1;
            // read the next lines .....
              while (fgets(buf, 512, f))
              {
            // if we found this string the defnition is ended so we can stop to read the file
                if (strstr(buf, "See also"))
                break;
            // else store the line in the variable
                strview1 = eString(buf);
            // remove html tags
                strview1 = removeTags(strview1);
            //  concate strings to compose our output text
                strview += strview1; 
              }
            // close file
              fclose(f);
           }
        //Delete the temporary file we used to store downloaded data
           ::unlink("/var/tmp/bdemo.tmp");
        // Hide label to change the text
        label->hide();
        // Insert into the label the output we have stored in the variable strview
        label->setText(strview);
        // Show the label with the new text
        label->show();
        // hide the connection button
        ok->hide();
        // set the flag that indicates we are not in download state anymore
        inDownloadFlag = 0;

    }

}

// This is a normal C++ function to remove the Html Tags from a strng.
// I will not comment this. This is not Enigma. This is normal C++ Programming.
eString removeTags(eString in)
{    eString out;
    int startpos = 0; int length = 0;
    for(unsigned int i = 0; i < in.length(); i++)
    {    length++;
        if(in.mid(i, 1) == "<")
        {    out = out + in.mid(startpos, length - 1);
            for(unsigned int j = i; j < in.length(); j++)
            {    if(in.mid(j, 1) == ">")
                {    i = j;
                    startpos = i + 1;
                    length = 0;
                    break;
                }
            }
        }
    }
    if(out == "")
    {    out = in;
    }
    return out;
}



eBibleMainWindow::~eBibleMainWindow()
{
    // we have to do almost nothing here. all widgets are automatically removed
    // since they are child of us. the eWidget-destructor will to this for us.
}
You can now exercise to compile source you find in the attach package and to modify it.

Exercises:
- Change this code to work with another site.

That's all, and this is the application shot and the complete package.
This tutorial Ends Here.

hope it can help.
(I apologize for my English)

Regards, Meo aka bacicciosat.
Attached Images
File Type: png osdshot.png (18.8 KB, 58 views)
Attached Files
File Type: zip lesson8.zip (16.7 KB, 60 views)
發佈了19 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章