mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-15 11:13:29 +00:00
2138 lines
66 KiB
C++
2138 lines
66 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);
|
|
void STARTUP_cvffc(void);
|
|
void SHUTDOWN_cvffc(void);
|
|
#ifdef MOZ_LOC_INDEP
|
|
void STARTUP_li(void);
|
|
void SHUTDOWN_li(void);
|
|
#endif/* MOZ_LOC_INDEP */
|
|
|
|
#include "jri.h"
|
|
|
|
#define XP_CPLUSPLUS // temporary hack - jsw
|
|
//#include "secnav.h"
|
|
|
|
// XP Includes
|
|
#include "prefapi.h"
|
|
#include "NSReg.h"
|
|
|
|
#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"
|
|
// Full Circle stuff - see http://www.fullsoft.com for more info
|
|
#include "fullsoft.h"
|
|
|
|
#ifdef 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 _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" {
|
|
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);
|
|
#ifndef NSPR20
|
|
extern "C" PR_PUBLIC_API(void) PR_Shutdown(void);
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
*
|
|
* 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;
|
|
|
|
//#ifdef MOZ_NETSCAPE_FONT_MODULE
|
|
// the only one object of CNetscapeFontModule
|
|
CNetscapeFontModule theGlobalNSFont;
|
|
//#endif // MOZ_NETSCAPE_FONT_MODULE
|
|
|
|
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;
|
|
|
|
// Full Circle initialization
|
|
FCInitialize();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
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;
|
|
XP_Bool 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;
|
|
|
|
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;
|
|
|
|
SECNAV_InitConfigObject();
|
|
|
|
/*
|
|
** Registry startup has to happen before profile stuff because creating a new
|
|
** profile uses the registry.
|
|
*/
|
|
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();
|
|
|
|
// 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();
|
|
|
|
LM_InitMocha();
|
|
|
|
// 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
|
|
|
|
m_pIntlFont = new CIntlFont;
|
|
|
|
int32 csid ;
|
|
if( PREF_GetIntPref("intl.character_set",&csid) != PREF_NOERROR)
|
|
csid = 2;
|
|
|
|
m_iCSID = (int16)csid;
|
|
INTL_ChangeDefaultCharSetID((int16)csid);
|
|
|
|
STARTUP_cvffc();
|
|
|
|
//#ifdef MOZ_NETSCAPE_FONT_MODULE
|
|
VERIFY( FONTERR_OK == theGlobalNSFont.InitFontModule() );
|
|
//#endif MOZ_NETSCAPE_FONT_MODULE
|
|
|
|
// 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;
|
|
|
|
// SECNAV_INIT requires AppCodeName and the first substring in AppVersion
|
|
SECNAV_Init();
|
|
|
|
GH_InitGlobalHistory();
|
|
|
|
NET_RemoveAllCookies();
|
|
NET_ReadCookies("");
|
|
|
|
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
|
|
extern void AskMeDlg(void);
|
|
AskMeDlg();
|
|
#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;
|
|
|
|
// 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;
|
|
|
|
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_blythe) && !defined(DEBUG_warren) && !defined(DEBUG_phil) && !defined(DEBUG_hyatt)
|
|
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"
|
|
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);
|
|
NET_RegisterContentTypeConverter(cp_wild, FO_EMBED, NULL, EmbedStream);
|
|
// 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);
|
|
NET_RegisterContentTypeConverter(INTERNAL_PARSER, FO_PRINT, (void *)&parser_data, PA_BeginParseMDL);
|
|
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
|
|
|
|
|
|
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.
|
|
|
|
|
|
// 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);
|
|
}
|
|
|
|
|
|
// 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 = m_UserDirectory;
|
|
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
|
|
{
|
|
DIR_GetServerPreferences (&m_directories, msg);
|
|
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);
|
|
|
|
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 /* 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();
|
|
|
|
// if PE mode, start up java too!
|
|
#ifdef 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();
|
|
}
|
|
|
|
#ifdef JAVA
|
|
// if PE mode, check if java environment is valid
|
|
if (m_bAccountSetupStartupJava) {
|
|
|
|
JRIEnv * ee = JRI_GetCurrentEnv();
|
|
|
|
if (ee == NULL) {
|
|
|
|
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 && csPrintCommand.IsEmpty())
|
|
{
|
|
int iStartupMode=0;
|
|
BOOL 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.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 (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;
|
|
}
|
|
#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
|
|
{
|
|
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);
|
|
|
|
pFrameWnd->ShowWindow(SW_SHOWMINIMIZED);
|
|
StoreMAPIFrameWnd(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 */
|
|
|
|
#ifdef 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
|
|
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)) || // or invalid data
|
|
m_bKioskMode )) { // or kiosk mode - start browser
|
|
#ifdef EDITOR
|
|
if ( (bIsGold && (iStartupMode & STARTUP_EDITOR)) && !(iStartupMode & STARTUP_BROWSER))
|
|
{ //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
|
|
}
|
|
else
|
|
#endif // EDITOR
|
|
if ((iStartupMode & STARTUP_BROWSER) && !(iStartupMode & STARTUP_EDITOR) )
|
|
{ //start the browser
|
|
theApp.m_ViewTmplate->OpenDocumentFile(NULL);
|
|
CMainFrame *pMainFrame = (CMainFrame *)FEU_GetLastActiveFrame(MWContextBrowser, FALSE);
|
|
if(pMainFrame) pMainFrame->OnLoadHomePage(); //suppose to load what ever was on the command line
|
|
}
|
|
#ifdef EDITOR
|
|
else if ((iStartupMode & STARTUP_BROWSER) && (iStartupMode & STARTUP_EDITOR) )
|
|
{
|
|
//start both of these guys since there preferences were set
|
|
//theApp.m_EditTmplate->OpenDocumentFile(NULL);
|
|
theApp.m_ViewTmplate->OpenDocumentFile(NULL); //open browser window
|
|
CGenericFrame *pFrame = (CGenericFrame *)FEU_GetLastActiveFrame(MWContextBrowser, FALSE);
|
|
if (pFrame){
|
|
CMainFrame *pMainFrame = (CMainFrame*)pFrame;
|
|
pMainFrame->OnLoadHomePage();
|
|
pFrame->OnOpenComposerWindow();
|
|
}
|
|
}
|
|
#endif // EDITOR
|
|
}
|
|
|
|
if(m_pFrameList && m_pFrameList->GetMainContext())
|
|
{
|
|
NET_CheckForTimeBomb(m_pFrameList->GetMainContext()->GetContext());
|
|
}
|
|
|
|
}
|
|
|
|
//--------------------------------------------------------------------
|
|
// 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();
|
|
|
|
#ifdef MOZ_LOC_INDEP
|
|
SHUTDOWN_li();
|
|
#endif /* MOZ_LOC_INDEP */
|
|
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();
|
|
char * prefName = WH_FileName(NULL, xpLIPrefs);
|
|
PREF_SaveLIPrefFile(prefName);
|
|
XP_FREEIF (prefName);
|
|
NR_ShutdownRegistry();
|
|
|
|
// Save certs and keys early, since if they are lost the user is screwed
|
|
SECNAV_Shutdown();
|
|
|
|
// Shut down mocha.
|
|
ET_FinishMocha();
|
|
|
|
|
|
|
|
BOOL javaShutdownSuccessful = fe_ShutdownJava();
|
|
|
|
if(!m_pCacheDir.IsEmpty())
|
|
NET_CleanupCacheDirectory((char *)(const char *)m_pCacheDir, CACHE_PREFIX);
|
|
NET_ShutdownNetLib();
|
|
|
|
#ifdef MOZ_MAIL_NEWS
|
|
if (m_pABook)
|
|
AB_CloseAddressBook(&m_pABook);
|
|
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
|
|
|
|
SHUTDOWN_cvffc();
|
|
// 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)
|
|
#if defined(JAVA) || defined(MOCHA)
|
|
#if defined(NSPR20)
|
|
/*
|
|
* XXX SHould PR_CLeanup be called here?
|
|
*
|
|
* In nspr10 PR_Shutdown unloads all the dlls
|
|
* In nspr20 PR_shutdown is equivalent to the socket shutdown call
|
|
* and implict cleanup unloads the dlls for win16
|
|
*/
|
|
#else
|
|
PR_Shutdown();
|
|
#endif
|
|
#endif
|
|
#endif /* JAVA || MOCHA */
|
|
|
|
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());
|
|
}
|