Mozilla/mozilla/cmd/xfe/src/Netcaster.cpp
ramiro%netscape.com b1712051f1 Add support for -config-dir command line flag. That means mozilla can now
use a configdir other that ~/.netscape without having to do HOME environment
hacks.
Thanks to Aleksey Nogin (ayn2@cornell.edu) for doing all the work and being
patient for me to actually check the stuff in.


git-svn-id: svn://10.0.0.236/trunk@9113 18797224-902f-48f8-a5cc-f745e15eee43
1998-09-02 14:29:42 +00:00

443 lines
10 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.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.
*/
/*
Netcaster.cpp -- utilities to open Netcaster
Created: Chris Toshok <toshok@netscape.com>, 7-Aug-96.
*/
#ifdef JAVA
#include "mozjava.h"
#endif
#include "xfe2_extern.h"
#include "VerReg.h"
#include "libmocha.h"
#include "xpgetstr.h"
#include "Netcaster.h"
// This is way-less expensive than including allxpstr.h
extern int XP_ALERT_NETCASTER_NO_JS;
extern int XP_ALERT_CANT_RUN_NETCASTER;
/*
* rodt: Defined in ns/cmd/xfe/mozilla.c. The rest of the world
* also does this cheesy declaration.
*/
extern "C" void fe_GetProgramDirectory(char * path, int length);
static char* netcasterWindowName = "Netcaster_SelectorTab";
static char* netcasterTabHtmlRegistryNode = "Netcaster/tab.htm";
static char* netcasterTabHtmlPath = "netcast/tab.htm";
/*
* These statics were moved outside of functions where they are
* used because of potential problems on HP (rodt, djw, dora).
* They are for private use within their respective functions!
*/
static char * private_xfe_netcaster_path = 0;
static char * private_xfe_netcaster_url = 0;
/****************************************
*
*/
MWContext *
FE_IsNetcasterRunning(void)
/*
* returns:
* A pointer to an MWContext if Netcaster is running.
* Null if Netcaster is not running.
*
****************************************/
{
MWContext * result = 0;
if (fe_IsNetcasterInstalled())
result = XP_FindNamedContextInList(NULL, netcasterWindowName);
return result;
}
/****************************************
*/
static XP_Bool
xfe_path_exists(const char * path)
/*
* returns:
* TRUE if the path exists on disk
* FALSE otherwise
*
****************************************/
{
XP_Bool result = FALSE;
int code;
struct stat sbuf;
const STAT_SUCCESS = 0;
if (path)
{
/* rodt: didn't use XP_Stat() because it does a lot of apparently
* unnecessary work, is undocumented and also is implemented using stat().
*/
code = stat(path, &sbuf);
if (code == STAT_SUCCESS)
result = TRUE;
}
return result;
}
/****************************************
*
*/
static int
xfe_last_character(const char * s)
/*
*
* returns:
* The last character in the string or
* '\0' on a NULL or empty string
*
****************************************/
{
int result = '\0';
if (s)
{
int length;
length = strlen(s);
if (length > 0)
result = s[length-1];
}
return result;
}
/****************************************
*
*/
static const char *
xfe_netcaster_path(void)
/*
* description:
* Determine a path to tab.htm, which is
* loaded into a browser window to start
* Netcaster by checking
* the following locations in order:
* $HOME/.netscape/netcast/tab.htm
* (now <configdir>/netcast/tab.htm)
* $MOZILLA_HOME/netcast/tab.htm
* Version Registry via VR_GetPath()
* fe_GetProgramDirectory()/netcast/tab.htm
*
* The reason for precedence is as follows:
* $HOME first. Preferences set in a user's
* $HOME override everything else.
* This allows users some chance of running in
* the case where the system admin won't install
* Netcaster in globally accessible location.
* This can also be useful for debugging purposes.
*
* $MOZILLA_HOME is now recommended as the standard
* for finding Communicator and related components.
* It comes next.
*
* The registry should get set correctly during ASD install.
* However the registry's role in tracking versions has
* been emphasized over its role in tracking location.
* (although you can't have the former without the latter).
* Rumor also has it that some people are in the habit
* of deleting the registry to fix problems, so it
* may not always be available.
*
* Last resort is to do our best effort at determining
* where Communicator was invoked by getting the program directory
* by looking at the invocation path.
*
* returns:
* On success returns a path to tab.htm
* On failure returns NULL
*
****************************************/
{
const char * result = 0;
char * home;
REGERR code;
if (private_xfe_netcaster_path && private_xfe_netcaster_path[0])
{
result = private_xfe_netcaster_path;
#ifdef DEBUG_rodt
printf("DEBUG_rodt: Netcaster path a %s\n",result);
#endif
return result;
}
/* who knows what was here before */
if (private_xfe_netcaster_path)
XP_FREE(private_xfe_netcaster_path);
//
// CHECK $HOME/.netscape
//
private_xfe_netcaster_path = fe_GetConfigDirFilename(netcasterTabHtmlPath);
if (private_xfe_netcaster_path &&
xfe_path_exists(private_xfe_netcaster_path))
{
result = private_xfe_netcaster_path;
#ifdef DEBUG_rodt
printf("DEBUG_rodt: Netcaster path b %s\n",result);
#endif
return result;
}
private_xfe_netcaster_path = (char*)XP_ALLOC(MAXPATHLEN);
if (private_xfe_netcaster_path)
private_xfe_netcaster_path[0] = '\0';
else
return result;
//
// CHECK $MOZILLA_HOME
//
home = getenv("MOZILLA_HOME");
if (home)
{
XP_STRCPY(private_xfe_netcaster_path, home);
if (xfe_last_character(private_xfe_netcaster_path) != '/')
XP_STRCAT(private_xfe_netcaster_path,"/");
XP_STRCAT(private_xfe_netcaster_path,netcasterTabHtmlPath);
if (xfe_path_exists(private_xfe_netcaster_path))
{
result = private_xfe_netcaster_path;
#ifdef DEBUG_rodt
printf("DEBUG_rodt: Netcaster path c %s\n",result);
#endif
return result;
}
}
//
// CHECK THE REGISTRY
//
// Could also call VR_InRegistry("Netcaster") but it would be redundant
// Note that VR_ValidateComponent also calls VR_GetPath() but it doesn't
// return any path information
//
code = VR_GetPath(netcasterTabHtmlRegistryNode, sizeof(private_xfe_netcaster_path)-1, private_xfe_netcaster_path);
if (code == REGERR_OK)
{
code = VR_ValidateComponent(netcasterTabHtmlRegistryNode);
if (code == REGERR_OK
&& xfe_path_exists(private_xfe_netcaster_path)) // extra check
{
result = private_xfe_netcaster_path;
#ifdef DEBUG_rodt
printf("DEBUG_rodt: Netcaster path d %s\n",result);
#endif
return result;
}
}
private_xfe_netcaster_path[0] = '\0';
//
// CHECK THE PROGRAM DIRECTORY
//
fe_GetProgramDirectory(private_xfe_netcaster_path, MAXPATHLEN - 1);
if (private_xfe_netcaster_path[0])
{
if (xfe_last_character(private_xfe_netcaster_path) != '/')
XP_STRCAT(private_xfe_netcaster_path,"/");
XP_STRCAT(private_xfe_netcaster_path,netcasterTabHtmlPath);
if (xfe_path_exists(private_xfe_netcaster_path))
{
result = private_xfe_netcaster_path;
#ifdef DEBUG_rodt
printf("DEBUG_rodt: Netcaster path e %s\n",result);
#endif
return result;
}
}
private_xfe_netcaster_path[0] = '\0';
#ifdef DEBUG_rodt
printf("DEBUG_rodt: Netcaster path not found\n");
#endif
return result;
}
/****************************************
*
*/
static const char*
xfe_netcaster_url(void)
/*
* returns:
* On success returns a file URL pointing to tab.html
* On failure returns NULL
*
****************************************/
{
const char * result = NULL;
if (!private_xfe_netcaster_url)
{
private_xfe_netcaster_url = (char*)XP_ALLOC(MAXPATHLEN);
if (private_xfe_netcaster_url)
private_xfe_netcaster_url[0] = '\0';
else
return result;
}
if (private_xfe_netcaster_url[0])
{
result = private_xfe_netcaster_url;
}
else
{
const char * path;
path = xfe_netcaster_path();
if (path)
{
XP_SPRINTF(private_xfe_netcaster_url,"file:%s",path);
result = private_xfe_netcaster_url;
}
else
private_xfe_netcaster_url[0] = '\0';
}
return result;
}
/****************************************
*/
void
fe_showNetcaster(Widget toplevel)
/*
* description:
* This function shows the Netcaster window, starting
* Netcaster if necessary. If Netcaster is not installed,
* this function does nothing.
*
****************************************/
{
MWContext * netcasterContext;
if (!fe_IsNetcasterInstalled())
return;
if(!(netcasterContext=FE_IsNetcasterRunning()))
{
Chrome netcasterChrome;
URL_Struct* URL_s;
const char* netcasterURL = xfe_netcaster_url();
if (netcasterURL)
{
if (!LM_GetMochaEnabled()
#ifdef JAVA
|| !LJ_GetJavaEnabled()
#else
|| TRUE /* If we haven't compiled Java in, then it
sure won't be enabled... */
#endif
)
{
fe_Alert_2(toplevel, XP_GetString(XP_ALERT_NETCASTER_NO_JS));
return;
}
memset(&netcasterChrome, 0, sizeof(Chrome));
netcasterChrome.w_hint = 21;
netcasterChrome.h_hint = 59;
netcasterChrome.l_hint = -1000;
netcasterChrome.t_hint = -1000;
netcasterChrome.topmost = TRUE;
netcasterChrome.z_lock = TRUE;
netcasterChrome.location_is_chrome = TRUE;
netcasterChrome.disable_commands = TRUE;
netcasterChrome.hide_title_bar = TRUE;
netcasterChrome.restricted_target = TRUE;
URL_s = NET_CreateURLStruct(netcasterURL, NET_DONT_RELOAD);
netcasterContext = xfe2_MakeNewWindow(toplevel,NULL,
URL_s,
netcasterWindowName,
MWContextBrowser,
False,
&netcasterChrome);
}
else
{
fe_Alert_2(toplevel, XP_GetString(XP_ALERT_CANT_RUN_NETCASTER));
}
}
else
{
FE_RaiseWindow(netcasterContext);
}
}
/****************************************
*
*/
XP_Bool
fe_IsNetcasterInstalled(void)
/*
* returns:
* TRUE or FALSE
****************************************/
{
XP_Bool result = FALSE;
if (xfe_netcaster_path())
result = TRUE;
return result;
}