dmose%mozilla.org 0efb7c174c updated xPL license boilerplate to v1.1, a=chofmann@netscape.com,r=endico@mozilla.org
git-svn-id: svn://10.0.0.236/trunk@52910 18797224-902f-48f8-a5cc-f745e15eee43
1999-11-06 03:43:54 +00:00

210 lines
4.3 KiB
C

/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#include "xp_core.h"
#include "xp_mcom.h"
#include "jsapi.h"
#include "prefapi.h"
#include "fe_proto.h"
#include "hk_funcs.h"
#include "hk_private.h"
/**************************************************
* This is a special function just to read in the
* users special hook.js file and interpret it
* into the special javascript hook filter object.
**************************************************/
void
HK_JSErrorReporter(JSContext *cx, const char *message, JSErrorReport *report);
void
HK_ReadHookFile(char *filename)
{
JSErrorReporter err_reporter;
JSContext *j_context;
JSObject *hook_obj;
JSBool ret;
jsval result;
XP_File file_ptr;
XP_StatStruct stat_info;
int32 file_len;
int32 read_len;
char *read_buf;
/*
* If we can't get a valid javascript context, just return.
*/
if (!PREF_GetConfigContext(&j_context))
{
return;
}
if (j_context == NULL)
{
return;
}
/*
* If we don't have a javascript hook object, try to create one,
* if we fail, then return.
*/
hook_obj = hk_GetHookObject();
if (hook_obj == NULL)
{
if (HK_Init() == 0)
{
return;
}
else
{
hook_obj = hk_GetHookObject();
}
if (hook_obj == NULL)
{
return;
}
}
/*
* If the hook.js file doesn't exist or has
* zero size, return.
*/
if (XP_Stat(filename, &stat_info, xpJSHTMLFilters) < 0)
{
return;
}
file_len = stat_info.st_size;
if (file_len <= 1)
{
return;
}
/*
* If the hook.js cannot be opened for reading, return.
*/
file_ptr = XP_FileOpen(filename, xpJSHTMLFilters, XP_FILE_READ);
if (file_ptr == NULL)
{
return;
}
/*
* If a buffer to read hook.js cannot be allocated, return.
*/
read_buf = XP_ALLOC(file_len * sizeof(char));
if (read_buf == NULL)
{
return;
}
read_len = XP_FileRead(read_buf, file_len, file_ptr);
(void)XP_FileClose(file_ptr);
/*
* Evaluate the file in the javascript hook object.
*/
err_reporter = JS_SetErrorReporter(j_context, HK_JSErrorReporter);
ret = JS_EvaluateScript(j_context, hook_obj, read_buf, read_len,
filename, 0, &result);
JS_SetErrorReporter(j_context, err_reporter);
XP_FREE(read_buf);
}
/* copied from libpref */
/* Platform specific alert messages */
static void
hk_Alert(char* msg)
{
#if defined(XP_MAC) || defined(XP_UNIX)
#if defined(XP_UNIX)
if (getenv("NO_PREF_SPAM") == NULL)
#endif
FE_Alert(NULL, msg);
#endif
#if defined (XP_WIN)
MessageBox (NULL, msg, "Netscape -- JS Preference Warning", MB_OK);
#endif
}
/*
* Mostly copied from elsewhere, reports errors in the
* hook.js file as it is read.
*/
void
HK_JSErrorReporter(JSContext *cx, const char *message, JSErrorReport *report)
{
char *last;
int i, j, k, n;
const char *s, *t;
last = PR_sprintf_append(0, "An error occurred reading the HTML hook file.");
last = PR_sprintf_append(last, "\n\n");
if (!report)
{
last = PR_sprintf_append(last, "%s\n", message);
}
else
{
if (report->filename)
{
last = PR_sprintf_append(last, "%s, ",
report->filename);
}
if (report->lineno)
{
last = PR_sprintf_append(last, "line %u: ",
report->lineno);
}
last = PR_sprintf_append(last, "%s. ", message);
if (report->linebuf)
{
for (s = t = report->linebuf; *s != '\0'; s = t)
{
for (; t != report->tokenptr && *t != '<' && *t != '\0'; t++)
;
last = PR_sprintf_append(last, "%.*s", t - s, s);
if (*t == '\0')
{
break;
}
last = PR_sprintf_append(last, (*t == '<') ? "" : "%c", *t);
t++;
}
}
}
if (last)
{
hk_Alert(last);
XP_FREE(last);
}
}