⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htmlviewerapp.c

📁 一个用c语言写的Html阅读的Brew应用程序.
💻 C
字号:
/**
***     HTMLViewerApp.c
***
***     偙偺僜乕僗僐乕僪偼丄僄儔乕張棟傗僗僩僢僾仌僒僗儁儞僪側偳偺張棟偑敳偗偰偄傑偡丅
***     Copyright (C) 2006 SophiaCradle Incorporated.
***     All rights reserved.
**/

#include "AEEModGen.h"
#include "AEEAppGen.h"
#include "AEEStdLib.h"
#include "AEEShell.h"
#include "HTMLViewerApp.bid"
#include "AEEHTMLViewer.h"

typedef struct HTMLViewerApp {
    AEEApplet a; // 傾僾儗僢僩峔憿懱偺愭摢儊儞僶偼昁偢 AEEApplet 宆偵偡傞偙偲丅

    IDisplay* display;
    int width;
    int height;

    IHtmlViewer* htmlviewer; // IHTMLViewer 僀儞僞乕僼僃乕僗偺僀儞僗僞儞僗曄悢
    char url[256];           // URL 傪奿擺偡傞攝楍

    // Web 捠怣梡
    IWeb* web;               // IWeb 僀儞僞乕僼僃乕僗偺僀儞僗僞儞僗曄悢
    AEECallback callback;
    IWebResp* webresp;
    IGetLine* getline;
} HTMLViewerApp;

static boolean HTMLViewerApp_HandleEvent(HTMLViewerApp* app, AEEEvent eCode, uint16 wParam, uint32 dwParam);
static boolean OnAppStart(HTMLViewerApp* app);
static void HTMLVIEWERNotify(HTMLViewerApp* app, HViewNotify* notify);
static boolean OnAppStop(HTMLViewerApp* app);
static void WebAction_Start(HTMLViewerApp* app, const char* pszUrl);
static void WebAction_GotResp(void* p);
static void WebAction_Header(void* p, const char* name, GetLine* val);
static void WebAction_Status(void* p, WebStatus webstatus, void* val);
static void WebAction_Stop(HTMLViewerApp* app);
static void WebAction_ReadLines(void* p);

int AEEClsCreateInstance(AEECLSID ClsId, IShell* pIShell, IModule* po, void** ppObj)
{
    *ppObj = NULL;
    if (ClsId == AEECLSID_HTMLVIEWERAPP) {
        if (AEEApplet_New(sizeof(HTMLViewerApp), ClsId, pIShell, po, (IApplet**)ppObj, (AEEHANDLER)HTMLViewerApp_HandleEvent, NULL) == TRUE) {
            return AEE_SUCCESS;
        }
    }
    return EFAILED;
}

static boolean HTMLViewerApp_HandleEvent(HTMLViewerApp* app, AEEEvent eCode, uint16 wParam, uint32 dwParam)
{
    if (eCode == EVT_APP_START) {
        return OnAppStart(app);
    }
    else if (app->htmlviewer != NULL && IHTMLVIEWER_HandleEvent(app->htmlviewer, eCode, wParam, dwParam)) {
        // htmlviewer 偵僀儀儞僩傪捠抦丅張棟偝傟傟偽娭悢傪廔椆偡傞丅
        return TRUE;
    }
    else {
        switch (eCode) {
            case EVT_APP_STOP:
                return OnAppStop(app);
        }
    }
    return FALSE;
}

// 傾僾儗僢僩偑奐巒偟偨偲偒偵屇傃弌偝傟傞丅
static boolean OnAppStart(HTMLViewerApp* app)
{
    AEEDeviceInfo devinfo;
    IShell* shell = app->a.m_pIShell;
    AEERect rc;
    char htmlData[] =
        "HtmlViewerApp<br /><br /><br />"
        "<a href=\"http://www.s-cradle.com/example/tabbrowser/\">Access to Sample Page</a><br /><br />"
        "<img src=\"http://www.s-cradle.com/images/SC_logo_3d.jpg\" width=\"92\" height=\"97\" alt=\"SC LOGO\" />";
    WebOpt webopts[2];

    app->display = NULL;
    ISHELL_CreateInstance(shell, AEECLSID_DISPLAY, (void**)&app->display);

    // 夋柺僒僀僘傪庢摼
    ISHELL_GetDeviceInfo(shell, &devinfo);
    app->width = devinfo.cxScreen;
    app->height = devinfo.cyScreen;

    // IHtmlViewer 僀儞僞乕僼僃乕僗嶌惉
    app->htmlviewer = NULL;
    ISHELL_CreateInstance(shell, AEECLSID_HTML, (void**)&app->htmlviewer);
    // 傾僋僥傿僽夋柺偺椞堟愝掕
    rc.x = 5;
    rc.y = 5;
    rc.dx = app->width - 10;
    rc.dy = app->height - 10;
    IHTMLVIEWER_SetRect(app->htmlviewer, &rc);
    // HTML 偺撉傒崬傒
    IHTMLVIEWER_ParseBuffer(app->htmlviewer, htmlData);
    // 捠抦僐乕儖僶僢僋偺愝掕
    IHTMLVIEWER_SetNotifyFn(app->htmlviewer, (PFNHVIEWNOTIFY)HTMLVIEWERNotify, app);
    // Active 愝掕
    IHTMLVIEWER_SetActive(app->htmlviewer, TRUE);

    app->web = NULL;
    ISHELL_CreateInstance(shell, AEECLSID_WEB, (void**)&app->web);

    // 愙懕偺僞僀儉傾僂僩帪娫偺愝掕 (ms)
    webopts[0].nId = WEBOPT_CONNECTTIMEOUT;
    webopts[0].pVal = (void*)10000;

    // WebOpt 廔椆儅乕僋
    webopts[1].nId = WEBOPT_END;

    // 僆僾僔儑儞傪愝掕
    IWEB_AddOpt(app->web, webopts);
    return TRUE;
}

// HTMLViewe 偺僀儀儞僩張棟
static void HTMLVIEWERNotify(HTMLViewerApp* app, HViewNotify* notify)
{
    switch (notify->code) {
        // <a href="xxx">偑墴壓偝傟偨偲偒
        case HVN_JUMP:
            DBGPRINTF(notify->u.jump.pszURL);
            STRCPY(app->url, notify->u.jump.pszURL);
            // 捠怣奐巒
            WebAction_Start(app, app->url);
            break;

        default:
            DBGPRINTF("HTML NOTIFY: %d", notify->code);
            break;
    }
    return;
}

// 傾僾儗僢僩偑廔椆偟偨偲偒偵屇傃弌偝傟傞丅
static boolean OnAppStop(HTMLViewerApp* app)
{
    IWEB_Release(app->web);
    IHTMLVIEWER_Release(app->htmlviewer);
    IDISPLAY_Release(app->display);
    return TRUE;
}

// 捠怣奐巒
static void WebAction_Start(HTMLViewerApp* app, const char* url)
{
    CALLBACK_Init(&app->callback, WebAction_GotResp, app);
    IWEB_GetResponse(app->web,
                    (app->web, &app->webresp, &app->callback, url,
                    WEBOPT_HANDLERDATA, app,
                    WEBOPT_HEADER, "X-Method: GET\r\n",
                    WEBOPT_HEADERHANDLER, WebAction_Header,
                    WEBOPT_STATUSHANDLER, WebAction_Status,
                    WEBOPT_END));
    return;
}

// 儊僢僙乕僕偺庢摼奐巒乮IWeb 傪巊偭偨捠怣偑廔椆偟偨偲偒偺張棟乯
static void WebAction_GotResp(void* p)
{
    HTMLViewerApp* app = (HTMLViewerApp*)p;
    WebRespInfo* info;

    info = IWEBRESP_GetInfo(app->webresp);
    DBGPRINTF("** got response...\n** info code: %d\n", info->nCode);
    if (info->pisMessage != NULL) {
        // 憡懳傾僪儗僗傪夝寛偡傞偨傔丄昞帵偡傞 URL 傪愝掕
        IHTMLVIEWER_SetURL(app->htmlviewer, app->url);
        // HTML 偺撉傒崬傒
        IHTMLVIEWER_LoadSource(app->htmlviewer, info->pisMessage);
    }
    else {
        DBGPRINTF("** no response\n");
    }
    WebAction_Stop(app);
    return;
}

// 僿僢僟乕張棟
static void WebAction_Header(void* p, const char* name, GetLine* val)
{
    if (name != NULL) {
        DBGPRINTF("%s:%s\n", name, val->psz);
    }
    else {
        DBGPRINTF("%s\n", val->psz);
    }
    return;
}

// 忬懺庢摼
static void WebAction_Status(void* p, WebStatus webstatus, void* val)
{
    char* string = 0;
    (void)val;

    switch (webstatus) {
        case WEBS_CANCELLED:
            string = "** cancelled...\n";
            break;

        case WEBS_GETHOSTBYNAME:
            string = "** finding host...\n";
            break;

        case WEBS_CONNECT:
            string = "** connecting...\n";
            break;

        case WEBS_SENDREQUEST:
            string = "** sending...\n";
            break;

        case WEBS_READRESPONSE:
            string = "** receiving...\n";
            break;

        case WEBS_GOTREDIRECT:
            string = "** redirect...\n";
            break;

        case WEBS_CACHEHIT:
            string = "** cache hit...\n";
            break;
    }
    if (string != NULL) {
        DBGPRINTF("%s", string);
    }
    return;
}

// 捠怣廔椆
static void WebAction_Stop(HTMLViewerApp* app)
{
    CALLBACK_Cancel(&app->callback);
    if (app->getline != NULL) {
       IGETLINE_Release(app->getline);
       app->getline = NULL;
    }
    if (app->webresp != NULL) {
       IWEBRESP_Release(app->webresp);
       app->webresp = NULL;
    }
    return;
}

// 儊僢僙乕僕庢摼
static void WebAction_ReadLines(void* p)
{
    int value;
    GetLine getline;
    HTMLViewerApp* app = (HTMLViewerApp*)p;

    value = IGETLINE_GetLine(app->getline, &getline, IGETLINE_LF);
    if (value == IGETLINE_WAIT) {
        CALLBACK_Init(&app->callback, WebAction_ReadLines, app);
        IGETLINE_Peekable(app->getline, &app->callback);
    }
    else {
        DBGPRINTF("%s\n", getline.psz, NULL, TRUE);
        if (!IGETLINE_Exhausted(value)) {
            CALLBACK_Init(&app->callback, WebAction_ReadLines, app);
            IGETLINE_Readable(app->getline, &app->callback);
        }
        else {
            DBGPRINTF((value == IGETLINE_ERROR) ? ("\n** error\n") : ("\n** end\n"));
            WebAction_Stop(app);
        }
    }
    return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -