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

📄 mozembed.cpp

📁 JDesktop Integration Components (JDIC)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        }    }    nsCOMPtr<nsIWebBrowser> webBrowser;    gtk_moz_embed_get_nsIWebBrowser(GTK_MOZ_EMBED(pBrowser->mozEmbed), getter_AddRefs(webBrowser));    nsCOMPtr<nsIWebNavigation> webNavigation(do_QueryInterface(webBrowser));    if (!webNavigation)        return;    nsEmbedString unicodeUrl;    ConvertAsciiToUtf16(pUrl, unicodeUrl);    webNavigation->LoadURI(unicodeUrl.get(), // URI string                           nsIWebNavigation::LOAD_FLAGS_NONE, // Load flags                           nsnull,                            // Refering URI                           postDataStream,                    // Post data                           headersStream);                    // Extra headers}void HandleSocketMessage(gpointer data, gpointer user_data){    int instance, type;    char mMsgBuf[1024];    char *msg = (char *)data;    int i = sscanf(msg, "%d,%d,%s", &instance, &type, mMsgBuf);    NS_ASSERTION(i >= 2, "Wrong message format\n");    // In case that the last message string argument contains spaces, sscanf     // returns before the first space. Below line returns the complete message    // string.    char* mMsgString = (char*)strchr(msg, ',');    mMsgString++;    mMsgString = (char*)strchr(mMsgString, ',');    mMsgString++;    GtkBrowser *pBrowser;    switch (type) {    case JEVENT_INIT:        break;    case JEVENT_CREATEWINDOW:        {            // only create new browser window when the instance does not exist            if (instance < gBrowserArray.GetSize() && gBrowserArray[instance] != NULL)                break;            if (i != 3)                break;            int javaXId = atoi(mMsgString);            NS_ASSERTION(javaXId, "Invalid X window handle\n");            pBrowser = g_new0(GtkBrowser, 1);            pBrowser->topLevelWindow = gtk_plug_new(javaXId);            pBrowser->mozEmbed = gtk_moz_embed_new();            if (pBrowser->mozEmbed) {                gtk_container_add(GTK_CONTAINER(pBrowser->topLevelWindow), pBrowser->mozEmbed);                install_mozembed_cb(pBrowser);                gtk_moz_embed_set_chrome_mask(GTK_MOZ_EMBED(pBrowser->mozEmbed),                    GTK_MOZ_EMBED_FLAG_DEFAULTCHROME);                gtk_widget_realize(pBrowser->topLevelWindow);                gtk_widget_show_all(pBrowser->topLevelWindow);                pBrowser->id = instance;                gBrowserArray.SetAtGrow(instance, pBrowser);                SendSocketMessage(instance, CEVENT_INIT_WINDOW_SUCC);            }            gtk_signal_connect(GTK_OBJECT(pBrowser->topLevelWindow),                   "set-focus", GTK_SIGNAL_FUNC(set_focus_cb), pBrowser);        }        break;    case JEVENT_DESTROYWINDOW:        pBrowser = (GtkBrowser *)gBrowserArray[instance];        if(pBrowser != NULL){            gtk_widget_destroy(pBrowser->mozEmbed);            gtk_object_destroy((GtkObject *)pBrowser->topLevelWindow);            gBrowserArray.SetAt(instance, NULL);        }        SendSocketMessage(instance, CEVENT_DISTORYWINDOW_SUCC);        break;    case JEVENT_SHUTDOWN:        gtk_main_quit();        break;    case JEVENT_SET_BOUNDS:        {            NS_ASSERTION(i == 3, "Wrong message format\n");            int x, y, w, h;            i = sscanf(mMsgString, "%d,%d,%d,%d", &x, &y, &w, &h);            if (i == 4) {                pBrowser = (GtkBrowser *)gBrowserArray[instance];                NS_ASSERTION(pBrowser, "Can't get native browser instance\n");                gtk_widget_set_usize(pBrowser->topLevelWindow, w, h);            }        }        break;    case JEVENT_NAVIGATE:        NS_ASSERTION(i == 3, "Wrong message format\n");        pBrowser = (GtkBrowser *)gBrowserArray[instance];        NS_ASSERTION(pBrowser, "Can't get native browser instance\n");        gtk_moz_embed_load_url(GTK_MOZ_EMBED(pBrowser->mozEmbed), mMsgString);        break;    case JEVENT_NAVIGATE_POST:        NS_ASSERTION(i == 3, "Wrong message format\n");        strncpy(gCachedURL, mMsgString, sizeof(gCachedURL));        break;    case JEVENT_NAVIGATE_POSTDATA:        NS_ASSERTION(i == 3, "Wrong message format\n");        pBrowser = (GtkBrowser *)gBrowserArray[instance];        OpenURL(pBrowser, gCachedURL, mMsgString, POST_HEADER);        break;    case JEVENT_GOBACK:        pBrowser = (GtkBrowser *)gBrowserArray[instance];        NS_ASSERTION(pBrowser, "Can't get native browser instance\n");        gtk_moz_embed_go_back(GTK_MOZ_EMBED(pBrowser->mozEmbed));        break;    case JEVENT_GOFORWARD:        pBrowser = (GtkBrowser *)gBrowserArray[instance];        NS_ASSERTION(pBrowser, "Can't get native browser instance\n");        gtk_moz_embed_go_forward(GTK_MOZ_EMBED(pBrowser->mozEmbed));        break;    case JEVENT_REFRESH:        pBrowser = (GtkBrowser *)gBrowserArray[instance];        NS_ASSERTION(pBrowser, "Can't get native browser instance\n");        gtk_moz_embed_reload(GTK_MOZ_EMBED(pBrowser->mozEmbed), GTK_MOZ_EMBED_FLAG_RELOADNORMAL);        break;    case JEVENT_STOP:        pBrowser = (GtkBrowser *)gBrowserArray[instance];        NS_ASSERTION(pBrowser, "Can't get native browser instance\n");        gtk_moz_embed_stop_load(GTK_MOZ_EMBED(pBrowser->mozEmbed));        break;    case JEVENT_GETURL:        {            pBrowser = (GtkBrowser *)gBrowserArray[instance];            NS_ASSERTION(pBrowser, "Can't get native browser instance\n");            nsCOMPtr<nsIWebBrowser> webBrowser;            gtk_moz_embed_get_nsIWebBrowser(GTK_MOZ_EMBED(pBrowser->mozEmbed), getter_AddRefs(webBrowser));            nsCOMPtr<nsIWebNavigation> webNavigation(do_QueryInterface(webBrowser));            nsCOMPtr<nsIURI> currentURI;            webNavigation->GetCurrentURI(getter_AddRefs(currentURI));            if (currentURI == NULL)                SendSocketMessage(instance, CEVENT_RETURN_URL, "");            else {             	nsEmbedCString uriString;                currentURI->GetAsciiSpec(uriString);                SendSocketMessage(instance, CEVENT_RETURN_URL, uriString.get());            }        }        break;    case JEVENT_FOCUSGAINED:    case JEVENT_FOCUSLOST:        {            pBrowser = (GtkBrowser *)gBrowserArray[instance];            NS_ASSERTION(pBrowser, "Can't get native browser instance\n");            if (!pBrowser->topLevelWindow) {                ReportError("Top level Window is Null!\n");                break;            }            GtkWidget *widget = GTK_WIDGET (pBrowser->topLevelWindow);            GdkEvent event;            GtkWindowClass *parent_class = (GtkWindowClass*) gtk_type_class (GTK_TYPE_WINDOW);            if (!widget) {                ReportError("Failed to get browser's toplevel window !\n");                break;            }            if (!parent_class) {                ReportError("Failed to get gtk window class !\n");                break;            }            event.focus_change.type = GDK_FOCUS_CHANGE;            event.focus_change.window = widget->window;            event.focus_change.send_event = TRUE;            if (type == JEVENT_FOCUSGAINED) {                event.focus_change.in = TRUE;                GTK_WIDGET_CLASS (parent_class)->focus_in_event                            (widget, (GdkEventFocus *)&event);            }            else {                event.focus_change.in = FALSE;                GTK_WIDGET_CLASS (parent_class)->focus_out_event                            (widget, (GdkEventFocus *)&event);            }        }        break;    case JEVENT_GETCONTENT:        {            pBrowser = (GtkBrowser *)gBrowserArray[instance];            NS_ASSERTION(pBrowser, "Can't get native browser instance\n");            nsCOMPtr<nsIWebBrowser> webBrowser;            gtk_moz_embed_get_nsIWebBrowser(GTK_MOZ_EMBED(pBrowser->mozEmbed),                     getter_AddRefs(webBrowser));            nsCOMPtr<nsIWebNavigation>                 webNavigation(do_QueryInterface(webBrowser));                                                                                                                        char *retStr = GetContent(webNavigation);            if (retStr == NULL)                SendSocketMessage(instance, CEVENT_GETCONTENT, "");            else                SendSocketMessage(instance, CEVENT_GETCONTENT, retStr);        }         break;    case JEVENT_SETCONTENT:        {            NS_ASSERTION(i == 3, "Wrong message format\n");            pBrowser = (GtkBrowser *)gBrowserArray[instance];            NS_ASSERTION(pBrowser, "Can't get native browser instance\n");            nsCOMPtr<nsIWebBrowser> webBrowser;            gtk_moz_embed_get_nsIWebBrowser(GTK_MOZ_EMBED(pBrowser->mozEmbed),                     getter_AddRefs(webBrowser));            nsCOMPtr<nsIWebNavigation>                 webNavigation(do_QueryInterface(webBrowser));                        SetContent(webNavigation, mMsgString);        }        break;    case JEVENT_EXECUTESCRIPT:        {            NS_ASSERTION(i == 3, "Wrong message format\n");            pBrowser = (GtkBrowser *)gBrowserArray[instance];            NS_ASSERTION(pBrowser, "Can't get native browser instance\n");            nsCOMPtr<nsIWebBrowser> webBrowser;            gtk_moz_embed_get_nsIWebBrowser(GTK_MOZ_EMBED(pBrowser->mozEmbed),                     getter_AddRefs(webBrowser));            nsCOMPtr<nsIWebNavigation>                 webNavigation(do_QueryInterface(webBrowser));                                                                                                                        char *retStr = ExecuteScript(webNavigation, mMsgString);            if (retStr == NULL)                SendSocketMessage(instance, CEVENT_EXECUTESCRIPT, "");            else                SendSocketMessage(instance, CEVENT_EXECUTESCRIPT, retStr);        }         break;    }}extern "C" int mozembed_main(int argc, char **argv);intmozembed_main(int argc, char **argv){    if (argc > 1) {        if (strstr(argv[1], "-port=")) {            int port = atoi(&(argv[1][6]));            gMessenger.SetPort(port);            gMessenger.CreateServerSocket();        }        else if (strcmp(argv[1], "-test") == 0) {            gTestMode = 1;        }    }        if (!gTestMode && gMessenger.IsFailed()) {        ReportError("Failed to create server socket!");        exit(1);    }    gtk_set_locale();    gtk_init(&argc, &argv);    // force the startup code to be executed because we need to start    // the profile in a different way    gtk_moz_embed_push_startup();    if (NS_FAILED(InitializeProfile())) {        ReportError("Failed to initialize profile!");        exit(1);    }    gMsgLock = PR_NewLock();    if (!gTestMode) {        PRThread *socketListenThread =           PR_CreateThread(PR_USER_THREAD,                          PortListening,                          (void*)SocketMsgHandler,                          PR_PRIORITY_NORMAL,                          PR_GLOBAL_THREAD,                          PR_UNJOINABLE_THREAD,                          0);        if (!socketListenThread) {            ReportError("Failed to create socket listening thread!");            exit(1);        }        // add event source to process socket messages#ifdef MOZ_WIDGET_GTK        g_source_add (GDK_PRIORITY_EVENTS, TRUE, &event_funcs, NULL, NULL, NULL);#endif#ifdef MOZ_WIDGET_GTK2        GSource *newsource = g_source_new(&event_funcs, sizeof(GSource));        g_source_attach(newsource, NULL);#endif    }    else {        GtkBrowser *browser = new_gtk_browser(GTK_MOZ_EMBED_FLAG_DEFAULTCHROME);                // set our minimum size        gtk_widget_set_usize(browser->mozEmbed, 400, 400);                set_browser_visibility(browser, TRUE);    }    // get the singleton object and hook up to its new window callback    // so we can create orphaned windows.    GtkMozEmbedSingle *single;    single = gtk_moz_embed_single_get();    if (!single) {        ReportError("Failed to get singleton embed object!");        exit(1);    }    gtk_signal_connect(GTK_OBJECT(single), "new_window_orphan",        GTK_SIGNAL_FUNC(new_window_orphan_cb), NULL);    gtk_main();    gtk_moz_embed_pop_startup();    PR_DestroyLock(gMsgLock);    return 0;}// this function is running in the socket listening threadvoid SocketMsgHandler(const char *pMsg){    char *msg = new char[strlen(pMsg) + 1];    strcpy(msg, pMsg);    PR_Lock(gMsgLock);    gMessageList = g_list_append(gMessageList, msg);    PR_Unlock(gMsgLock);}gboolean #ifdef MOZ_WIDGET_GTKgs_prepare_cb(gpointer source_data,              GTimeVal *current_time,              gint     *timeout,              gpointer  user_data)#endif#ifdef MOZ_WIDGET_GTK2gs_prepare_cb(GSource  *source,              gint     *timeout)#endif{    *timeout = 10;    PR_Lock(gMsgLock);    gboolean ret = (g_list_first(gMessageList) != NULL);    PR_Unlock(gMsgLock);    return ret;}gboolean #ifdef MOZ_WIDGET_GTKgs_check_cb(gpointer source_data,            GTimeVal *current_time,            gpointer  user_data)#endif#ifdef MOZ_WIDGET_GTK2gs_check_cb(GSource *source)#endif{    return FALSE;}gboolean #ifdef MOZ_WIDGET_GTKgs_dispatch_cb(gpointer source_data,               GTimeVal *current_time,               gpointer  user_data)#endif#ifdef MOZ_WIDGET_GTK2gs_dispatch_cb(GSource    *source,               GSourceFunc callback,               gpointer  user_data)#endif{    PR_Lock(gMsgLock);    GList *tmpList = g_list_copy(gMessageList);    g_list_free(gMessageList);    gMessageList = NULL;    PR_Unlock(gMsgLock);    g_list_foreach(tmpList, HandleSocketMessage, NULL);    return TRUE;}

⌨️ 快捷键说明

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