#line 25 "dynload.c-nw" #include "config.h" #include #include #include #include #include #include /* #include */ #include "w3a.h" #include "str.h" #include "pushbuttons.h" #include "rcfile.e" #include "globals.e" typedef struct { int function, code; } FunctionCallbackInfo; static W3ABrowserInfo browser_info = { "Argo/1.0", 0, NULL, NULL, }; /* * The following could be done with macros, for more efficiency */ EXPORT Bool viewer_open(int viewer, const W3ADocumentInfo doc, W3AWindow win, long id) { assert(0 <= viewer && viewer < nrviewers); return viewers[viewer].open(doc, win, id); } EXPORT int viewer_write(int viewer, long id, const char *buf, size_t nbytes) { assert(0 <= viewer && viewer < nrviewers); return viewers[viewer].write(id, buf, nbytes); } EXPORT Bool viewer_close(int viewer, long id) { assert(0 <= viewer && viewer < nrviewers); return viewers[viewer].close(id); } EXPORT Bool viewer_info(int viewer, long id, W3ADocumentInfo *doc) { assert(0 <= viewer && viewer < nrviewers); return viewers[viewer].info(id, doc); } EXPORT void viewer_event(int viewer, long id, long sourceid, long eventtype, void *params) { assert(0 <= viewer && viewer < nrviewers); viewers[viewer].event(id, sourceid, eventtype, params); } EXPORT int agent_open(int agent, const char *url, int method, int flags, const char *referer) { assert(0 <= agent && agent < nragents); return agents[agent].open(url, method, flags, referer); } EXPORT Bool agent_done(int agent, int fd) { assert(0 <= agent && agent < nragents); return agents[agent].done(fd); } EXPORT int agent_peek(int agent, int fd) { assert(0 <= agent && agent < nragents); return agents[agent].peek(fd); } EXPORT int agent_read(int agent, int fd, char *buf, size_t nbytes) { assert(0 <= agent && agent < nragents); return agents[agent].read(fd, buf, nbytes); } EXPORT int agent_write(int agent, int fd, const char *buf, size_t nbytes) { assert(0 <= agent && agent < nragents); return agents[agent].write(fd, buf, nbytes); } EXPORT Bool agent_close(int agent, int fd) { assert(0 <= agent && agent < nragents); return agents[agent].close(fd); } EXPORT Bool agent_delete(int agent, const char *url) { assert(0 <= agent && agent < nragents); return agents[agent].delete(url); } EXPORT Bool agent_info(int agent, int fd, W3ADocumentInfo *doc) { assert(0 <= agent && agent < nragents); return agents[agent].info(fd, doc); } EXPORT Bool filter_open(int filter, const char *from_type, const char *from_params, const char *to_type, const char *to_params, long id) { assert(0 <= filter && filter < nrfilters); return filters[filter].open(from_type, from_params, to_type, to_params, id); } EXPORT int filter_write(int filter, long id, const char *buf, size_t nbytes) { assert(0 <= filter && filter < nrfilters); return filters[filter].write(id, buf, nbytes); } EXPORT int filter_read(int filter, long id, char *buf, size_t nbytes) { assert(0 <= filter && filter < nrfilters); return filters[filter].read(id, buf, nbytes); } EXPORT Bool filter_close(int filter, long id) { assert(0 <= filter && filter < nrfilters); return filters[filter].close(id); } EXPORT Bool function_doit(int function, int code, int mid_x, int mid_y) { assert(0 <= function && function < nrfunctions); return userfns[function].doit(code, mid_x, mid_y); } EXPORT void function_event(int function, long sourceid, long eventtype, void *params) { assert(0 <= function && function < nrfunctions); userfns[function].event(sourceid, eventtype, params); } EXPORT Bool printer_open(int printer, const W3ADocumentInfo doc, long id) { assert(0 <= printer && printer < nrprinters); return printers[printer].open(doc, id); } EXPORT int printer_write(int printer, long id, const char *buf, size_t nbytes) { assert(0 <= printer && printer < nrprinters); return printers[printer].write(id, buf, nbytes); } EXPORT Bool printer_close(int printer, long id) { assert(0 <= printer && printer < nrprinters); return printers[printer].close(id); } #ifndef hp9000s300 #define INIT "init" #define OPEN "open" #define DONE "done" #define PEEK "peek" #define READ "read" #define WRITE "write" #define CLOSE "close" #define DELETE "delete" #define INFO "info" #define DO "do" #define EVENT "event" #else #define INIT "_init" #define OPEN "_open" #define DONE "_done" #define PEEK "_peek" #define READ "_read" #define WRITE "_write" #define CLOSE "_close" #define DELETE "_delete" #define INFO "_info" #define DO "_do" #define EVENT "_event" #endif static void load_viewer(int viewer) { char init[256], open[256], write[256], close[256], info[256], event[256]; Viewer *v = &viewers[viewer]; shl_t h; sprintf(init, "%s%s", INIT, strip2str(v->suffix)); sprintf(open, "%s%s", OPEN, strip2str(v->suffix)); sprintf(write, "%s%s", WRITE, strip2str(v->suffix)); sprintf(close, "%s%s", CLOSE, strip2str(v->suffix)); sprintf(info, "%s%s", INFO, strip2str(v->suffix)); sprintf(event, "%s%s", EVENT, strip2str(v->suffix)); if (! (h = shl_load(strip2str(v->file), BIND_IMMEDIATE|BIND_NONFATAL, 0))) error("Error loading %s\n\t(%s)\n", strip2str(v->file), strerror(errno)); if (shl_findsym(&h, init, TYPE_PROCEDURE, (void *)&v->init) != 0) error("Error loading %s (%s)\n", init, strerror(errno)); if (shl_findsym(&h, open, TYPE_PROCEDURE, (void *)&v->open) != 0) error("Error loading %s (%s)\n", open, strerror(errno)); if (shl_findsym(&h, write, TYPE_PROCEDURE, (void *)&v->write) != 0) error("Error loading %s (%s)\n", write, strerror(errno)); if (shl_findsym(&h, close, TYPE_PROCEDURE, (void *)&v->close) != 0) error("Error loading %s (%s)\n", close, strerror(errno)); if (shl_findsym(&h, info, TYPE_PROCEDURE, (void *)&v->info) != 0) error("Error loading %s (%s)\n", info, strerror(errno)); if (shl_findsym(&h, event, TYPE_PROCEDURE, (void *)&v->event) != 0) error("Error loading %s (%s)\n", info, strerror(errno)); } static void load_agent(int agent) { char init[256], open[256], read[256], write[256], close[256]; char delete[256], info[256], peek[256], done[256]; Agent *a = &agents[agent]; shl_t h; sprintf(init, "%s%s", INIT, strip2str(a->suffix)); sprintf(open, "%s%s", OPEN, strip2str(a->suffix)); sprintf(write, "%s%s", WRITE, strip2str(a->suffix)); sprintf(done, "%s%s", DONE, strip2str(a->suffix)); sprintf(peek, "%s%s", PEEK, strip2str(a->suffix)); sprintf(read, "%s%s", READ, strip2str(a->suffix)); sprintf(close, "%s%s", CLOSE, strip2str(a->suffix)); sprintf(delete, "%s%s", DELETE, strip2str(a->suffix)); sprintf(info, "%s%s", INFO, strip2str(a->suffix)); if (! (h = shl_load(strip2str(a->file), BIND_IMMEDIATE|BIND_NONFATAL, 0))) error("Error loading %s (%s)\n", strip2str(a->file), strerror(errno)); if (shl_findsym(&h, init, TYPE_PROCEDURE, (void *)&a->init) != 0) error("Error loading %s (%s)\n", init, strerror(errno)); if (shl_findsym(&h, open, TYPE_PROCEDURE, (void *)&a->open) != 0) error("Error loading %s (%s)\n", open, strerror(errno)); if (shl_findsym(&h, done, TYPE_PROCEDURE, (void *)&a->done) != 0) error("Error loading %s (%s)\n", done, strerror(errno)); if (shl_findsym(&h, peek, TYPE_PROCEDURE, (void *)&a->peek) != 0) error("Error loading %s (%s)\n", peek, strerror(errno)); if (shl_findsym(&h, read, TYPE_PROCEDURE, (void *)&a->read) != 0) error("Error loading %s (%s)\n", read, strerror(errno)); if (shl_findsym(&h, write, TYPE_PROCEDURE, (void *)&a->write) != 0) error("Error loading %s (%s)\n", write, strerror(errno)); if (shl_findsym(&h, close, TYPE_PROCEDURE, (void *)&a->close) != 0) error("Error loading %s (%s)\n", close, strerror(errno)); if (shl_findsym(&h, delete, TYPE_PROCEDURE, (void *)&a->delete) != 0) error("Error loading %s (%s)\n", delete, strerror(errno)); if (shl_findsym(&h, info, TYPE_PROCEDURE, (void *)&a->info) != 0) error("Error loading %s (%s)\n", info, strerror(errno)); } static void load_filter(int filter) { char init[256], open[256], read[256], write[256], close[256]; Filter *f = &filters[filter]; shl_t h; sprintf(init, "%s%s", INIT, strip2str(f->suffix)); sprintf(open, "%s%s", OPEN, strip2str(f->suffix)); sprintf(write, "%s%s", WRITE, strip2str(f->suffix)); sprintf(read, "%s%s", READ, strip2str(f->suffix)); sprintf(close, "%s%s", CLOSE, strip2str(f->suffix)); if (! (h = shl_load(strip2str(f->file), BIND_IMMEDIATE|BIND_NONFATAL, 0)) || shl_findsym(&h, init, TYPE_PROCEDURE, (void *)&f->init) != 0 || shl_findsym(&h, open, TYPE_PROCEDURE, (void *)&f->open) != 0 || shl_findsym(&h, read, TYPE_PROCEDURE, (void *)&f->read) != 0 || shl_findsym(&h, write, TYPE_PROCEDURE, (void *)&f->write) != 0 || shl_findsym(&h, close, TYPE_PROCEDURE, (void *)&f->close) != 0) error("Error loading %s\n\t(%s, %s, %s, %s, %s)\n\t(%s)\n", strip2str(f->file), init, open, read, write, close, strerror(errno)); } static void load_printer(int printer) { Printer *p = &printers[printer]; char init[256], open[256], write[256], close[256]; shl_t h; sprintf(init, "%s%s", INIT, strip2str(p->suffix)); sprintf(open, "%s%s", OPEN, strip2str(p->suffix)); sprintf(write, "%s%s", WRITE, strip2str(p->suffix)); sprintf(close, "%s%s", CLOSE, strip2str(p->suffix)); if (! (h = shl_load(strip2str(p->file), BIND_IMMEDIATE|BIND_NONFATAL, 0)) || shl_findsym(&h, init, TYPE_PROCEDURE, (void *)&p->init) != 0 || shl_findsym(&h, open, TYPE_PROCEDURE, (void *)&p->open) != 0 || shl_findsym(&h, write, TYPE_PROCEDURE, (void *)&p->write) != 0 || shl_findsym(&h, close, TYPE_PROCEDURE, (void *)&p->close) != 0) error("Error loading %s\n\t(%s, %s, %s, %s)\n\t(%s)\n", strip2str(p->file), init, open, write, close, strerror(errno)); } static void function_cb(Widget w, XtPointer client_data, XtPointer call_data) { FunctionCallbackInfo *info = (FunctionCallbackInfo *) client_data; /* TO DO: compute real mid_x and mid_y */ /* TO DO: do something with failure */ if (! function_doit(info->function, info->code, 100, 100)) ; } static void load_function(int function) { char init[256], doit[256], event[256]; UserFunction *f = &userfns[function]; shl_t h; sprintf(init, "%s%s", INIT, strip2str(f->suffix)); sprintf(doit, "%s%s", DO, strip2str(f->suffix)); sprintf(event, "%s%s", EVENT, strip2str(f->suffix)); if (! (h = shl_load(strip2str(f->file), BIND_IMMEDIATE|BIND_NONFATAL, 0))) error("Error linking %s (%s)\n", strip2str(f->file), strerror(errno)); if (shl_findsym(&h, init, TYPE_PROCEDURE, &f->init) != 0) error("Error loading \"%s\" (%s)\n", init, strerror(errno)); if (shl_findsym(&h, doit, TYPE_PROCEDURE, &f->doit) != 0) error("Error loading \"%s\" (%s)\n", doit, strerror(errno)); if (shl_findsym(&h, event, TYPE_PROCEDURE, &f->event) != 0) error("Error loading \"%s\" (%s)\n", event, strerror(errno)); } EXPORT int find_viewer(const char *mime_type) { int v, i; for (v = 0; v < nrviewers; v++) for (i = 0; i < viewers[v].nrtypes; i++) if (fnmatch(viewers[v].mime_types[i], mime_type, FNM_PATHNAME) == 0) return v; return -1; } EXPORT int find_agent(const char *protocol) /* TO DO: use proxy */ { int a, i; for (a = 0; a < nragents; a++) for (i = 0; i < agents[a].nrprotocols; i++) if (eq(agents[a].protocols[i], protocol)) return a; return -1; } EXPORT int find_filter(const char *from, int n) { int f, i; for (f = 0; f < nrfilters; f++) for (i = 0; i < filters[f].nrfromto; i++) if (fnmatch(filters[f].from[i], from, 0) == 0) return f; return -1; } EXPORT int find_printer(const char *mime_type) { int p, i; for (p = 0; p < nrprinters; p++) for (i = 0; i < printers[p].nrtypes; i++) if (fnmatch(printers[p].mime_types[i], mime_type, 0) == 0) return p; return -1; } static void init_browser_info(void) { float *preferences; char **formats; int n, i, j; j = 0; for (n = 0; n < nrviewers; n++) for (i = 0; i < viewers[n].nrtypes; i++) j++; for (n = 0; n < nrfilters; n++) for (i = 0; i < filters[n].nrfromto; i++) j++; newarray(formats, j); newarray(preferences, j); j = 0; for (n = 0; n < nrviewers; n++) for (i = 0; i < viewers[n].nrtypes; i++, j++) { formats[j] = viewers[n].mime_types[i]; preferences[j] = viewers[n].prefs[i]; } for (n = 0; n < nrfilters; n++) for (i = 0; i < filters[n].nrfromto; i++, j++) { formats[j] = filters[n].from[i]; preferences[j] = filters[n].prefs[i]; } browser_info.formats = formats; browser_info.preferences = preferences; browser_info.nformats = j; } #define initerr(x) \ error("Error while calling init%s (%s)\n", \ strip2str(x.suffix), strerror(errno)); EXPORT void init_all_applets() { char **labels; ThreeIcons *icons_data; FunctionCallbackInfo *info; int nrlabels, i, j; Widget w; for (i = 0; i < nragents; i++) { if (! agents[i].init) load_agent(i); if (! agents[i].init(&agents[i].protocols, &agents[i].nrprotocols)) initerr(agents[i]); } for (i = 0; i < nrviewers; i++) { if (! viewers[i].init) load_viewer(i); if (! viewers[i].init(&viewers[i].mime_types, &viewers[i].nrtypes, &viewers[i].prefs)) initerr(viewers[i]); } for (i = 0; i < nrfilters; i++) { if (! filters[i].init) load_filter(i); if (! filters[i].init(&filters[i].from, &filters[i].to, &filters[i].nrfromto, &filters[i].prefs)) initerr(filters[i]); } for (i = 0; i < nrprinters; i++) { if (! printers[i].init) load_printer(i); if (! printers[i].init(&printers[i].mime_types, &printers[i].nrtypes)) initerr(printers[i]); } for (i = 0; i < nrfunctions; i++) { char *h; if (! userfns[i].init) load_function(i); new(h); userfns[i].id = (long) h; /* Unique ID */ if (! userfns[i].init(userfns[i].id, &labels, &icons_data, &nrlabels)) initerr(userfns[i]); /* Add labels to menu and icons to toolbar */ for (j = 0; j < nrlabels; j++) { new(info); info->function = i; info->code = j + 1; w = XtVaCreateManagedWidget /* Add labels to menu */ (labels[j], xmPushButtonGadgetClass, functionsmenu, NULL); XtAddCallback(w, XmNactivateCallback, function_cb, info); w = XmCreatePixmapPushButtonGadget /* Add buttons to toolbar */ (tools, labels[j], icons_data[j][0], icons_data[j][1], icons_data[j][2], NULL, 0); XtManageChild(w); XtAddCallback(w, XmNactivateCallback, function_cb, info); } } init_browser_info(); } EXPORT void W3AbrowserInfo(W3ABrowserInfo *info) { assert(browser_info.formats); *info = browser_info; }