home *** CD-ROM | disk | FTP | other *** search
- /* -*- 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;
- }
-
-
-