mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-08 20:47:44 +00:00
465 lines
9.9 KiB
C
465 lines
9.9 KiB
C
|
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||
|
*
|
||
|
* The contents of this file are subject to the Netscape Public License
|
||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||
|
* http://www.mozilla.org/NPL/
|
||
|
*
|
||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||
|
* for the specific language governing rights and limitations under the
|
||
|
* NPL.
|
||
|
*
|
||
|
* The Initial Developer of this code under the NPL is Netscape
|
||
|
* Communications Corporation. Portions created by Netscape are
|
||
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||
|
* Reserved.
|
||
|
*/
|
||
|
/**********************************************************************
|
||
|
e_kit.c
|
||
|
By Daniel Malmer
|
||
|
|
||
|
Implementation for client customization.
|
||
|
**********************************************************************/
|
||
|
|
||
|
|
||
|
#include "mozilla.h"
|
||
|
#include "xfe.h"
|
||
|
#include "xpgetstr.h"
|
||
|
#include "e_kit.h"
|
||
|
#include "e_kit_patch.h"
|
||
|
#include "prefapi.h"
|
||
|
#include "AnimationType.h"
|
||
|
|
||
|
/* Messages declared in xfe_err.h */
|
||
|
extern int XFE_EKIT_LOCK_FILE_NOT_FOUND;
|
||
|
extern int XFE_EKIT_MODIFIED;
|
||
|
extern int XFE_EKIT_CANT_OPEN;
|
||
|
extern int XFE_EKIT_FILESIZE;
|
||
|
extern int XFE_EKIT_CANT_READ;
|
||
|
extern int XFE_ANIM_CANT_OPEN;
|
||
|
extern int XFE_ANIM_READING_SIZES;
|
||
|
extern int XFE_ANIM_READING_NUM_COLORS;
|
||
|
extern int XFE_ANIM_READING_COLORS;
|
||
|
extern int XFE_ANIM_READING_FRAMES;
|
||
|
extern int XFE_ANIM_NOT_AT_EOF;
|
||
|
extern int XFE_EKIT_ABOUT_MESSAGE;
|
||
|
|
||
|
static char* get_database_filename(Widget top_level);
|
||
|
static XP_Bool read_lock_file(Widget top_level);
|
||
|
|
||
|
static int ekit_loaded = 0;
|
||
|
|
||
|
struct fe_icon_data* anim_custom_large = NULL;
|
||
|
struct fe_icon_data* anim_custom_small = NULL;
|
||
|
|
||
|
static int ekit_errno = 0;
|
||
|
|
||
|
/*
|
||
|
* ekit_error
|
||
|
* Pops up an error dialog if an ekit error has occured.
|
||
|
* Error strings are found in 'xfe_err.h'.
|
||
|
*/
|
||
|
static void
|
||
|
ekit_error(void)
|
||
|
{
|
||
|
if ( ekit_errno ) {
|
||
|
FE_Alert(NULL, XP_GetString(ekit_errno));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* ekit_Initialize
|
||
|
*/
|
||
|
void
|
||
|
ekit_Initialize(Widget toplevel)
|
||
|
{
|
||
|
/* If this is an e-kit version, modify resource database */
|
||
|
if ( (ekit_loaded = read_lock_file(toplevel)) == False ) {
|
||
|
if ( ekit_required() ) {
|
||
|
ekit_error();
|
||
|
exit(0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ekit_LoadCustomAnimation();
|
||
|
|
||
|
if ( ekit_AutoconfigUrl() ) {
|
||
|
NET_SetNoProxyFailover();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
#if 0
|
||
|
/*
|
||
|
* ekit_LockPrefs
|
||
|
* First, set resources back to their default values.
|
||
|
* If this is an Enterprise Kit binary, try to read in
|
||
|
* the lock file. If it doesn't exist, or has been changed,
|
||
|
* complain and die.
|
||
|
*/
|
||
|
void
|
||
|
ekit_LockPrefs(void)
|
||
|
{
|
||
|
if ( ekit_Enabled() == FALSE || ekit_loaded == FALSE ) return;
|
||
|
|
||
|
update_preferences();
|
||
|
|
||
|
if ( ekit_AnimationFile() ) {
|
||
|
if ( load_animation(ekit_AnimationFile()) == False ) {
|
||
|
ekit_error();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( ekit_AutoconfigUrl() ) {
|
||
|
NET_SetNoProxyFailover();
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/*
|
||
|
* ekit_UserAgent
|
||
|
*/
|
||
|
char*
|
||
|
ekit_UserAgent(void)
|
||
|
{
|
||
|
char* user_agent = NULL;
|
||
|
|
||
|
PREF_CopyCharPref("user_agent", &user_agent);
|
||
|
|
||
|
return user_agent;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* ekit_LogoUrl
|
||
|
*/
|
||
|
char*
|
||
|
ekit_LogoUrl(void)
|
||
|
{
|
||
|
char* logo_url = NULL;
|
||
|
|
||
|
PREF_CopyCharPref("toolbar.logo.url", &logo_url);
|
||
|
|
||
|
return logo_url;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* ekit_AnimationFile
|
||
|
*/
|
||
|
char*
|
||
|
ekit_AnimationFile(void)
|
||
|
{
|
||
|
char* animation_file = NULL;
|
||
|
|
||
|
PREF_CopyCharPref("x_animation_file", &animation_file);
|
||
|
|
||
|
return animation_file;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* ekit_Enabled
|
||
|
*/
|
||
|
XP_Bool
|
||
|
ekit_Enabled(void)
|
||
|
{
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* ekit_AutoconfigUrl
|
||
|
*/
|
||
|
char*
|
||
|
ekit_AutoconfigUrl(void)
|
||
|
{
|
||
|
char* autoconfig_url = NULL;
|
||
|
|
||
|
if ( fe_IsPolarisInstalled() ) {
|
||
|
PREF_CopyCharPref("autoadmin.global_config_url", &autoconfig_url);
|
||
|
}
|
||
|
|
||
|
return autoconfig_url;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* get_database_filename
|
||
|
* Looks for the Netscape.cfg file.
|
||
|
* "path" represents the search path for the config file.
|
||
|
* %E is replaced with the root directory that is specified
|
||
|
* at configure time by the e-kit locker, which is a binary
|
||
|
* patch program.
|
||
|
*/
|
||
|
static char*
|
||
|
get_database_filename(Widget top_level)
|
||
|
{
|
||
|
String filename;
|
||
|
SubstitutionRec sub = {'E', NULL};
|
||
|
Cardinal num_substitutions = 1;
|
||
|
String path = "%E/%L/%T/%N%C%S:"
|
||
|
"%E/%l/%T/%N%C%S:"
|
||
|
"%E/%T/%N%C%S:"
|
||
|
"%E/%L/%T/%N%S:"
|
||
|
"%E/%l/%T/%N%S:"
|
||
|
"%E/%T/%N%S";
|
||
|
|
||
|
sub.substitution = ekit_root();
|
||
|
|
||
|
filename = XtResolvePathname(XtDisplay(top_level),
|
||
|
"app-defaults",
|
||
|
"netscape",
|
||
|
".cfg",
|
||
|
path,
|
||
|
&sub,
|
||
|
num_substitutions,
|
||
|
NULL);
|
||
|
|
||
|
return filename;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* read_lock_file
|
||
|
* If there is a locked resource file 'netscape.cfg', read it in.
|
||
|
*/
|
||
|
static XP_Bool
|
||
|
read_lock_file(Widget top_level)
|
||
|
{
|
||
|
String filename;
|
||
|
|
||
|
if ( (filename = get_database_filename(top_level)) == NULL ) {
|
||
|
return False;
|
||
|
}
|
||
|
|
||
|
return ( PREF_ReadLockFile(filename) == PREF_NOERROR );
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* ekit_AboutData
|
||
|
*/
|
||
|
char*
|
||
|
ekit_AboutData(void)
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* ekit_LoadCustomUrl
|
||
|
*/
|
||
|
void
|
||
|
ekit_LoadCustomUrl(char* prefix, MWContext* context)
|
||
|
{
|
||
|
char* url;
|
||
|
|
||
|
if ( PREF_GetUrl(prefix, &url) ) {
|
||
|
FE_GetURL(context, NET_CreateURLStruct(url, FALSE));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* read_frames
|
||
|
* Reads animation frames from the animation input file.
|
||
|
*/
|
||
|
static int
|
||
|
read_frames(FILE* file, int num_frames, int width, int height,
|
||
|
struct fe_icon_data* anim)
|
||
|
{
|
||
|
int i;
|
||
|
int j;
|
||
|
int n = width*height;
|
||
|
int bytes_per_line = (width+7)/8;
|
||
|
int total_bytes = bytes_per_line*height;
|
||
|
|
||
|
for ( i = 0; i < num_frames; i++ ) {
|
||
|
anim[i].width = width;
|
||
|
anim[i].height = height;
|
||
|
|
||
|
anim[i].mono_bits = (uint8*) malloc(total_bytes);
|
||
|
anim[i].mask_bits = (uint8*) malloc(total_bytes);
|
||
|
anim[i].color_bits = (uint8*) malloc(n);
|
||
|
|
||
|
if ( anim[i].mono_bits == NULL ||
|
||
|
anim[i].mask_bits == NULL ||
|
||
|
anim[i].color_bits == NULL ) return -1;
|
||
|
|
||
|
if ( fread(anim[i].mono_bits, sizeof(uint8), total_bytes, file) !=
|
||
|
total_bytes ) {
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
if ( fread(anim[i].mask_bits, sizeof(uint8), total_bytes, file) !=
|
||
|
total_bytes ) {
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
if ( fread(anim[i].color_bits, sizeof(uint8), n, file) != n ) {
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
for ( j = 0; j < width*height; j++ ) {
|
||
|
anim[i].color_bits[j]+= fe_n_icon_colors;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* read_colors
|
||
|
* Reads color data from the animation data file.
|
||
|
*/
|
||
|
static int
|
||
|
read_colors(FILE* file, int num_colors)
|
||
|
{
|
||
|
int i;
|
||
|
uint16 r;
|
||
|
uint16 g;
|
||
|
uint16 b;
|
||
|
|
||
|
for ( i = 0; i < num_colors; i++ ) {
|
||
|
if ( fscanf(file, " %hx %hx %hx", &r, &g, &b) != 3 ) {
|
||
|
return -1;
|
||
|
}
|
||
|
fe_icon_colors[fe_n_icon_colors+i][0] = r;
|
||
|
fe_icon_colors[fe_n_icon_colors+i][1] = g;
|
||
|
fe_icon_colors[fe_n_icon_colors+i][2] = b;
|
||
|
}
|
||
|
|
||
|
if ( getc(file) != '\n' ) {
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* load_animation
|
||
|
* Given the name of an animation file, reads in data from
|
||
|
* that file.
|
||
|
*/
|
||
|
static Boolean
|
||
|
load_animation(char* filename)
|
||
|
{
|
||
|
int num_frames_small;
|
||
|
int width_small;
|
||
|
int height_small;
|
||
|
int num_frames_large;
|
||
|
int width_large;
|
||
|
int height_large;
|
||
|
int num_colors;
|
||
|
FILE* file;
|
||
|
|
||
|
if ( filename == NULL ) {
|
||
|
return False;
|
||
|
}
|
||
|
|
||
|
if ( (file = fopen(filename, "r")) == NULL ) {
|
||
|
ekit_errno = XFE_ANIM_CANT_OPEN;
|
||
|
return False;
|
||
|
}
|
||
|
|
||
|
if ( fscanf(file, " %d %d %d ",
|
||
|
&num_frames_large,
|
||
|
&width_large,
|
||
|
&height_large) != 3 ||
|
||
|
fscanf(file, " %d %d %d ",
|
||
|
&num_frames_small,
|
||
|
&width_small,
|
||
|
&height_small) != 3 ||
|
||
|
num_frames_large != num_frames_small || num_frames_large == 0 ) {
|
||
|
ekit_errno = XFE_ANIM_READING_SIZES;
|
||
|
return False;
|
||
|
}
|
||
|
|
||
|
fe_anim_frames[XFE_ANIMATION_CUSTOM*2] = num_frames_large;
|
||
|
fe_anim_frames[XFE_ANIMATION_CUSTOM*2+1] = num_frames_small;
|
||
|
|
||
|
if ( fscanf(file, " %d ", &num_colors) != 1 ) {
|
||
|
ekit_errno = XFE_ANIM_READING_NUM_COLORS;
|
||
|
return False;
|
||
|
}
|
||
|
|
||
|
if ( read_colors(file, num_colors) == -1 ) {
|
||
|
ekit_errno = XFE_ANIM_READING_COLORS;
|
||
|
return False;
|
||
|
}
|
||
|
|
||
|
if ( num_frames_large ) {
|
||
|
anim_custom_large = (struct fe_icon_data*)
|
||
|
malloc(sizeof(struct fe_icon_data) * num_frames_large);
|
||
|
if ( anim_custom_large == NULL ) return False;
|
||
|
}
|
||
|
|
||
|
if ( num_frames_small ) {
|
||
|
anim_custom_small = (struct fe_icon_data*)
|
||
|
malloc(sizeof(struct fe_icon_data) * num_frames_small);
|
||
|
if ( anim_custom_small == NULL ) return False;
|
||
|
}
|
||
|
|
||
|
if ( read_frames(file, num_frames_large, width_large, height_large,
|
||
|
anim_custom_large) == -1 ||
|
||
|
read_frames(file, num_frames_small, width_small, height_small,
|
||
|
anim_custom_small) == -1 ) {
|
||
|
ekit_errno = XFE_ANIM_READING_FRAMES;
|
||
|
return False;
|
||
|
}
|
||
|
|
||
|
fe_n_icon_colors+= num_colors;
|
||
|
|
||
|
fscanf(file, " ");
|
||
|
|
||
|
if ( !feof(file) ) {
|
||
|
ekit_errno = XFE_ANIM_NOT_AT_EOF;
|
||
|
return False;
|
||
|
}
|
||
|
|
||
|
return True;
|
||
|
}
|
||
|
|
||
|
|
||
|
static int custom_anim = 0;
|
||
|
|
||
|
|
||
|
/*
|
||
|
* ekit_LoadCustomAnimation
|
||
|
*/
|
||
|
void
|
||
|
ekit_LoadCustomAnimation(void)
|
||
|
{
|
||
|
char* anim_file = NULL;
|
||
|
|
||
|
PREF_CopyConfigString("x_animation_file", &anim_file);
|
||
|
|
||
|
if ( anim_file == NULL || *anim_file == '\0' ) return;
|
||
|
|
||
|
if ( load_animation(anim_file) == 0 ) {
|
||
|
ekit_error();
|
||
|
} else {
|
||
|
custom_anim = 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* ekit_CustomAnimation
|
||
|
*/
|
||
|
Boolean
|
||
|
ekit_CustomAnimation(void)
|
||
|
{
|
||
|
return custom_anim;
|
||
|
}
|
||
|
|
||
|
|