Milán Major

netscape-revival

1 branch
Code

cmd/xfe/plugins/nullplugin/nullplugin.c

/*
 * nullplugin.c
 *
 * Implementation of the null plugins for Unix.
 *
 * dp <dp@netscape.com>
 *
 */

#include <stdio.h>
#include <Xm/Xm.h>
#include <Xm/MessageB.h>
#include "npapi.h"
#include "nullplugin.h"

/* Global data */
MimeTypeElement *head = NULL;

static void
UnmanageChild_safe (Widget w)
{
  if (w) XtUnmanageChild (w);
}

static void
nullPlugin_destroy_cb(Widget widget, XtPointer closure, XtPointer call_data)
{
	XmAnyCallbackStruct *cb = (XmAnyCallbackStruct *) call_data;
	PluginInstance* This = (PluginInstance*) closure;
	This->dialog = NULL;
}

static void
nullPlugin_cb(Widget widget, XtPointer closure, XtPointer call_data)
{
	XmAnyCallbackStruct *cb = (XmAnyCallbackStruct *) call_data;
	PluginInstance* This = (PluginInstance*) closure;
	char *url;
	char *urlpage = PLUGINSPAGE_URL;

	switch (cb->reason) {
	    case XmCR_OK:
			XtUnmanageChild(This->dialog);
			if (This->pluginsPageUrl) urlpage = This->pluginsPageUrl;
			url = NPN_MemAlloc(strlen(urlpage)+
						1+	/* For ? */
						strlen(This->type)+
						1	/* For NULL */
				);
			if (url) {
				sprintf(url, "%s?%s", urlpage, This->type);
				NPN_GetURL(This->instance, url, "PluginRegistry");
				NPN_MemFree(url);
			}

			break;

	    case XmCR_CANCEL:
			XtUnmanageChild(This->dialog);
			break;
	}
}


void
showPluginDialog(Widget widget, XtPointer closure, XtPointer call_data)
{
	PluginInstance* This = (PluginInstance*) closure;
	Widget dialog;
	Arg av[20];
	int ac;
	XmString xmstr;
	char message[1024];

	if (!This) return;

	dialog = This->dialog;

	if (dialog) {
		/* The dialog is already available */
		XtManageChild(dialog);
		XMapRaised(XtDisplay(dialog), XtWindow(dialog));
		return;
	}

	/* Create the dialog */

	sprintf(message, MESSAGE, This->type);

	xmstr = XmStringCreateLtoR(message, XmSTRING_DEFAULT_CHARSET);

	ac = 0;
	XtSetArg (av[ac], XmNvisual, This->visual); ac++;
	XtSetArg (av[ac], XmNdepth, This->depth); ac++;
	XtSetArg (av[ac], XmNcolormap, This->colormap); ac++;
	XtSetArg (av[ac], XmNallowShellResize, TRUE); ac++;
	XtSetArg (av[ac], XmNdialogStyle, XmDIALOG_MODELESS); ac++;
	XtSetArg (av[ac], XmNdialogType, XmDIALOG_QUESTION); ac++;
	XtSetArg (av[ac], XmNdeleteResponse, XmUNMAP); ac++;
	XtSetArg (av[ac], XmNautoUnmanage, False); ac++;
	XtSetArg (av[ac], XmNmessageString, xmstr); ac++;
	dialog = XmCreateMessageDialog(This->button, "nullpluginDialog",
					av, ac);

	UnmanageChild_safe (XmMessageBoxGetChild (dialog,
						XmDIALOG_HELP_BUTTON));

	XtAddCallback(dialog, XmNokCallback, nullPlugin_cb, This);
	XtAddCallback(dialog, XmNcancelCallback, nullPlugin_cb, This);
	XtAddCallback(dialog, XmNdestroyCallback, nullPlugin_destroy_cb, This);

	XmStringFree(xmstr);

	This->dialog = dialog;
	XtManageChild(dialog);
}

/* MIMETypeList maintenance routines */

static Boolean
isEqual(NPMIMEType t1, NPMIMEType t2)
{
	return(strcmp(t1, t2) == 0);
}

static Boolean
isExist(MimeTypeElement **typelist, NPMIMEType type)
{
	MimeTypeElement *ele;

	if (typelist == NULL) return False;

	ele = *typelist;
	while (ele != NULL) {
		if (isEqual(ele->value, type))
			return True;
		ele = ele->next;
	}
	return False;
}

NPMIMEType
dupMimeType(NPMIMEType type)
{
	NPMIMEType mimetype = NPN_MemAlloc(strlen(type)+1);
	if (mimetype)
		strcpy(mimetype, type);
	return(mimetype);
}

int
addToList(MimeTypeElement **typelist, NPMIMEType type)
{
	MimeTypeElement *ele;

	if (!typelist) return(0);

	if (isExist(typelist, type)) return(0);

	ele = (MimeTypeElement *) NPN_MemAlloc(sizeof(MimeTypeElement));
	ele->value = dupMimeType(type);
	ele->next = *typelist;
	*typelist = ele;
	return(1);
}