日期:2014-05-16 浏览次数:20697 次
#define MIN(a,b) ((a) <= (b) ? (a) : (b)) #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <dlfcn.h> #include <gtk/gtk.h> #include <gdk/gdkx.h> #include "npapi.h" #include "npupp.h" static void *handle; static GtkWidget *window; static GtkWidget *socket; /* plugin meta member functions */ char* (*gNP_GetMIMEDescription)(void); NPError (*gNP_Initialize)(NPNetscapeFuncs* aNPNFuncs, NPPluginFuncs* aNPPFuncs); NPError (*gNP_GetValue)(void* future, NPPVariable variable, void *value); NPError (*gNP_Shutdown)(void); /* Create a new plugin instance, passing some very basic arguments */ static NPError CallNew(NPPluginFuncs *NPPFuncs, NPP plugin, char *swf_file, int width, int height) { NPError err = NPERR_NO_ERROR; char width_s[8]; char height_s[8]; int16 argc = 5; char* argn[5]; char* argv[5]; NPBool xembed; sprintf(width_s, "%d", width); sprintf(height_s, "%d", height); argn[0] = "SRC"; argn[1] = "WIDTH"; argn[2] = "HEIGHT"; argn[3] = "MENU"; argn[4] = "LOOP"; argv[0] = swf_file; argv[1] = width_s; argv[2] = height_s; argv[3] = "FALSE"; argv[4] = "TRUE"; #ifdef DEBUG printf("swf_file: %s, width_s: %s, height_s: %s\n", swf_file, width_s, height_s); #endif //DEBUG NPPFuncs->newp("application/x-shockwave-flash:swf:Shockwave Flash", \ plugin, NP_EMBED, argc, argn, argv, NULL); xembed = true; err = NPPFuncs->getvalue(plugin, NPPVpluginNeedsXEmbed, &xembed); if(err != NPERR_NO_ERROR) fprintf(stderr, "ouch\n"); return err; } /* Create a new Xt window and pass it to the plugin. */ static NPError CallSetWindow(NPPluginFuncs *NPPFuncs, NPP plugin, int width, int height) { NPSetWindowCallbackStruct ws_info; NPWindow win; GdkDrawable *draw = (GdkDrawable *)(socket->window); Window window = GDK_DRAWABLE_XID(draw); memset(&ws_info, 0, sizeof(NPSetWindowCallbackStruct)); memset(&win, 0, sizeof(NPWindow)); ws_info.type = NP_SETWINDOW; ws_info.display = GDK_DRAWABLE_XDISPLAY(draw); ws_info.visual = GDK_VISUAL_XVISUAL(gdk_drawable_get_visual(draw)); ws_info.colormap = GDK_COLORMAP_XCOLORMAP(gdk_drawable_get_colormap(draw)); ws_info.depth = gdk_drawable_get_depth(draw); win.type = NPWindowTypeDrawable; win.x = 0; win.y = 0; win.width = width; win.height = height; win.ws_info = &ws_info; win.window = &window; //here out "segment fault"!!! //NPPFuncs->setwindow(plugin, &win); } //* Open, read, and write the contents of swf_file to the plugin instance. */ static NPError SendSrcStream(NPPluginFuncs *NPPFuncs, NPP plugin, char *swf_file) { NPError err = NPERR_NO_ERROR; NPMIMEType type = "application/x-shockwave-flash"; struct stat buf; //file state struct NPStream stream; uint16 stype = 0; FILE *swf_fd; char data[1024*10+1]; int write_idx, write_max; int bytes_read, bytes_written; char *pfn; NPError reason; memset(&stream, 0, sizeof(NPStream)); if(access(swf_file, F_OK) != 0) return NPERR_FILE_NOT_FOUND; int fd = open(swf_file, O_RDONL