gecko-dev/cmd/winfe/mozilla.cpp
1998-10-01 13:27:12 +00:00

2428 lines
76 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.
*/
#include "stdafx.h"
// Various startup/shutdown functions.
void STARTUP_np(void);
void SHUTDOWN_np(void);
#ifdef MOZ_LOC_INDEP
void STARTUP_li(void);
void SHUTDOWN_li(void);
#endif/* MOZ_LOC_INDEP */
#if defined(OJI)
#include "jvmmgr.h"
#elif defined(JAVA)
#include "jri.h"
#endif
#define XP_CPLUSPLUS // temporary hack - jsw
//#include "secnav.h"
// XP Includes
#include "prefapi.h"
#include "NSReg.h"
#ifdef MOZ_SMARTUPDATE
#include "softupdt.h"
#endif
#ifdef XP_WIN32
#include "postal.h" // mapi DLL interface
#endif
#include "prefinfo.h"
#ifdef XP_WIN16
#include "ctl3d.h"
#endif
// Be careful adding more headers here since doing so can force the
// Win16 compiler to "run out of keys", whatever that means
#include "libevent.h"
// Template/Frame/View/Doc Includes
#ifdef MOZ_MAIL_NEWS
#include "wfemsg.h"
#include "addrfrm.h"
#endif /* MOZ_MAIL_NEWS */
#include "hiddenfr.h"
#include "template.h"
#include "logindg.h"
#include "widgetry.h"
extern "C" {
int NET_ReadCookies(char * filename);
void NET_RemoveAllCookies();
};
// Used to simplify Gold/Non-gold template handling
BOOL bIsGold = FALSE;
#include "mainfrm.h"
#include "navfram.h"
// Misc Includes
#include "custom.h"
#include "ngdwtrst.h"
#include "oleregis.h"
#include "sysinfo.h"
#include "winproto.h"
#include "cmdparse.h"
#include "ddecmd.h"
#include "slavewnd.h"
#include "feutil.h"
#include "cxicon.h"
#ifdef MOZ_FULLCIRCLE
// Full Circle stuff - see http://www.fullsoft.com for more info
#include "../../../ns/fullsoft/public/fullsoft.h"
#endif
#include "prefs.h"
#ifdef MOZ_NGLAYOUT
#include "nsISupports.h"
#include "nsRepository.h"
#include "nsWidgetsCID.h"
#include "nsGfxCIID.h"
#include "nsViewsCID.h"
#endif
#if defined(OJI) || defined(JAVA)
// don't include java.h here because the Win16 compiler won't be able to handle this file
void WFE_LJ_StartupJava(void);
void WFE_LJ_StartDebugger(void);
#endif
#ifdef NEW_PREF_ARCH
#include "cprofile.h"
#include "cprofmgr.h"
extern int login_NewProfilePreInit();
extern int login_NewProfilePostInit(CProfile *pProfile);
#endif
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
#ifndef VER_PLATFORM_WIN32_WINDOWS
#define VER_PLATFORM_WIN32_WINDOWS 1
#endif
#ifdef __BORLANDC__
#define _mkdir mkdir
#endif
extern "C" void WFE_StartCalendar();
extern "C" {
NET_StreamClass *memory_stream(int iFormatOut, void *pDataObj, URL_Struct *pUrlData, MWContext *pContext);
NET_StreamClass *external_viewer_disk_stream(int iFormatOut, void *pDataObj, URL_Struct *pUrlData, MWContext *pContext);
NET_StreamClass *ContextSaveStream(int iFormatOut, void *pDataObj, URL_Struct *pUrlData, MWContext *pContext);
NET_StreamClass *nfe_OleStream(int iFormatOut, void *pDataObj, URL_Struct *pUrlData, MWContext *pContext);
NET_StreamClass *EmbedStream(int iFormatOut, void *pDataObj, URL_Struct *pUrlData, MWContext *pContext);
NET_StreamClass *IL_ViewStream(int iFormatOut, void *pDataObj, URL_Struct *pUrlData, MWContext *pContext);
};
extern "C" int il_debug;
extern CMapStringToOb DNSCacheMap;
extern "C" const char* FE_GetFolderDirectory(MWContext *pContext);
// Temporary hack for MUP -- jonm
extern "C" {
HINSTANCE hAppInst;
}
extern CDocTemplate *WFE_InitializeTemplates();
#ifdef EDITOR
extern void WFE_InitComposer();
extern void WFE_ExitComposer();
#endif // EDITOR
// CLM:
// Global message to find previous instance of program by ourselves
// or from other applications.
// The function OnNetscapeGoldMessage() in CGenericFrame responds TRUE
// to this message to tell other instances or apps we are here
//
UINT WM_NG_IS_ACTIVE = 0;
UINT WM_OPEN_EDITOR = 0;
UINT WM_OPEN_NAVIGATOR = 0;
// extern XP_List* wfe_pModalDlgList;
char szNGMemoryMapFilename[] = "NGMemoryMapFileURL";
//Multi-Instance codes for detecting app exit and run status.
#define EXITING -10
#define RUNNING 10
#ifdef XP_WIN32
// System for communication between Navigator/Editor and Site Manager
// BOOL bSiteMgrIsActive = 0;
// The SiteManager client class
#ifdef EDITOR
ITalkSMClient * pITalkSMClient = NULL;
#endif // EDITOR
// This should be set ONLY if pITalkSMClient is not null
BOOL bSiteMgrIsRegistered = 0;
// We call URL Saving/Loading member functions only if
// site manager is already active
BOOL bSiteMgrIsActive = 0;
UINT WM_SITE_MANAGER = 0;
#endif
extern "C" int SECNAV_InitConfigObject(void);
extern "C" void SECNAV_EarlyInit(void);
extern "C" void SECNAV_Init(void);
extern "C" int SECNAV_RunInitialSecConfig(void);
extern "C" void SECNAV_Shutdown(void);
/****************************************************************************
*
* CONSTANTS
*
****************************************************************************/
/////////////////////////////////////////////////////////////////////////////
// CNetscapeApp
BEGIN_MESSAGE_MAP(CNetscapeApp, CWinApp)
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
ON_COMMAND(ID_HELP, OnHelp)
ON_COMMAND(ID_APP_EXIT, OnAppExit)
ON_COMMAND(ID_APP_SUPER_EXIT, OnAppSuperExit)
END_MESSAGE_MAP()
#ifndef _AFXDLL
#define new DEBUG_NEW // MSVC Debugging new...goes to regular new in release mode
#endif
// This identifier was generated to be statistically unique for your app.
// You may change it if you prefer to choose a specific identifier.
static const CLSID BASED_CODE clsid =
{ 0x61d8de20, 0xca9a, 0x11ce, { 0x9e, 0xa5, 0x0, 0x80, 0xc8, 0x2b, 0xe3, 0xb6 } };
/////////////////////////////////////////////////////////////////////////////
// The one and only CNetscapeApp object
CNetscapeApp NEAR theApp;
#ifndef MOZ_NGLAYOUT
// the only one object of CNetscapeFontModule
CNetscapeFontModule theGlobalNSFont;
#endif /* MOZ_NGLAYOUT */
NET_StreamClass *null_stream(FO_Present_Types format_out, void *newshack, URL_Struct *urls, MWContext *cx) {
// Stream which does nothing.
return(NULL);
}
/////////////////////////////////////////////////////////////////////////////
// CNetscapeApp initialization
BOOL CNetscapeApp::InitApplication()
{
// used to mark the beginning of the usefull stack
// for the java gc. We used to calculate this value based on the
// first argument to PR_Init(...) but PR_Init() has moved so
// we are wrong now. In order to avoid keep changing the guess
// we pass explicitly the value so wherever PR_Init() ends up we are
// all set. The stackBase must be at this level or higher on the stack
int stackBase;
CWinApp::InitApplication();
NSToolBarClass = AfxRegisterWndClass( CS_CLASSDC | CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW,
theApp.LoadStandardCursor(IDC_ARROW),
(HBRUSH)(COLOR_BTNFACE + 1));
fe_InitNSPR((void*)&stackBase);
m_appFontList = NULL;
return TRUE;
}
#ifdef MOZ_NGLAYOUT
#define WIDGET_DLL "raptorwidget.dll"
#define GFXWIN_DLL "raptorgfxwin.dll"
#define VIEW_DLL "raptorview.dll"
static void InitializeNGLayout() {
NS_DEFINE_IID(kCWindowIID, NS_WINDOW_CID);
NS_DEFINE_IID(kCScrollbarIID, NS_VERTSCROLLBAR_CID);
NS_DEFINE_IID(kCHScrollbarIID, NS_HORZSCROLLBAR_CID);
NS_DEFINE_IID(kCButtonIID, NS_BUTTON_CID);
NS_DEFINE_IID(kCComboBoxCID, NS_COMBOBOX_CID);
NS_DEFINE_IID(kCFileWidgetCID, NS_FILEWIDGET_CID);
NS_DEFINE_IID(kCListBoxCID, NS_LISTBOX_CID);
NS_DEFINE_IID(kCRadioButtonCID, NS_RADIOBUTTON_CID);
NS_DEFINE_IID(kCTextAreaCID, NS_TEXTAREA_CID);
NS_DEFINE_IID(kCTextFieldCID, NS_TEXTFIELD_CID);
NS_DEFINE_IID(kCCheckButtonIID, NS_CHECKBUTTON_CID);
NS_DEFINE_IID(kCChildIID, NS_CHILD_CID);
nsRepository::RegisterFactory(kCWindowIID, WIDGET_DLL, PR_FALSE, PR_FALSE);
nsRepository::RegisterFactory(kCScrollbarIID, WIDGET_DLL, PR_FALSE, PR_FALSE);
nsRepository::RegisterFactory(kCHScrollbarIID, WIDGET_DLL, PR_FALSE, PR_FALSE);
nsRepository::RegisterFactory(kCButtonIID, WIDGET_DLL, PR_FALSE, PR_FALSE);
nsRepository::RegisterFactory(kCComboBoxCID, WIDGET_DLL, PR_FALSE, PR_FALSE);
nsRepository::RegisterFactory(kCFileWidgetCID, WIDGET_DLL, PR_FALSE, PR_FALSE);
nsRepository::RegisterFactory(kCListBoxCID, WIDGET_DLL, PR_FALSE, PR_FALSE);
nsRepository::RegisterFactory(kCRadioButtonCID, WIDGET_DLL, PR_FALSE, PR_FALSE);
nsRepository::RegisterFactory(kCTextAreaCID, WIDGET_DLL, PR_FALSE, PR_FALSE);
nsRepository::RegisterFactory(kCTextFieldCID, WIDGET_DLL, PR_FALSE, PR_FALSE);
nsRepository::RegisterFactory(kCCheckButtonIID, WIDGET_DLL, PR_FALSE, PR_FALSE);
nsRepository::RegisterFactory(kCChildIID, WIDGET_DLL, PR_FALSE, PR_FALSE);
NS_DEFINE_IID(kCRenderingContextIID, NS_RENDERING_CONTEXT_CID);
NS_DEFINE_IID(kCDeviceContextIID, NS_DEVICE_CONTEXT_CID);
NS_DEFINE_IID(kCFontMetricsIID, NS_FONT_METRICS_CID);
NS_DEFINE_IID(kCImageIID, NS_IMAGE_CID);
NS_DEFINE_IID(kCRegionIID, NS_REGION_CID);
nsRepository::RegisterFactory(kCRenderingContextIID, GFXWIN_DLL, PR_FALSE, PR_FALSE);
nsRepository::RegisterFactory(kCDeviceContextIID, GFXWIN_DLL, PR_FALSE, PR_FALSE);
nsRepository::RegisterFactory(kCFontMetricsIID, GFXWIN_DLL, PR_FALSE, PR_FALSE);
nsRepository::RegisterFactory(kCImageIID, GFXWIN_DLL, PR_FALSE, PR_FALSE);
nsRepository::RegisterFactory(kCRegionIID, GFXWIN_DLL, PR_FALSE, PR_FALSE);
NS_DEFINE_IID(kCViewManagerCID, NS_VIEW_MANAGER_CID);
NS_DEFINE_IID(kCViewCID, NS_VIEW_CID);
NS_DEFINE_IID(kCScrollingViewCID, NS_SCROLLING_VIEW_CID);
nsRepository::RegisterFactory(kCViewManagerCID, VIEW_DLL, PR_FALSE, PR_FALSE);
nsRepository::RegisterFactory(kCViewCID, VIEW_DLL, PR_FALSE, PR_FALSE);
nsRepository::RegisterFactory(kCScrollingViewCID, VIEW_DLL, PR_FALSE, PR_FALSE);
}
#endif /* MOZ_NGLAYOUT */
typedef FARPROC (*WSASetBlockingHook_t) (FARPROC);
/////////////////////////////////////////////////////////////////////////////
// CNetscapeApp initialization
BOOL CNetscapeApp::InitInstance()
{
// Important to do this one first, as will need to service
// any caught messages initialization may cause.
#ifdef XP_WIN32
BOOL BailOrStay(void);
if(!BailOrStay())
return FALSE;//First instance in the middle of initializing.
#endif
slavewnd.InitInstance(m_hInstance);
slavewnd.WindowProc(SLAVE_INITINSTANCE, 0, 0);
//PLEASE DO NOT MOVE THE ABOVE LINE. Multiple instance detection
//relies on this window being created.
// We allow UNC names, to be turned off by a command line switch.
if(IsRuntimeSwitch("-nounc")) {
// Turn off UNC file names.
m_bUNC = FALSE;
}
char *prefStr; // temporary storage space for preferences
int32 prefInt;
PRBool prefBool;
// Determine whether this is a PE product ASAP!
m_hPEInst = LoadLibrary("muc.dll");
m_bPEEnabled = ((UINT)m_hPEInst > 32);
// Initialize member data
m_pTempDir = NULL;
#ifdef XP_WIN16
m_helpstate = NOT_SENT; //used to prevent loops in sending ID_HELP messages to the topmost windows and having them return back
#endif
//Using resdll.dll by default
//HINSTANCE m_hResDLLInst;
m_hResInst = LoadLibrary("resdll.dll");
if((UINT)m_hResInst > 32)
{
AfxSetResourceHandle(m_hResInst);
}
// Using resource dll if it's been defined and available
/* We are no longer using the Registry and no longer need this code
since core uses resdll.dll as well benito
CString szResDll = GetProfileString("INTL", "ResourceDLL", "") ;
if (szResDll.IsEmpty() == FALSE)
{
m_hResInst = LoadLibrary(szResDll);
if ((UINT)m_hResInst > 32)
{
char buf1[256], buf2[256];
if (::LoadString(m_hResInst, IDS_APP_VERSION, buf1, 254) &&
::LoadString(AfxGetResourceHandle(), IDS_APP_VERSION, buf2, 254))
{
if (strnicmp(buf1, buf2, strlen(buf1)) == 0) // same version then use it
{
AfxSetResourceHandle(m_hResInst);
FreeLibrary(m_hResDLLInst);
}
else
{
FreeLibrary(m_hResInst);
m_hResInst = NULL;
}
}
else
{
FreeLibrary(m_hResInst);
m_hResInst = NULL;
}
}
}
*/
hAppInst = AfxGetResourceHandle(); // Changed so that this hack grabs resources from
// the Resource DLL and not the Application Instance.
// temporary hack for MUP -- jonm
// Save that we're presently in init instance, and save the initial
// show command so that MFC doesn't blow it away prematurely.
m_bInInitInstance = TRUE; // Flag for frames created to use m_iFrameCmdShow
m_iFrameCmdShow = m_nCmdShow;
m_nCmdShow = SW_SHOWNORMAL;
TRACE("Show Command is %d\n", m_iFrameCmdShow);
// We're not exiting yet.
// Set to true in OnAppExit.
m_bExit = FALSE;
// CLM: PREVENT LOADING MULTIPLE INSTANCES OF THE APP!
// Sent by the Navigator to other navigators. Used to prevent multiple
// instances.
// First parse the command line to get filename and start-editor flag
m_iCmdLnX = RuntimeIntSwitch(" /X");
m_iCmdLnY = RuntimeIntSwitch(" /Y");
m_iCmdLnCX = RuntimeIntSwitch(" /CX");
m_iCmdLnCY = RuntimeIntSwitch(" /CY");
///////////////////////////////////////////////////////////////////////////
///BEGIN DDE INSTANCE CRITERIA CHECKING --SEE Abe for this stuff!! ////
///////////////////////////////////////////////////////////////////////////
//Determine instance case and perform component launch if applicable
//using DDE to detect 2nd instance.
const UINT NEAR msg_ExitStatus = RegisterWindowMessage("ExitingNetscape");
CDDECMDWrapper *pWrapper = NULL;
CStringList lstrArgumentList;
CCmdParse cmdParse;
LONG lReturn = 0;
HWND hwnd = NULL;
CString strServiceName;
BOOL bAlreadyRunning = FALSE;
strServiceName.LoadString(IDS_DDE_CMDLINE_SERVICE_NAME);
//initialize our DDE commandline processing conversation
DDEInitCmdLineConversation();
CString csPrintCommand;
#ifdef XP_WIN32
BOOL CALLBACK WinEnumProc(HWND hwnd, LPARAM lParam);
if (hwnd = FindNavigatorHiddenWindow())
lReturn = ::SendMessage(hwnd,msg_ExitStatus,0,0);
//Start a conversation only if we have a
//hidden frame up and running. If the instance was in an exiting state
//then let the connect to client fail.
if (lReturn == RUNNING)
{
//attempt to connect to the DDE server.
pWrapper = CDDECMDWrapper::ClientConnect(strServiceName,
CDDECMDWrapper::m_hsz[CDDECMDWrapper::m_ProcessCmdLine]);
}
if (pWrapper )
{ //we are the client here. we must establish a conversation with the server
CString strDDECMDString = m_lpCmdLine;
//make sure this always has something in it for second instance. The first
//instance needs something to do something for the user. Default is start browser.
if (strDDECMDString.GetLength() > 249)
{
CString strDDECmdFileName = BuildDDEFile();
CFile fout;
if( !fout.Open( strDDECmdFileName, CFile::modeWrite ) )
{
if (!strDDECmdFileName.IsEmpty())
remove(strDDECmdFileName);
return FALSE;
}
fout.Write(strDDECMDString, strDDECMDString.GetLength());
strDDECMDString = "-DDEEXCEPTION" + strDDECmdFileName;
}
if (strDDECMDString.IsEmpty()) strDDECMDString = "-BROWSER";
HCONV hSavConv = pWrapper->m_hConv;
HDDEDATA hData = DdeCreateDataHandle(CDDECMDWrapper::m_dwidInst,
(LPBYTE)(const char*)strDDECMDString,
strDDECMDString.GetLength() +1,
0,
0,
CF_TEXT,
0);
DWORD wdResult;
HDDEDATA ddeTransaction = DdeClientTransaction( (LPBYTE)hData,
0xFFFFFFFF,
hSavConv,
0,
0,
XTYP_EXECUTE,
3000,
&wdResult);
DdeFreeDataHandle(hData);
DdeDisconnect(hSavConv);
delete pWrapper;
bAlreadyRunning = TRUE;
return FALSE; //EXIT THIS INSTANCE. WE ARE DONE!!!
}
else
{ //do command line stuff as usual and set flags appropriately
csPrintCommand = RuntimeStringSwitch("/print", FALSE);
if (ParseComponentArguments(m_lpCmdLine,TRUE))
{
cmdParse.Init(m_lpCmdLine,lstrArgumentList);
if (!cmdParse.ProcessCmdLine() )
{
AfxMessageBox(IDS_CMDLINE_ERROR3);
return FALSE; //make them type it in correctly
}
}
parseCommandLine(m_lpCmdLine);
//we will be the server in this case, So we must register our name service.
//initialize our DDE commandline processing conversation.
DdeNameService(CDDECMDWrapper::m_dwidInst,
CDDECMDWrapper::m_hsz[CDDECMDWrapper::m_ServiceName], NULL,
DNS_REGISTER);
}
#else
//We are never the client in win16 since we will never have a second instance.
//Thus we will always start as a server. The component launch app will decide whether
//to execute a mozilla.exe or DDE to the mozilla.exe DDE server.
csPrintCommand = RuntimeStringSwitch("/print", FALSE);
if (ParseComponentArguments(m_lpCmdLine,TRUE))
{
//build a token list to be looked at later
cmdParse.Init(m_lpCmdLine,lstrArgumentList);
if (!cmdParse.ProcessCmdLine() )
{
AfxMessageBox(IDS_CMDLINE_ERROR3);
return FALSE; //make them type it in correctly
}
}
parseCommandLine(m_lpCmdLine);
//we will be the server in this case, So we must register our name service.
DdeNameService(CDDECMDWrapper::m_dwidInst,
CDDECMDWrapper::m_hsz[CDDECMDWrapper::m_ServiceName], NULL,
DNS_REGISTER);
#endif
///////////////////////////////////////////////////////////////////////////
///END DDE INSTANCE CRITERIA CHECKING BLOCK ////
///////////////////////////////////////////////////////////////////////////
/////////COMPONENT LAUNCH
//#ifdef GOLD
// Yes we are a gold version!
bIsGold = TRUE;
//#endif
#ifdef EDITOR
// Register the global messages
// Sent by the Navigator to other navigators. Used to prevent multiple
// instances.
WM_NG_IS_ACTIVE = RegisterWindowMessage( "__lvp_str_NGIsActive__" );
// Sent by the Navigator to activate previous instance with URL in
// most recent browser window.
WM_OPEN_EDITOR = RegisterWindowMessage( "__lvp_str_LoadUrlNav__" );
// Sent by the Navigator to activate previous instance with URL in
// a new editor window.
WM_OPEN_NAVIGATOR = RegisterWindowMessage( "__lvp_str_LoadUrlEdt__" );
#ifdef XP_WIN32
// Sent to identify whether window is a Navigator or Sitemanager
WM_SITE_MANAGER = RegisterWindowMessage( "__talkSM_SM_IsAlive__" );
//#ifdef GOLD
// Start an OLE Automation client to talk to LiveWire's Site Manager
pITalkSMClient = new (ITalkSMClient);
if ( pITalkSMClient && pITalkSMClient->IsRegistered()){
// SiteManager was registered with OLE database
bSiteMgrIsRegistered = TRUE;
// See if we already have an instance
//bSiteMgrIsActive = FE_FindSiteMgr();
if( bSiteMgrIsActive ){
pITalkSMClient->SetKnownSMState(TRUE);
}
}
//#endif //GOLD
#endif //XP_WIN32
#endif //EDITOR
TRACE("Windows 16 is %d\n", sysInfo.m_bWin16);
TRACE("Windows 32 is %d\n", sysInfo.m_bWin32);
TRACE("Windows 32s is %d\n", sysInfo.m_bWin32s);
TRACE("Windows NT is %d\n", sysInfo.m_bWinNT);
TRACE("Windows 95 is %d\n", sysInfo.m_bWin4);
TRACE("Major version is %u\n", (unsigned)sysInfo.m_dwMajor);
TRACE("Minor version is %u\n", (unsigned)sysInfo.m_dwMinor);
TRACE("Build version is %u\n", (unsigned)sysInfo.m_dwBuild);
#ifdef _MSC_VER
TRACE("Compiler version is %u\n", _MSC_VER);
#endif
#ifdef _MFC_VER
TRACE("MFC version is %u\n", _MFC_VER);
#endif
#ifdef XP_WIN16
// Call the magic function that feeds off the environment variable "TZ"
// to set up the global time variables.
#ifdef __WATCOMC__
tzset();
#else
_tzset();
#endif
#endif // XP_WIN16
// Initialized OLE, or fail
TRACE("Starting Ole\n");
if(!AfxOleInit()) {
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
// Initialize 3d controls
#ifdef XP_WIN32
Enable3dControls();
#else
Ctl3dRegister(m_hInstance);
Ctl3dAutoSubclass(m_hInstance);
#endif
AssortedWidgetInit();
JSContext * prefContext=NULL;
JSObject *prefObject=NULL;
#ifdef NEW_PREF_ARCH
CProfile *profile = NULL;
CProfileManager *profMgr;
profile = (CProfile *) PREF_Init();
#else
PREF_Init(NULL);
// Read network and cache parameters
PREF_GetConfigContext(&prefContext);
PREF_GetPrefConfigObject(&prefObject);
if (!(prefContext && prefObject)) return FALSE;
if (!pref_InitInitialObjects(prefContext,prefObject))
return FALSE;
#endif
SECNAV_InitConfigObject();
/*
** Registry startup has to happen before profile stuff because creating a new
** profile uses the registry.
*/
#ifdef MOZ_SMARTUPDATE
SU_Startup();
#endif
NR_StartupRegistry();
// Initialize the network.
WORD wVersionRequested;
int err;
wVersionRequested = MAKEWORD(1,1);
err= WSAStartup(wVersionRequested,&(sysInfo.m_wsaData));
m_csWinsock = sysInfo.m_wsaData.szDescription; // Save this, used in ResolveAppName.
if (err !=0) {
MessageBox(NULL, szLoadString(IDS_NET_INIT_FAILED), szLoadString(AFX_IDS_APP_TITLE), MB_OK);
return FALSE;
}
#if defined(XP_WIN16)
//
// This is a hack... It should live in NSPR. It will be moved for NSPR 2.0
//
{
WSASetBlockingHook_t func;
HINSTANCE hinstWinsock = LoadLibrary("winsock.dll");
func = (WSASetBlockingHook_t)GetProcAddress(hinstWinsock, "WSASETBLOCKINGHOOK");
ASSERT(func);
if (func) {
extern BOOL PR_CALLBACK DefaultBlockingHook(void);
#if defined(DEBUG)
ASSERT ( (func)( (FARPROC)DefaultBlockingHook ) );
#else
(func)( (FARPROC)DefaultBlockingHook );
#endif
}
FreeLibrary(hinstWinsock);
}
#endif
TRACE("Winsock description is %s\n", sysInfo.m_wsaData.szDescription);
TRACE("Winsock status is %s\n", sysInfo.m_wsaData.szSystemStatus);
if (LOBYTE(sysInfo.m_wsaData.wVersion) != 1 || HIBYTE(sysInfo.m_wsaData.wVersion) != 1) {
MessageBox(NULL, szLoadString(IDS_NET_INIT_FAILED), szLoadString(AFX_IDS_APP_TITLE), MB_OK);
WSACleanup();
return FALSE;
}
// Determine maximum number of sockets that we will allow in the application.
// This is safer than just choosing some arbitrary number (always 50).
// Hard coded params: Min 8 Max 50
// Soft coded limits: Half of available sockets winsock reported.
sysInfo.m_iMaxSockets = sysInfo.m_wsaData.iMaxSockets / 2;
if(sysInfo.m_iMaxSockets < 8) {
sysInfo.m_iMaxSockets = 8;
}
else if(sysInfo.m_iMaxSockets > 50) {
sysInfo.m_iMaxSockets = 50;
}
TRACE("Max number of sockets is %d\n", sysInfo.m_iMaxSockets);
// Initialize the network module
/* NET_InitNetLib handles socks initialization. */
CString msg;
//
// Get the temp directory. See if it exists
// This must be before the e-kit check below
//
msg = GetProfileString("Main", "Temp Directory", DEF_TEMP_DIR); // directory configured?
if (msg != BOGUS_TEMP_DIR) {
m_pTempDir = XP_STRDUP((const char *)msg);
} else {
if(getenv("TEMP"))
m_pTempDir = XP_STRDUP(getenv("TEMP")); // environmental variable
if (!m_pTempDir && getenv("TMP"))
m_pTempDir = XP_STRDUP(getenv("TMP")); // How about this environmental variable?
if (!m_pTempDir) {
// screw 'em put it in the windows directory
char path[_MAX_PATH];
GetWindowsDirectory(path, sizeof(path));
m_pTempDir = XP_STRDUP(path);
}
}
// Ensure no backslash on the end of the temp dir.
FEU_NoTrailingBackslash(m_pTempDir);
//
// Check that the temp directory exists
//
if(!FEU_SanityCheckDir(m_pTempDir)) {
char msg[1024];
::sprintf(msg, szLoadString(IDS_ERR_TMP_DIR_NOT_EXIST), m_pTempDir);
MessageBox(NULL, msg, szLoadString(AFX_IDS_APP_TITLE), MB_ICONEXCLAMATION | MB_OK);
}
NET_InitNetLib(0, sysInfo.m_iMaxSockets);
// init parts of security for li
SECNAV_EarlyInit();
#ifdef NEW_PREF_ARCH
// After the new preferences architecture lands from the Nova branch, enable
// this #define
// Get the main NSPR event queue
mozilla_event_queue = PR_GetMainEventQueue();
LM_InitMocha();
// Register all XP content type converters and stream decoders.
// We can overwrite these settings if we have other settings ourselves.
NET_RegisterMIMEDecoders();
// Do PE precleanup and such
login_NewProfilePreInit();
// Read network and cache parameters
PREF_GetConfigContext(&prefContext);
PREF_GetPrefConfigObject(&prefObject);
if (!(prefContext && prefObject)) return FALSE;
if (!pref_InitInitialObjects(prefContext,prefObject))
return FALSE;
profile->LoadPrefs("netscape.cfg");
profMgr = new CProfileManager(profile);
int profErr = PREF_OK;
if (m_bAccountSetup) {
// FIXME! This isn't permanent!
// profMgr->CreateNewDialupAcct();
profErr = login_QueryForCurrentProfile();
} else if (m_bCreateNewProfile) {
if (theApp.m_bPEEnabled) {
profErr = login_QueryForCurrentProfile();
// FIXME! This isn't permanent!
// profMgr->CreateNewDialupAcct();
} else {
profErr = profMgr->DoNewProfileWizard(PROFMGR_DEFAULT);
}
} else if (m_bProfileManager) {
profErr = profMgr->ChooseProfile(PROFMGR_FORCE_SHOW | PROFMGR_SHOW_CONTROLS, m_CmdLineProfile);
} else if (m_CmdLineProfile != NULL) {
profErr = profMgr->GetProfileFromName(m_CmdLineProfile);
} else {
if (theApp.m_bPEEnabled) {
profErr = profMgr->ChooseProfile(PROFMGR_USE_DIALUP);
} else {
profErr = profMgr->ChooseProfile(PROFMGR_DEFAULT);
}
}
if (profErr != PREF_OK) {
return FALSE;
}
{
char userDir[FILENAME_MAX + 1];
int nameLength = FILENAME_MAX;
profile->GetCharPref("profile.directory", userDir, &nameLength, PR_TRUE);
theApp.m_UserDirectory = userDir;
}
profile->LoadPrefs();
// do this font init here for now for ldap
m_iCSID = (int16)2;
INTL_ChangeDefaultCharSetID((int16)m_iCSID);
#ifdef XP_WIN32
theApp.m_bUseUnicodeFont = GetProfileInt("Intl", "UseUnicodeFont", TRUE ) ;
theApp.m_bUseVirtualFont = GetProfileInt("Intl", "UseVirtualFont", FALSE);
if(! theApp.m_bUseUnicodeFont ) {
theApp.m_bUseVirtualFont = TRUE;
}
#else
theApp.m_bUseUnicodeFont = FALSE ;
theApp.m_bUseVirtualFont = TRUE;
#endif
// Set version and application names
// We have to get around it's const status.
XP_AppName = XP_STRDUP(szLoadString(IDS_APP_NAME));
XP_AppLanguage = XP_STRDUP(szLoadString(IDS_APP_LANGUAGE));
XP_AppCodeName = XP_STRDUP(szLoadString(IDS_APP_CODE_NAME));
XP_AppVersion = XP_STRDUP(ResolveShortAppVersion());
// Create our hidden frame window.
// Set this to be the applications main window.
m_pHiddenFrame = new CHiddenFrame();
#ifdef _WIN32
{
WNDCLASS wc;
wc.style = 0;
wc.lpfnWndProc = ::DefWindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = sizeof(DWORD); // this is used by java's setAgentPassword
wc.hInstance = ::AfxGetInstanceHandle();
wc.hIcon = NULL;
wc.hCursor = ::LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wc.lpszMenuName = (LPCSTR) NULL;
wc.lpszClassName = "aHiddenFrameClass";
ATOM result = ::RegisterClass(&wc);
ASSERT(result != 0);
m_pHiddenFrame->Create(wc.lpszClassName, "Netscape's Hidden Frame");
}
#else
m_pHiddenFrame->Create(NULL, "Netscape's Hidden Frame");
#endif
m_pMainWnd = m_pHiddenFrame;
m_pHiddenFrame->ShowWindow(SW_HIDE);
do {
profErr = login_NewProfilePostInit(profile);
if (profErr == -1) {
profErr = profMgr->PromptPassword();
if (profErr == PREF_OK) {
profErr = -1;
}
}
} while (profErr == -1);
if (profErr < PREF_OK) {
return FALSE;
}
int32 csid ;
if( PREF_GetIntPref("intl.character_set",&csid) != PREF_NOERROR)
csid = 2;
m_iCSID = (int16)csid;
//#ifdef MOZ_NETSCAPE_FONT_MODULE
VERIFY( FONTERR_OK == theGlobalNSFont.InitFontModule() );
//#endif MOZ_NETSCAPE_FONT_MODULE
#else // NEW_PREF_ARCH
// Create our hidden frame window.
// Set this to be the applications main window.
m_pHiddenFrame = new CHiddenFrame();
#ifdef _WIN32
{
WNDCLASS wc;
wc.style = 0;
wc.lpfnWndProc = ::DefWindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = sizeof(DWORD); // this is used by java's setAgentPassword
wc.hInstance = ::AfxGetInstanceHandle();
wc.hIcon = NULL;
wc.hCursor = ::LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wc.lpszMenuName = (LPCSTR) NULL;
wc.lpszClassName = "aHiddenFrameClass";
ATOM result = ::RegisterClass(&wc);
ASSERT(result != 0);
m_pHiddenFrame->Create(wc.lpszClassName, "Netscape's Hidden Frame");
}
#else
m_pHiddenFrame->Create(NULL, "Netscape's Hidden Frame");
#endif
m_pMainWnd = m_pHiddenFrame;
m_pHiddenFrame->ShowWindow(SW_HIDE);
CDocTemplate *pTemplate = WFE_InitializeTemplates();
if (!pTemplate)
return FALSE;
// Get the main NSPR event queue
mozilla_event_queue = PR_GetMainEventQueue();
// Initialize the XP file extension mapping
NET_InitFileFormatTypes(NULL, NULL);
// Register all XP content type converters and stream decoders.
// We can overwrite these settings if we have other settings ourselves.
NET_RegisterMIMEDecoders();
/////////////////////////////////////////////////////////////////////////
// Read in font and setup encoding table stuff
#ifdef XP_WIN32
theApp.m_bUseUnicodeFont = GetProfileInt("Intl", "UseUnicodeFont", TRUE ) ;
theApp.m_bUseVirtualFont = GetProfileInt("Intl", "UseVirtualFont", FALSE);
if(! theApp.m_bUseUnicodeFont ) {
theApp.m_bUseVirtualFont = TRUE;
}
#else
theApp.m_bUseUnicodeFont = FALSE ;
theApp.m_bUseVirtualFont = TRUE;
#endif
int32 csid ;
if( PREF_GetIntPref("intl.character_set",&csid) != PREF_NOERROR)
csid = 2;
m_iCSID = (int16)csid;
INTL_ChangeDefaultCharSetID((int16)csid);
#ifndef MOZ_NGLAYOUT
VERIFY( FONTERR_OK == theGlobalNSFont.InitFontModule() );
#endif /* MOZ_NGLAYOUT */
// Initialize RDF
m_pRDFCX = new CRDFCX(::RDFSlave, MWContextRDFSlave);
// Set version and application names
// We have to get around it's const status.
XP_AppName = XP_STRDUP(szLoadString(IDS_APP_NAME));
XP_AppLanguage = XP_STRDUP(szLoadString(IDS_APP_LANGUAGE));
XP_AppCodeName = XP_STRDUP(szLoadString(IDS_APP_CODE_NAME));
XP_AppVersion = XP_STRDUP(ResolveShortAppVersion());
if (!login_QueryForCurrentProfile())
return FALSE;
#ifdef MOZ_FULLCIRCLE
// Full Circle initialization must happen once the current
// profile is known, such that the prefs calls work.
XP_Bool fullcircle_enable = TRUE;
PREF_GetBoolPref("general.fullcircle_enable", &fullcircle_enable);
if(fullcircle_enable) {
FCInitialize();
}
#endif
#endif // NEW_PREF_ARCH
// Read in font and setup encoding table stuff (must be done after prefs are read)
m_pIntlFont = new CIntlFont;
// SECNAV_INIT requires AppCodeName and the first substring in AppVersion
SECNAV_Init();
GH_InitGlobalHistory();
NET_FinishInitNetLib();
PREF_GetIntPref("network.tcpbufsize",&prefInt);
int nTCPBuff = CASTINT(prefInt);
// Have preference watchers commence since prefs are up.
prefInfo.Initialize();
//move to this location due to report that PREF calls were crashing 16bit java.
//also, only do this if we are the first instance. See the instance checing section
//for where bAlreadyRunning is set. ifdef'd for win16 since never have 2 instances.
#ifdef XP_WIN32
if(!bAlreadyRunning)
{
#endif
#ifdef MOZ_OFFLINE
extern void AskMeDlg(void);
AskMeDlg();
#endif /* MOZ_OFFLINE */
#ifdef XP_WIN32
}
#endif
// If we're running automated or embedded, we instantly need to create
// a new lock on the appication.
// So OnIdle for a full description of the problem at hand.
// Consider ourselves automated if we have a print command.
m_bEmbedded = RunEmbedded();
m_bAutomated = RunAutomated();
// register the icon for our document files
auto char ca_default[_MAX_PATH + 5];
::GetModuleFileName(m_hInstance, ca_default, _MAX_PATH);
strcat(ca_default, ",1"); //Dave: Fixed this
if(!fe_RegisterOLEIcon("{481ED670-9D30-11ce-8F9B-0800091AC64E}",
"Netscape Hypertext Document",
ca_default)) {
TRACE("Failed to register OLE Icons\n");
}
if (!(sysInfo.m_bWin32 && sysInfo.m_dwMajor >= 4))
SetDialogBkColor(); // set dialog background color to gray
LoadStdProfileSettings(); // Load standard INI file options (including MRU)
hAccelTable = LoadAccelerators (m_hInstance, MAKEINTRESOURCE(IDR_MAINFRAME));
// Enable shell printing
EnableShellStuff();
// Get the list of trusted user applications.
m_pSpawn = new CSpawnList();
// The first order of business is to get our install directory so that we can
// locate the dumb files and use the install dir as the default for other
// files and directories
if (!strcmpi(szLoadString(IDS_LOCKED_PREFERENCES),"yes"))
m_bUseLockedPrefs = TRUE;
else
m_bUseLockedPrefs = FALSE;
#ifndef MOZ_NGLAYOUT
// Frame creation may cause the loading of the home page so register
// all of the parser and network functions first
static PA_InitData parser_data;
parser_data.output_func = LO_ProcessTag;
#endif /* MOZ_NGLAYOUT */
PREF_GetIntPref("network.max_connections",&prefInt);
int nMaxConnect = CASTINT(prefInt);
// In 2.0 this has no GUI and is only settable via the installer for
// Personal Edition so don't put it in the m_PrefList list so that
// we don't create the entry when we flush out all of our preferences
// CPref nTCPTimeOut(NULL, "Network", "TCP Connect Timeout", 0);
/* larubbio begin */
msg = m_UserDirectory;
msg += "\\archive";
m_pSARCacheDir = msg;
//
// make sure we can write to this directory
//
if(!FEU_SanityCheckDir(m_pSARCacheDir)){
char msg[1024];
::sprintf(msg, szLoadString(IDS_ERR_CACHE_DIR_NOT_EXIST), m_pSARCacheDir);
MessageBox(NULL, msg, szLoadString(AFX_IDS_APP_TITLE), MB_ICONEXCLAMATION | MB_OK);
}
/* larubbio end */
// Read the cache dir
msg = m_UserDirectory;
msg += "\\cache";
PREF_SetDefaultCharPref("browser.cache.directory",msg);
prefStr = NULL;
PREF_CopyCharPref("browser.cache.directory",&prefStr);
m_pCacheDir = prefStr;
PREF_RegisterCallback("browser.cache.directory",WinFEPrefChangedFunc,NULL);
if (prefStr) XP_FREE(prefStr);
//
// make sure we can write to this directory
//
XP_Bool bTurnOffDiskCache = FALSE;
if(!FEU_SanityCheckDir(m_pCacheDir)){
char msg[1024];
::sprintf(msg, szLoadString(IDS_ERR_CACHE_DIR_NOT_EXIST), m_pCacheDir);
MessageBox(NULL, msg, szLoadString(AFX_IDS_APP_TITLE), MB_ICONEXCLAMATION | MB_OK);
// turn off the cache for now
bTurnOffDiskCache = TRUE;
}
#ifdef JEM
// Initialize the network module
/* NET_InitNetLib handles socks initialization. */
NET_InitNetLib(nTCPBuff, sysInfo.m_iMaxSockets);
#endif
#ifdef MOZ_LOC_INDEP
STARTUP_li();
#endif /* MOZ_LOC_INDEP */
SECNAV_RunInitialSecConfig();
NET_ChangeMaxNumberOfConnectionsPerContext(nMaxConnect);
// throw away old wrong app version, get right one */
XP_FREE(XP_AppVersion);
XP_AppVersion = XP_STRDUP(ResolveAppVersion());
if (bTurnOffDiskCache) NET_SetDiskCacheSize(0);
//
// Only mess with the TCP connect time out if we have gotten a
// positive number out of the Registry/INI file. Don't let the
// number go below 30 seconds or above 4 minutes
//
int32 nTCPTimeOut;
PREF_GetIntPref("network.tcptimeout",&nTCPTimeOut);
if(nTCPTimeOut > 30 && nTCPTimeOut < 240)
NET_SetTCPConnectTimeout(nTCPTimeOut);
else if(nTCPTimeOut > 240)
NET_SetTCPConnectTimeout(240);
#if defined(XP_WIN32)
XP_AppPlatform = "Win32";
#elif defined(XP_WIN16)
XP_AppPlatform = "Win16";
#else
#error Unexpected platform!
#endif
// Get the Id of the message which NSPR uses for event notifications...
m_msgNSPREventNotify = ::RegisterWindowMessage("NSPR_PostEvent");
// rhp - Added change for not showing splash screen for MAPI startup
// now that we are done with everything that can fail, show the splash
if (showSplashScreen(csPrintCommand))
{
// only show splash if not embedded
m_splash.Create(NULL);
#if !defined(DEBUG_chouck) && !defined(DEBUG_warren) && !defined(DEBUG_phil) && !defined(DEBUG_hyatt) && !defined(DEBUG_hshaw) && !defined(DEBUG_law)
m_splash.ShowWindow(SW_SHOW);
#endif
m_splash.UpdateWindow();
}
// figure out if we need to have a little N in the toolbar for
// cobranding purposes
int iTmp;
m_bShowNetscapeButton = CUST_IsCustomAnimation(&iTmp);
//BEGIN STREAM VODOO
// Add user configured MIME types and file extensions to the NETLIB lists.
// This sets up any user configured viewers also, by placing them in a list that
// will be entered in the function external_viewer_disk_stream.... What a kludge.
// This also constructs a list of possible helper applications that are spawned off
// in external_viewer_disk_stream read in from the INI file.
fe_InitFileFormatTypes();
#ifdef XP_WIN32
// Check to see if we're the "default browser"
if ( !m_bShowPrefsOnStartup ) {
CheckDefaultBrowser();
}
#endif // XP_WIN32
//Begin CRN_MIME
//At this point we have all the mime_type prefs(from prefs.js, netscape.cfg)
//read into the prefs table. Use this info to update the NETLIB lists.
fe_UpdateMControlMimeTypes();
//Register a callback so that we can update the mime type info., in response to
//new AutoAdmin prefs updates.
PREF_RegisterCallback("mime.types.all_defined",WinFEPrefChangedFunc,NULL);
//End CRN_MIME
// NEVER MODIFY THE BELOW unless NEW FO types appear.
// NEVER CALL RealNET_RegisterContentTypeConverter ANYWHERE ELSE (exceptions in presentm.cpp).
// INSTEAD USE NET_RegisterContentTypeConverter.
// WE MUST INITIALIZE EVERY FO_Format_Out TO OUR PRESENTATION MANAGER.
char *cp_wild = "*";
// Mocha src equal converter.
NET_RegisterContentTypeConverter("application/x-javascript", FO_PRESENT, NULL, NET_CreateMochaConverter);
// XXX dkarlton is adding preencrypted files here, even though it's called
// in libnet/cvmime.c. What's going on here?
#ifdef FORTEZZA
NET_RegisterContentTypeConverter(INTERNAL_PRE_ENCRYPTED, FO_PRESENT, NULL, SECNAV_MakePreencryptedStream);
// mwh - xxx need to check on this.
//NET_RegisterContentTypeConverter(INTERNAL_PRE_ENCRYPTED, FO_INTERNAL_IMAGE, NULL, PresentationManagerStream);
//NET_RegisterContentTypeConverter(INTERNAL_PRE_ENCRYPTED, FO_VIEW_SOURCE, NULL, PresentationManagerStream);
NET_RegisterContentTypeConverter(APPLICATION_PRE_ENCRYPTED, FO_PRESENT, NULL, SECNAV_MakePreencryptedStream);
// mwh - xxx need to check on this.
//NET_RegisterContentTypeConverter(APPLICATION_PRE_ENCRYPTED, FO_INTERNAL_IMAGE, NULL, PresentationManagerStream);
//NET_RegisterContentTypeConverter(APPLICATION_PRE_ENCRYPTED, FO_VIEW_SOURCE, NULL, PresentationManagerStream);
#endif
#ifdef JAVA
//NET_RegisterContentTypeConverter(cp_wild, FO_DO_JAVA, NULL, PresentationManagerStream);
#endif
#ifdef FORTEZZA
NET_RegisterContentTypeConverter(APPLICATION_PRE_ENCRYPTED, FO_CACHE_AND_PRESENT, NULL, SECNAV_MakePreencryptedStream);
NET_RegisterContentTypeConverter(APPLICATION_PRE_ENCRYPTED, FO_CACHE_AND_INTERNAL_IMAGE, NULL, SECNAV_MakePreencryptedStream);
NET_RegisterContentTypeConverter(APPLICATION_PRE_ENCRYPTED, FO_CACHE_AND_VIEW_SOURCE, NULL,SECNAV_MakePreencryptedStream);
#endif
NET_RegisterContentTypeConverter(cp_wild, FO_CACHE_ONLY, NULL, NET_CacheConverter);
NET_RegisterContentTypeConverter(cp_wild, FO_CACHE_AND_PRESENT, NULL, NET_CacheConverter);
NET_RegisterContentTypeConverter(cp_wild, FO_CACHE_AND_INTERNAL_IMAGE, NULL, NET_CacheConverter);
NET_RegisterContentTypeConverter(cp_wild, FO_CACHE_AND_OUT_TO_PROXY_CLIENT, NULL, NET_CacheConverter);
NET_RegisterContentTypeConverter(cp_wild, FO_CACHE_AND_VIEW_SOURCE, NULL, NET_CacheConverter);
NET_RegisterContentTypeConverter(cp_wild, FO_CACHE_AND_SAVE_AS, NULL, NET_CacheConverter);
NET_RegisterContentTypeConverter(cp_wild, FO_CACHE_AND_SAVE_AS_TEXT, NULL, NET_CacheConverter);
NET_RegisterContentTypeConverter(cp_wild, FO_CACHE_AND_SAVE_AS_POSTSCRIPT, NULL, NET_CacheConverter);
NET_RegisterContentTypeConverter(cp_wild, FO_CACHE_AND_QUOTE_MESSAGE, NULL, NET_CacheConverter);
NET_RegisterContentTypeConverter(cp_wild, FO_CACHE_AND_MAIL_TO, NULL, NET_CacheConverter);
NET_RegisterContentTypeConverter(cp_wild, FO_CACHE_AND_OLE_NETWORK, NULL, NET_CacheConverter);
NET_RegisterContentTypeConverter(cp_wild, FO_CACHE_AND_MULTIPART_IMAGE, NULL, NET_CacheConverter);
NET_RegisterContentTypeConverter(cp_wild, FO_CACHE_AND_PRINT, NULL, NET_CacheConverter);
// Set up converters for our Presentation Manager.
// Front end sets these up, only because the front end handles front end converters!
// XP code is responsible for registering their proper converters in NET_RegisterMIMEDecoders
NET_RegisterContentTypeConverter("text/*", FO_VIEW_SOURCE, NULL, memory_stream); // */
NET_RegisterContentTypeConverter(cp_wild, FO_PRESENT, NULL, external_viewer_disk_stream);
NET_RegisterContentTypeConverter(cp_wild, FO_PRINT, NULL, external_viewer_disk_stream);
NET_RegisterContentTypeConverter(cp_wild, FO_VIEW_SOURCE, NULL, memory_stream);
NET_RegisterContentTypeConverter(cp_wild, FO_OUT_TO_PROXY_CLIENT, NULL, external_viewer_disk_stream);
NET_RegisterContentTypeConverter(cp_wild, FO_SAVE_AS, NULL, ContextSaveStream);
NET_RegisterContentTypeConverter(cp_wild, FO_OLE_NETWORK, NULL, nfe_OleStream);
#ifndef MOZ_NGLAYOUT
NET_RegisterContentTypeConverter(cp_wild, FO_EMBED, NULL, EmbedStream);
#endif
// added by ftang & jliu, just remap it from memory_stream->net_ColorHTMLStream
NET_RegisterContentTypeConverter(INTERNAL_PARSER, FO_VIEW_SOURCE, TEXT_HTML, net_ColorHTMLStream);
// EVERY FO_PRESENT REGISTRATION NEEDS TO BE ALSO DONE FOR FO_PRINT!!!
// Need to handle a format out of FO_PRINT in order to correctly print without spawning
// registered external/automated viewers.
// Had to look in odd places to find all the correct ones. Try cvmime.c
NET_RegisterContentTypeConverter(TEXT_HTML, FO_PRINT, NULL, INTL_ConvCharCode);
NET_RegisterContentTypeConverter(TEXT_MDL, FO_PRINT, NULL, INTL_ConvCharCode);
NET_RegisterContentTypeConverter(TEXT_PLAIN, FO_PRINT, NULL, NET_PlainTextConverter);
NET_RegisterContentTypeConverter(UNKNOWN_CONTENT_TYPE, FO_PRINT, NULL, NET_PlainTextConverter);
#ifndef MOZ_NGLAYOUT
NET_RegisterContentTypeConverter(INTERNAL_PARSER, FO_PRINT, (void *)&parser_data, PA_BeginParseMDL);
#endif /* MOZ_NGLAYOUT */
NET_RegisterContentTypeConverter(IMAGE_GIF, FO_PRINT, NULL, IL_ViewStream);
NET_RegisterContentTypeConverter(IMAGE_XBM, FO_PRINT, NULL, IL_ViewStream);
NET_RegisterContentTypeConverter(IMAGE_JPG, FO_PRINT, NULL, IL_ViewStream);
// Don't handle printing cases if we can't format it.
// NET_RegisterContentTypeConverter(cp_wild, FO_PRINT, NULL, null_stream);
// Initialize our OLE viewers in WPM.
COleRegistry::RegisterIniViewers();
// Initialize our OLE protocol handlers.
COleRegistry::RegisterIniProtocolHandlers();
//END STREAM VODOO
#ifdef MOZ_NGLAYOUT
InitializeNGLayout();
#endif
CString strStatus;
// rhp - Added flag for MAPI startup...
if (showSplashScreen(csPrintCommand)) {
strStatus.LoadString(IDS_LOAD_PREFS);
m_splash.DisplayStatus(strStatus);
}
StoreVersionInReg();
// BUG: will need to make sure this directory exists
/////////////////////////////////////////////////////////////////////////
// Look up application level preferences
// Override Home Page for PE ASW Entry here?? SWE
if (!theApp.m_csPEPage.IsEmpty())
{
m_pHomePage = (const char *) theApp.m_csPEPage;
// Kludge this one too to make it go there...
m_CmdLineLoadURL = XP_STRDUP((const char *) theApp.m_csPEPage);
}
else
{
// Read the home page out of the .ini file
prefStr = NULL;
if (!PREF_CopyCharPref("browser.startup.homepage",&prefStr)) {
m_pHomePage = prefStr;
if (prefStr) XP_FREE(prefStr);
} else m_pHomePage = "";
PREF_RegisterCallback("browser.startup.homepage",WinFEPrefChangedFunc,NULL);
}
// TODO (jonm) register WFE pref callbacks
if(!strcmp(szLoadString(IDS_CHANGE_HOMEPAGE), "yes")) {
m_nChangeHomePage = TRUE;
} else {
PREF_SetCharPref("browser.startup.homepage",szLoadString(IDS_DEF_HOMEPAGE));
m_nChangeHomePage = FALSE;
}
fe_InitJava();
/////////////////////////////////////////////////////////////////////////
// what menu were we last looking at in the preferences window?
m_nConfig = GetProfileInt("Main", "Last Config Menu", 0);
/////////////////////////////////////////////////////////////////////
// Security warnings
for(int i = 0; i < MAX_SECURITY_CHECKS; i++)
m_nSecurityCheck[i] = TRUE;
if(GetProfileString("Security", "Warn Entering", "yes") == "no")
m_nSecurityCheck[SD_ENTERING_SECURE_SPACE] = FALSE;
if(GetProfileString("Security", "Warn Leaving", "yes") == "no")
m_nSecurityCheck[SD_LEAVING_SECURE_SPACE] = FALSE;
if(GetProfileString("Security", "Warn Mixed", "yes") == "no")
m_nSecurityCheck[SD_INSECURE_DOCS_WITHIN_SECURE_DOCS_NOT_SHOWN] = FALSE;
if(GetProfileString("Security", "Warn Insecure Forms", "yes") == "no")
m_nSecurityCheck[SD_INSECURE_POST_FROM_INSECURE_DOC] = FALSE;
#ifdef EDITOR
// Initialize any global data etc. needed by composer
// (Implemented in EDFRAME.CPP)
WFE_InitComposer();
#endif
/////////////////////////////////////////////////////////////////////
// Protocol Whining Preferences
prefBool=TRUE;
PREF_GetBoolPref("security.submit_email_forms",&prefBool);
NET_WarnOnMailtoPost((PRBool)prefBool);
m_pTelnet = "";
m_pTn3270 = "";
m_pHTML = "";
//
// Initialize message stuff...
//
#ifdef MOZ_MAIL_NEWS
WFE_MSGInit();
#endif /* MOZ_MAIL_NEWS */
// rhp - Added flag for MAPI startup...
if (showSplashScreen(csPrintCommand)) {
strStatus.LoadString(IDS_LOAD_BOOKMARKS);
m_splash.DisplayStatus(strStatus);
}
// RDF INITIALIZATION (BEGINS HERE)
CString profileDirURL;
WFE_ConvertFile2Url(profileDirURL, theApp.m_UserDirectory);
profileDirURL = profileDirURL + "/";
CString encodedDir;
encodedDir = WFE_EscapeURL(profileDirURL);
RDF_InitParamsStruct initStruct;
initStruct.profileURL = (char *)(const char*)(encodedDir);
//m_RDFStdResources = RDF_StdVocab();
m_bInInitInstance = FALSE;
msg = m_UserDirectory + "\\bookmark.htm";
PREF_SetDefaultCharPref("browser.bookmark_location",msg);
CString bookmarkFile;
prefStr = NULL;
PREF_CopyCharPref("browser.bookmark_location",&prefStr);
bookmarkFile = prefStr;
if (prefStr) XP_FREE(prefStr);
CString urlHistory = profileDirURL + "mozilla.hst";
// Encode the bookmarks
CString urlBookmark;
WFE_ConvertFile2Url(urlBookmark, bookmarkFile);
CString encodedBookmark = WFE_EscapeURL(urlBookmark);
initStruct.bookmarksURL = (char*)(const char*)encodedBookmark;
initStruct.globalHistoryURL = (char*)(const char*)urlHistory;
RDF_Init(&initStruct); // TODO: Can this fail? Want to bail if so.
// Initialize the command map used by RDF configurable UI.
m_pBrowserCommandMap = CIsomorphicCommandMap::InitializeCommandMap("Browser Commands");
m_pCommandToolbarIndices = CIsomorphicCommandMap::InitializeCommandMap("Command Toolbar Bitmap Indices");
// RDF INITIALIZATION ENDS HERE
m_bInInitInstance = FALSE;
// read in bookmark location
// msg = m_pInstallDir->GetCharValue();
prefStr = NULL;
PREF_CopyCharPref("browser.bookmark_location",&prefStr);
m_pBookmarkFile = prefStr;
if (prefStr) XP_FREE(prefStr);
PREF_RegisterCallback("browser.bookmark_location",WinFEPrefChangedFunc,NULL);
if(_access(m_pBookmarkFile,0)==-1) {
PREF_SetCharPref("browser.bookmark_location",msg);
}
// finish pref initialization, now that RDF is up
prefInfo.InitializeToRDF();
#ifdef MOZ_OFFLINE
m_bSynchronizingExit = FALSE;
m_bSynchronizing = FALSE;
#endif/* MOZ_OFFLINE */
// Get LDAP servers filename
#ifdef MOZ_LDAP
msg = m_UserDirectory;
msg += "\\ldapsrvr.txt";
PREF_SetDefaultCharPref("browser.ldapfile_location",msg);
char * ldapFile = NULL;
PREF_CopyCharPref("browser.ldapfile_location",&ldapFile);
// Initialize the directories and PAB
msg = "abook.nab";
PREF_SetDefaultCharPref("browser.addressbook_location",msg);
CFileException e;
CStdioFile serversFile;
if (serversFile.Open(ldapFile,
CFile::modeRead | CFile::typeText, &e) &&
serversFile.GetLength())
{
char text[1024], temp[256];
int pos = 0;
int line = 0;
m_directories = XP_ListNew();
while (serversFile.ReadString(text, 1023) != NULL)
{
DIR_Server* dir = (DIR_Server *) XP_ALLOC(sizeof(DIR_Server)); // alloc new struct
if (dir)
{
DIR_InitServer(dir);
if (line)
dir->dirType = LDAPDirectory; /* required */
else
{
dir->dirType = PABDirectory; /* required */
dir->fileName = XP_STRDUP(msg);
}
line += 1;
int pos = 0;
int tempPos = 0;
int total = 0;
int type = 0;
while (text[pos] != '\0')
{
while (text[pos] != '\t' && text[pos] != '\0')
{
temp[tempPos++] = text[pos++];
}
temp[tempPos] = '\0';
switch (type++)
{
case 0:
dir->description = XP_STRDUP(temp);
break;
case 1:
dir->serverName = XP_STRDUP(temp);
break;
case 2:
dir->searchBase = XP_STRDUP(temp);
break;
case 3:
dir->port = atoi(temp);
break;
case 4:
dir->maxHits = atoi(temp);
break;
case 5:
dir->isSecure = atoi(temp);
break;
case 6:
dir->savePassword = atoi(temp);
break;
default:
break;
}
tempPos = 0;
if (text[pos] == '\t')
pos++;
}
if (dir->dirType == LDAPDirectory)
dir->fileName = WH_FileName (dir->serverName, xpAddrBook);
XP_ListAddObjectToEnd(m_directories, dir);
}
}
serversFile.Close();
if (DIR_SaveServerPreferences (m_directories) != -1)
CFile::Remove( ldapFile );
}
else
{
m_directories = DIR_GetDirServers();
char * ldapPref = PR_smprintf("ldap_%d.end_of_directories", kCurrentListVersion);
if (ldapPref)
PREF_RegisterCallback(ldapPref, DirServerListChanged, NULL);
XP_FREEIF (ldapPref);
}
if (ldapFile) XP_FREE(ldapFile);
#ifndef MOZ_NEWADDR
DIR_Server* pab = NULL;
DIR_GetPersonalAddressBook (theApp.m_directories, &pab);
XP_ASSERT (pab);
msg = m_UserDirectory;
msg += "\\address.htm";
AB_InitializeAddressBook(pab, &m_pABook, (const char *) msg);
#endif
#endif /* MOZ_LDAP */
// Initialize slave URL loading context.
// Use HTML help IDs, per legacy slave context code
// in olehelp.cpp
m_pSlaveCX = new CStubsCX(::HtmlHelp, MWContextHTMLHelp);
#ifdef MOZ_MAIL_NEWS
// Initialize the address book context
CStubsCX *pCx = new CAddrCX();
m_pAddressContext = pCx->GetContext();
#endif /* MOZ_MAIL_NEWS */
// rhp - Added flags for MAPI startup...
if (showSplashScreen(csPrintCommand)) {
strStatus.LoadString(IDS_LOAD_PLUGINS);
m_splash.DisplayStatus(strStatus);
}
STARTUP_np();
#ifndef MOZ_NGLAYOUT
LM_InitMocha();
#endif /* MOZ_NGLAYOUT */
// if PE mode, start up java too!
#if defined(OJI) || defined(JAVA)
if (m_bAccountSetupStartupJava) {
// rhp - Added flags for MAPI startup...
if (showSplashScreen(csPrintCommand)) {
strStatus.LoadString(IDS_LOAD_JAVA);
m_splash.DisplayStatus(strStatus);
}
WFE_LJ_StartupJava(); // stub call because java.h can't be included here
}
#endif
// right before we take down the splash screen, do our OLE startup notifications.
COleRegistry::Startup();
//CLM: Placed here as done in AKBAR
// now that we are done with everything, kill the splash
// rhp - Added flag for MAPI startup...
if (showSplashScreen(csPrintCommand)) {
// only show splash if not embedded
m_splash.NavDoneIniting();
}
#if defined(OJI) || defined(JAVA)
// if PE mode, check if java environment is valid
if (m_bAccountSetupStartupJava) {
PRBool started = PR_FALSE;
#ifdef OJI
JRIEnv* ee = NULL;
nsJVMMgr* jvmMgr = JVM_GetJVMMgr();
if (jvmMgr) {
started = jvmMgr->StartupJVM() == nsJVMStatus_Running;
jvmMgr->Release();
}
#else
JRIEnv * ee = JRI_GetCurrentEnv();
started = ee != NULL;
#endif
if (started) {
CString szJavaStartupErr = "You are starting up an application that needs java.\nPlease turn on java in your navigator's preference and try again.";
AfxMessageBox(szJavaStartupErr, MB_OK);
m_bAccountSetupStartupJava = FALSE;
return FALSE;
}
m_bAccountSetupStartupJava = FALSE;
}
#endif
// Its now safe to create the frame objects and start this whole thang
// only if we're not automated.
//
//
/// For adding of AddressBook frame to frame list.non private version.
void WFE_AddNewFrameToFrameList(CGenericFrame * pFrame);
//Please make sure this code stays before the startupMode stuff so that
//we can process the StartMode commands in AltMail mode
prefBool = FALSE;
PREF_GetBoolPref("mail.use_altmail",&prefBool);
if(prefBool)
FEU_OpenMapiLibrary();
if(m_bAutomated == FALSE && m_bEmbedded == FALSE && m_bShowPrefsOnStartup == FALSE && csPrintCommand.IsEmpty())
{
long iStartupMode=0;
PRBool bStartMode = FALSE;
PREF_GetBoolPref("general.startup.browser", &bStartMode);
if (bStartMode)
iStartupMode |= STARTUP_BROWSER;
PREF_GetBoolPref("general.startup.mail", &bStartMode);
if (bStartMode)
iStartupMode |= STARTUP_MAIL;
PREF_GetBoolPref("general.startup.calendar", &bStartMode);
if (bStartMode)
iStartupMode |= STARTUP_CALENDAR;
PREF_GetBoolPref("general.startup.news", &bStartMode);
if (bStartMode)
iStartupMode |= STARTUP_NEWS;
PREF_GetBoolPref("general.startup.editor", &bStartMode);
if (bStartMode)
iStartupMode |= STARTUP_EDITOR;
PREF_GetBoolPref("general.startup.netcaster", &bStartMode);
if (bStartMode)
iStartupMode |= STARTUP_NETCASTER;
PREF_GetBoolPref("general.startup.calendar", &bStartMode);
if (bStartMode)
iStartupMode |= STARTUP_CALENDAR;
PREF_GetBoolPref("general.startup.conference", &bStartMode);
if (bStartMode)
iStartupMode |= STARTUP_CONFERENCE;
//over ride prefference settings on iStartupMode if necessary
SetStartupMode(&iStartupMode);
//Last chance to make sure at least the browser is launched if nothing else
//was set either in preferences or on the command line.
//--- Added STARTUP_ACCOUNT_SETUP here because we want browser in main window and error in DDE
if ( !m_bShowPrefsOnStartup && ( iStartupMode == 0 || iStartupMode == STARTUP_ACCOUNT_SETUP ))
iStartupMode |= STARTUP_BROWSER;
void OpenDraftExit (URL_Struct *url_struct, int/*status*/,MWContext *pContext);
if (!m_bKioskMode)
{
// So, instead of adding to the nightmarish way of launching components
// below, Netcaster will look for the set bit BEFORE the switch statement,
// launch itself, then remove the bit. In an absurd kind of way, this seems
// cleaner than adding a boatload of new #defines to support a fifth module.
if (iStartupMode & STARTUP_NETCASTER && FE_IsNetcasterInstalled()) {
FEU_OpenNetcaster() ;
(iStartupMode &= (~STARTUP_NETCASTER)) ;
}
if (iStartupMode & STARTUP_CALENDAR) {
CString installDirectory, executable;
#ifdef WIN32
CString calRegistry;
calRegistry.LoadString(IDS_CALENDAR_REGISTRY);
calRegistry = FEU_GetCurrentRegistry(calRegistry);
if(!calRegistry.IsEmpty())
{
installDirectory = FEU_GetInstallationDirectory(calRegistry, szLoadString(IDS_INSTALL_DIRECTORY));
executable = szLoadString(IDS_CALENDAR32EXE);
#else ifdef XP_WIN16
installDirectory = FEU_GetInstallationDirectory(szLoadString(IDS_CALENDAR),szLoadString(IDS_INSTALL_DIRECTORY));
executable = szLoadString(IDS_CALENDAR16EXE);
#endif
if(!installDirectory.IsEmpty())
{
executable = installDirectory + executable;
WinExec(executable, SW_SHOW);
}
#ifdef WIN32
}
#endif
(iStartupMode &= (~STARTUP_CALENDAR)) ;
}
if (iStartupMode & STARTUP_CONFERENCE) {
CString installDirectory, executable;
#ifdef WIN32
installDirectory = FEU_GetInstallationDirectory(szLoadString(IDS_CONFERENCE_REGISTRY), szLoadString(IDS_PATHNAME));
executable = "\\nsconf32.exe -b";
#else ifdef XP_WIN16
installDirectory = FEU_GetInstallationDirectory(szLoadString(IDS_CONFERENCE),szLoadString(IDS_INSTALL_DIRECTORY));
executable = "\\nsconf16.exe -b";
#endif
if(!installDirectory.IsEmpty())
{
executable = installDirectory + executable;
WinExec(executable, SW_SHOW);
}
(iStartupMode &= (~STARTUP_CONFERENCE)) ;
}
//command line component launch
switch(iStartupMode)
{
case STARTUP_NETHELP: {
// Have NetHelp handle the request.
ASSERT(m_CmdLineLoadURL); // Okay, who messed with it?
if(m_pSlaveCX) {
m_pSlaveCX->NormalGetUrl(m_CmdLineLoadURL);
}
// Get rid of the URL.
XP_FREE(m_CmdLineLoadURL);
m_CmdLineLoadURL = NULL;
break;
}
case STARTUP_CALENDAR:
WFE_StartCalendar();
break;
#ifdef MOZ_MAIL_NEWS
case STARTUP_INBOX:
WFE_MSGOpenInbox(); //opens the inbox folder with the split pain view.
break;
case STARTUP_CLIENT_MAPI: // rhp - for MAPI Startup
case STARTUP_CLIENT_ABAPI: // rhp - for Address Book API
{
CGenericDoc *pDoc = (CGenericDoc *)theApp.m_ViewTmplate->OpenDocumentFile(NULL, FALSE);
if (pDoc)
{
CFrameGlue *pFrame = (pDoc->GetContext())->GetFrame();
if(pFrame)
{
CFrameWnd *pFrameWnd = pFrame->GetFrameWnd();
if (pFrameWnd)
{
extern void StoreMAPIFrameWnd(CFrameWnd *pFrameWnd);
extern void StoreNABFrameWnd(CFrameWnd *pFrameWnd);
pFrameWnd->ShowWindow(SW_SHOWMINIMIZED);
if (iStartupMode == STARTUP_CLIENT_MAPI)
{
StoreMAPIFrameWnd(pFrameWnd);
}
else
{
StoreNABFrameWnd(pFrameWnd);
}
}
}
}
}
// rhp - for MAPI startup...
break;
case STARTUP_FOLDER:
WFE_MSGOpenInbox();
break;
case STARTUP_MAIL:
WFE_MSGOpenInbox(); //opens the inbox folder with the split pain view.
//tell the browser to open commandline URL even though MAIL is set in preferences
if(m_CmdLineLoadURL != NULL)
iStartupMode |= STARTUP_BROWSER;
break;
case STARTUP_FOLDERS:
WFE_MSGOpenFolders(); //opens the collections window
break;
case STARTUP_COMPOSE:
if(!lstrArgumentList.GetCount())
MSG_Mail(m_pBmContext); // starts the mail composition window.
else
{ //handle any extra arguments for this flag here.
char *pTemp;
URL_Struct* pURL;
CString strUrl;
int nArgCount = lstrArgumentList.GetCount();
if (nArgCount == 1)
{//either a message or an attachment. If it's an attachment it
//will be prefixed with an "@" symbol
pTemp = (char*) (const char*)lstrArgumentList.GetHead();
//decide whether it's a message or an attachment
if(*pTemp != '@' && *pTemp != '-')
{ //it's a message
CFileStatus rStatus;
if(CFile::GetStatus(pTemp,rStatus))
{
WFE_ConvertFile2Url(strUrl, pTemp);
pURL = NET_CreateURLStruct(strUrl, NET_DONT_RELOAD);
StrAllocCopy(pURL->content_type,"message/rfc822");
NET_GetURL (pURL, FO_OPEN_DRAFT, m_pBmContext,
OpenDraftExit);
//Load it into the compose window
}
else
{
AfxMessageBox(IDS_CMDLINE_ERROR1);
MSG_Mail(m_pBmContext);
//were just going to act as if we couldn't read what they gave us and continue
}
}
else
{//it's an attachment
pTemp += 1;
CFileStatus rStatus;
if(CFile::GetStatus(pTemp,rStatus))
{
if (!LaunchComposeAndAttach(lstrArgumentList))
{
AfxMessageBox(IDS_CMDLINE_ERROR3);
MSG_Mail(m_pBmContext);
}
//Load it into the compose window
}
else
{
AfxMessageBox(IDS_CMDLINE_ERROR1);
MSG_Mail(m_pBmContext);
}
}
}
else
{
if (nArgCount == 2)
{
//it's a message and has an attachment(s)
if (!LaunchComposeAndAttach(lstrArgumentList))
{
AfxMessageBox(IDS_CMDLINE_ERROR3);
MSG_Mail(m_pBmContext);
}
else
{ //command line is not in a recognizable format for this flag
AfxMessageBox(IDS_CMDLINE_ERROR3);
MSG_Mail(m_pBmContext);
//ERROR!!!
}
}
}
}//End -COMPOSE CASE
break;
case STARTUP_ADDRESS:
CAddrFrame::Open();
break;
case STARTUP_IMPORT:
ImportExportLDIF(m_pABook, m_CmdLineLoadURL, iStartupMode);
return FALSE;
case STARTUP_EXPORT:
ImportExportLDIF (m_pABook, m_CmdLineLoadURL, iStartupMode);
return FALSE;
case STARTUP_NEWS:
WFE_MSGOpenNews(); //starts the news and opens the default news server and group in split pain.
//tell the browser to open commandline URL even though NEWS is set in preferences
if(m_CmdLineLoadURL != NULL)
iStartupMode |= STARTUP_BROWSER;
break;
case STARTUP_MAIL_NEWS:
//We get here because of preferences and nothing but a file or no file was given on the command
//line.
WFE_MSGOpenInbox(); //opens the inbox folder with the split pain view.
WFE_MSGOpenNews(); //opens the collections window
//tell the browser to open commandline URL even though MAIL & NEWS are set in preferences
if(m_CmdLineLoadURL != NULL)
iStartupMode |= STARTUP_BROWSER;
break;
case STARTUP_MAIL_NEWS_BROWSER:
//all three check boxes were set in preferences
WFE_MSGOpenInbox(); //opens the inbox folder with the split pain view.
WFE_MSGOpenNews(); //opens the collections window
//browser will get launched in the code below.
break;
case STARTUP_MAIL_BROWSER:
//mail and browser check boxes were checked
WFE_MSGOpenInbox(); //starts the inbox window.
//browser will get launched in the code below
break;
case STARTUP_NEWS_BROWSER:
//browser and news check boxes were checked
WFE_MSGOpenNews(); //opens the collections window
//browser will get launched in the code below.
break;
case STARTUP_BROWSER_EDITOR:
//Code will get called below. for both browser and editor
break;
case STARTUP_MAIL_EDITOR:
//mail and editor check boxes were checked
WFE_MSGOpenInbox(); //starts the inbox window.
//browser will get launched in the code below
//editor is launched in code below
break;
case STARTUP_NEWS_EDITOR:
WFE_MSGOpenNews(); //opens the collections window
break; //editor will get launched in the code below.
//editor is launched in code below
/*
case STARTUP_NETCASTER:
FEU_OpenNetcaster() ;
break;
*/
case STARTUP_MAIL_NEWS_EDITOR:
WFE_MSGOpenInbox(); //opens the inbox folder with the split pain view.
WFE_MSGOpenNews(); //opens the collections window
//tell the browser to open URL even though it wasn't set in preferences
if(m_CmdLineLoadURL != NULL)
iStartupMode |= STARTUP_BROWSER;
break;
case STARTUP_MAIL_BROWSER_EDITOR:
WFE_MSGOpenInbox(); //starts the inbox window.
break; //browser will get launched in the code below
case STARTUP_NEWS_BROWSER_EDITOR:
WFE_MSGOpenNews(); //opens the collections window
break; //The rest is started below
case STARTUP_MAIL_NEWS_BROWSER_EDITOR:
WFE_MSGOpenInbox(); //opens the inbox folder with the split pain view.
WFE_MSGOpenNews(); //opens the collections window
break; //tell the browser to open commandline URL even though MAIL & NEWS are set in preferences
#endif /* MOZ_MAIL_NEWS */
#if defined(OJI) || defined(JAVA)
case STARTUP_JAVA_DEBUG_AGENT:
WFE_LJ_StartDebugger(); // stub call because java.h can't be included here
break;
#endif
//default:
}
}
//fall through here and launch browser if necessary
#ifdef MOZ_MAIL_NEWS
if ((iStartupMode & STARTUP_BROWSER || iStartupMode & STARTUP_EDITOR || // if startup browser or editor
!(iStartupMode & (STARTUP_BROWSER|STARTUP_CALENDAR|STARTUP_MAIL|STARTUP_ADDRESS
|STARTUP_INBOX|STARTUP_COMPOSE|STARTUP_FOLDER|STARTUP_FOLDERS|STARTUP_NETCASTER
|STARTUP_CLIENT_MAPI|STARTUP_CLIENT_ABAPI)) || // or invalid data
m_bKioskMode )) { // or kiosk mode - start browser
#else
if ((iStartupMode & STARTUP_BROWSER || iStartupMode & STARTUP_EDITOR || // if startup browser or editor
!(iStartupMode & (STARTUP_BROWSER|STARTUP_NEWS|STARTUP_MAIL|STARTUP_ADDRESS
|STARTUP_INBOX|STARTUP_COMPOSE|STARTUP_FOLDER|STARTUP_FOLDERS|STARTUP_NETCASTER|STARTUP_CALENDAR)) || // or invalid data
m_bKioskMode )) { // or kiosk mode - start browser
#endif /* MOZ_MAIL_NEWS */
#ifdef EDITOR
if (bIsGold && (iStartupMode & STARTUP_EDITOR))
{ //start the editor
theApp.m_EditTmplate->OpenDocumentFile(NULL);
CMainFrame *pMainFrame = (CMainFrame *)FEU_GetLastActiveFrame(MWContextBrowser, TRUE);
if(pMainFrame) pMainFrame->OnLoadHomePage();//suppose to load what ever was on the command line
}
#endif // EDITOR
if (iStartupMode & STARTUP_BROWSER)
{
theApp.m_ViewTmplate->OpenDocumentFile(NULL); //open browser window
CGenericFrame *pFrame = (CGenericFrame *)FEU_GetLastActiveFrame(MWContextBrowser, FALSE);
if (pFrame)
{
CMainFrame *pMainFrame = (CMainFrame*)pFrame;
pMainFrame->OnLoadHomePage();
// Now that we have the frame, dynamically create the toolbars (We won't enter this function
// from JavaScript. FE_MakeNewWindow is used instead.)
pMainFrame->BeginStreamingOfRDFToolbars();
}
}
}
if(m_pFrameList && m_pFrameList->GetMainContext())
{
NET_CheckForTimeBomb(m_pFrameList->GetMainContext()->GetContext());
}
}
// Show preferences now.
if( m_bShowPrefsOnStartup ) {
wfe_DisplayPreferences(NULL);
return FALSE;
}
//--------------------------------------------------------------------
// IMPORTANT
// =========
// The user's homepage could have already been loaded. Any init code
// below this line better not be needed for page loading
//--------------------------------------------------------------------
#ifdef MOZ_TASKBAR
// Start the Task Bar up - this must be done AFTER all frame windows
// are created. Get the state flags and last saved position from
// the registry.
ASSERT(!m_TaskBarMgr.IsInitialized());
m_TaskBarMgr.LoadPrefs(m_bAlwaysDockTaskBar);
#endif /* MOZ_TASKBAR */
// DDE is hosed on Windows95 October 94 release. Allow the user to turn it off
// This should be the very last thing done in initinstance, always.
if(GetProfileString("Main", "DDE Hosed", "no") == "no") {
extern void DDEStartup(void);
DDEStartup();
}
// read in the page setup information
LoadPageSetupOptions();
// Start any timeout events.
FEU_GlobalHistoryTimeout((void *)1);
// Leave this as the very last thing to do.
// If we've a print command to exectute, do it now.
if(csPrintCommand.IsEmpty() == FALSE) {
OnDDECommand((char *)(const char *)("/print" + csPrintCommand));
}
// Only do the below when we think we're really ready to exit InitInstance successfully.
// Previously, these were way up towards the top of initinstance, but have been
// put here as they cause wild effects with Inserting an OLE object while
// not currently running under win32.
// Connect the COleTemplateServer to the view document template.
// The COleTemplateServer creates new documents on the behalf of
// requestion OLE containers by using information specified in the
// document template.
m_OleTemplateServer.ConnectTemplate(clsid, pTemplate, FALSE);
// Register all OLE server (factories) as running.
// Also set up for shell open through DDE
// This enables the OLE libraries to create objects from other apps.
// Do not change the calling order here, please, or you may break OLE.
COleTemplateServer::RegisterAll();
EnableShellOpen();
RegisterShellFileTypes();
// Always set that we are an in place server.
COleObjectFactory::UpdateRegistryAll();
// This get's in the way of debugging under nt351 with service pack 4 installed, just don't do it....
m_OleTemplateServer.UpdateRegistry(OAT_INPLACE_SERVER);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// Cleanup our toys and go home
int CNetscapeApp::ExitInstance()
{
// When receiving a WM_ENDSESSION, ExitInstance may be entered twice.
// Block the code on the second or more attempts.
// The exact nature happens because the OnIdle code in the app detects
// a lack of all contexts and sends a redundant close message to
// the application's hidden frame, even though this is already
// done by the hidden frame (m_pMainWnd) when it receives the
// WM_ENDSESSION message.
static int iExitCounter = -1;
iExitCounter++;
if(iExitCounter != 0) {
TRACE("Blocking %d reduntant call(s) to CNetscapeApp::ExitInstance.\n", iExitCounter);
return(0);
}
//unregister our DDE service and free the ServiceName Handle
if(CDDECMDWrapper::m_dwidInst)
{
DdeNameService(CDDECMDWrapper::m_dwidInst,
CDDECMDWrapper::m_hsz[CDDECMDWrapper::m_ServiceName], NULL,
DNS_UNREGISTER);
DdeFreeStringHandle(CDDECMDWrapper::m_dwidInst,
CDDECMDWrapper::m_hsz[CDDECMDWrapper::m_ServiceName]);
}
//m_bExitStatus - Used to detect exit status from second instance.
m_bExitStatus = TRUE;
// Tell the slave window that we are exiting.
// Anyone observing the event will deregister themselves.
slavewnd.WindowProc(SLAVE_EXITINSTANCE, 0, 0);
TRACE("CNetscapeApp::ExitInstance entered\n");
if (!m_strStubFile.IsEmpty())
remove(m_strStubFile);
#ifdef MOZ_TASKBAR
// Save Task Bar state
m_TaskBarMgr.SavePrefs();
#endif /* MOZ_TASKBAR */
WFE_DestroyUIPalette();
WFE_DestroyBitmapMap();
WFE_DestroyUIFont();
#ifdef EDITOR
WFE_ExitComposer();
#endif // EDITOR
#ifdef XP_WIN32
#ifdef EDITOR
// Tell Site Manager we are going away
if ( pITalkSMClient != NULL ) {
delete ( pITalkSMClient );
#if 0
TALK_UnregisterApp();
#endif
}
#endif // EDITOR
#endif // XP_WIN32
// Shutdown RDF
RDF_Shutdown();
SHUTDOWN_np();
// Unload any remaining images.
IL_Shutdown();
// shut down exchange if enabled
FEU_CloseMapiLibrary();
// Write out our list of trusted applications.
if( m_pSpawn ) {
delete m_pSpawn;
}
GH_SaveGlobalHistory();
GH_FreeGlobalHistory();
#ifdef MOZ_MAIL_NEWS
// write out newsrc stuff
NET_SaveNewsrcFileMappings();
#endif /* MOZ_MAIL_NEWS */
// cleanup intenal file type stuff
fe_CleanupFileFormatTypes();
PREF_SavePrefFile();
NR_ShutdownRegistry();
#ifdef MOZ_SMARTUPDATE
SU_Shutdown();
#endif
// Save certs and keys early, since if they are lost the user is screwed
SECNAV_Shutdown();
#ifdef MOZ_NGLAYOUT
XP_ASSERT(0);
#else
// Shut down mocha.
ET_FinishMocha();
#endif /* MOZ_NGLAYOUT */
BOOL javaShutdownSuccessful = fe_ShutdownJava();
if(!m_pCacheDir.IsEmpty())
NET_CleanupCacheDirectory((char *)(const char *)m_pCacheDir, CACHE_PREFIX);
NET_ShutdownNetLib();
#ifdef MOZ_MAIL_NEWS
#ifndef MOZ_LITE
if (m_pABook)
AB_CloseAddressBook(&m_pABook);
#endif
WFE_MSGShutdown();
#endif /* MOZ_MAIL_NEWS */
#ifdef MOZ_LDAP
DIR_DeleteServerList(m_directories);
#endif /* MOZ_LDAP */
PREF_Cleanup();
POSITION pos;
CString key;
CDNSObj * obj;
// Iterate through the entire map
for( pos = DNSCacheMap.GetStartPosition(); pos != NULL; )
{
DNSCacheMap.GetNextAssoc( pos, key, (CObject *&)obj );
if (obj) delete obj;
}
// delete cached memory CDCs
if(pIconDC)
delete pIconDC;
if(pImageDC)
delete pImageDC;
// save the page setup options
SavePageSetupOptions();
// Resource cleanup
if(m_CmdLineLoadURL)
XP_FREE(m_CmdLineLoadURL);
// Delete any temp files we have created
FE_DeleteTempFilesNow();
// Unload PE MUC dll
if ((UINT)m_hPEInst > 32)
FreeLibrary(m_hPEInst);
// Unload resource dll
if ((UINT)m_hResInst > 32)
FreeLibrary(m_hResInst);
// Free memory used for WideAPI(Unicode) conversion
#ifdef XP_WIN32
if (theApp.m_bUseUnicodeFont && CIntlWin::m_wConvBuf)
free(CIntlWin::m_wConvBuf);
#else
Ctl3dUnregister(m_hInstance);
#endif
// Free off various allocated memory.
if(XP_AppName) {
XP_FREE(XP_AppName);
XP_AppName = NULL;
}
if(XP_AppCodeName) {
XP_FREE(XP_AppCodeName);
XP_AppCodeName = NULL;
}
if(XP_AppVersion) {
XP_FREE(XP_AppVersion);
XP_AppVersion = NULL;
}
if(XP_AppLanguage) {
XP_FREE(XP_AppLanguage);
XP_AppLanguage = NULL;
}
// Finally, do our OLE shutdown notifications.
COleRegistry::Shutdown();
// DDE is hosed on Windows95 October 94 release. Allow the user to turn it off.
// If we never turned it on don't turn it off now.
if(GetProfileString("Main", "DDE Hosed", "no") == "no") {
extern void DDEShutdown(void);
DDEShutdown();
}
WSACleanup();
// clean up the font cache here.
XP_List *theList = m_appFontList;
NsWinFont* theFont;
int count = XP_ListCount(theList);
for (int i = 0; i < count; i++) {
theFont = (NsWinFont*)XP_ListRemoveTopObject (theList);
::DeleteObject(theFont->hFont);
XP_DELETE( theFont);
}
XP_ListDestroy(theList);
// Delete our custom images in NavCenter (Dave H.)
CHTFEData::FlushIconInfo();
//
// Free all resources allocated by NSPR...
//
#if !defined(_WIN32)
PRCleanup()
#endif
if (theApp.m_bNetworkProfile) {
// if we have a network profile command-line we are assuming delete on exit (for now)
CString pTempDir;
int ret;
XP_StatStruct statinfo;
if(getenv("TEMP"))
pTempDir = getenv("TEMP"); // environmental variable
if (pTempDir.IsEmpty() && getenv("TMP"))
pTempDir = getenv("TMP"); // How about this environmental variable?
if (pTempDir.IsEmpty()) {
// Last resort: put it in the windows directory
char path[_MAX_PATH];
GetWindowsDirectory(path, sizeof(path));
pTempDir = path;
}
pTempDir += "\\nstmpusr";
ret = _stat((char *)(const char *)pTempDir, &statinfo);
if (ret == 0) {
XP_RemoveDirectoryRecursive(pTempDir, xpURL);
}
}
TRACE("CNetscapeApp::ExitInstance leaving\n");
#if defined( _DEBUG) && defined( XP_WIN32 )
if (m_pi.hProcess) {
TerminateProcess(m_pi.hProcess, 0);
CloseHandle(m_pi.hProcess);
}
#endif
return(CWinApp::ExitInstance());
}