home *** CD-ROM | disk | FTP | other *** search
- /* -*- 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.
- */
-
- // earlmgr.cp, Mac front end
-
- #include "earlmgr.h"
- // macfe
- #include "ufilemgr.h"
- #include "ulaunch.h"
- #include "uprefd.h"
- #include "uerrmgr.h"
- #include "BufferStream.h"
- #include "uapp.h"
- #include "CNSContext.h"
- // Network
- #ifndef NSPR20
- #include "CNetwork.h"
- #endif
- // Netscape
- #include "secrng.h"
- // utilities
- #include "PascalString.h"
-
- #ifdef JAVA
- extern "C" {
- #include "nsn.h"
- }
- #endif
-
- #include "resgui.h"
-
- #ifdef NSPR20
- PR_BEGIN_EXTERN_C
- PR_EXTERN(PRThread*) PR_GetPrimaryThread(void);
- PR_END_EXTERN_C
- #endif
-
- /*-----------------------------------------------------------------------------
- Earl Manager
- -----------------------------------------------------------------------------*/
-
- EarlManager TheEarlManager;
-
- int EarlManagerNetTicklerCallback(void);
-
- //
- // Construction
- //
-
- EarlManager::EarlManager ()
- {
- fInterruptContext = NULL;
- #if JAVA
- nsn_InstallTickleHookProc(&EarlManagerNetTicklerCallback);
- #endif
- }
-
- //
- // ÑÑ URL loading interface
- //
-
- void EarlManager::DoCancelLoad (MWContext *context)
- {
- // Cancels all loads for a given window
- NET_InterruptWindow (context);
- }
-
- int EarlManager::StartLoadURL (URL_Struct * request, MWContext *context,
- FO_Present_Types output_format)
- {
- if (request->referer && (strlen(request->referer) == 0))
- {
- XP_FREE(request->referer);
- request->referer = NULL;
- }
- int err = NET_GetURL (request, output_format, context, DispatchFinishLoadURL);
- return err;
- }
-
- void EarlManager::SpendTime( const EventRecord& /*inMacEvent*/)
- {
- // Make sure that we only call NET_ProcessNet at an
- // appropriate time, and make sure that our priority is
- // low so that other java threads an run.
-
- #ifndef NSPR20
- // If we don't have a gNetDriver then we better not call it
- if (!gNetDriver)
- return;
-
- PR_SetThreadPriority(PR_CurrentThread(), 0);
- gNetDriver->SpendTime();
- #else
- PR_SetThreadPriority(PR_CurrentThread(), PR_PRIORITY_LOW);
- #endif
-
- unsigned char dst;
- RNG_GenerateGlobalRandomBytes(&dst, 1);
- #ifdef NSPR20_DISABLED
- CSelectObject socketToCallWith;
- if (gNetDriver->CanCallNetlib(socketToCallWith))
- NET_ProcessNet(MacToStdSocketID(socketToCallWith.fID), SocketSelectToFD_Type(socketToCallWith.fType));
- #else
- NET_PollSockets();
- #endif
- if ( fInterruptContext )
- {
- NET_InterruptWindow( fInterruptContext );
- fInterruptContext = NULL;
- }
- }
-
- void EarlManager::InterruptThis(MWContext * context)
- {
- fInterruptContext = context;
- }
-
- void EarlManager::FinishLoadURL(URL_Struct * request, int status, MWContext *context)
- {
- CNSContext* nsContext = ExtractNSContext(context);
- if (nsContext)
- nsContext->CompleteLoad(request, status);
- if (status != MK_CHANGING_CONTEXT)
- NET_FreeURLStruct (request);
- }
-
- void EarlManager::DispatchFinishLoadURL (URL_Struct *request, int status, MWContext *context)
- {
- // let the front end know the NetGetUrl is complete. This should go
- // into NetLib at some point! LAM
-
- TheEarlManager.FinishLoadURL (request, status, context);
- }
-
-
-
-
- /*------------------------------------------------------------------------------
- FE Misc functions
- - Launching of telnet/tn3270 sessions
- ------------------------------------------------------------------------------*/
- // ÑÑ Prototypes
-
- LFileBufferStream * CreateTelnetFile(char * hostname, char * port, char * username);
- LFileBufferStream * CreateTn3270File(char * hostname, char * port, char * username);
-
- // ÑÑ Implementation
-
- LFileBufferStream * CreateTelnetFile(char * hostname, char * port, char * username)
- {
- FSSpec fileSpec;
-
- // Figure out the mime extensions
- CMimeMapper * mime = CPrefs::sMimeTypes.FindMimeType(CMimeList::Telnet);
- if (mime == NULL)
- return NULL;
-
- // Create the file
- LFileBufferStream * file = NULL;
- CFileMgr::UniqueFileSpec( CPrefs::GetTempFilePrototype(),
- CStr31(::GetCString(NETSCAPE_TELNET)), fileSpec);
-
- Try_ { // Not dealing with duplicates yet
- file = new LFileBufferStream(fileSpec);
- file->CreateNewDataFile(mime->GetAppSig(), mime->GetDocType(), 0);
- file->OpenDataFork(fsRdWrPerm);
- }
- Catch_(inErr)
- {
- return NULL;
- } EndCatch_
-
- // Write the arguments out
-
- WriteCString (file, ::GetCString(NETSCAPE_TELNET_NAME_ARG)); // name="user@hostname"
- if (username != NULL)
- {
- WriteCString (file, username);
- WriteChar (file, '@');
- // ErrorManager::PlainAlert(Login as????
- }
- WriteCString (file, hostname);
- WriteCString (file, "\"\r");
- WriteCString (file, ::GetCString(NETSCAPE_TELNET_HOST_ARG)); // host = "hostname"
- WriteCString (file, hostname);
- WriteCString (file, "\"\r");
- WriteCString (file, ::GetCString(NETSCAPE_TELNET_PORT_ARG)); // port = "port"
- if (port != NULL)
- WriteCString (file, port);
- else
- WriteCString (file, "23\r");
- file->CloseDataFork();
- return file;
- }
-
- LFileBufferStream * CreateTn3270File(char * hostname, char * /*port*/, char * /*username*/)
- {
- FSSpec fileSpec;
-
- // Figure out the mime extensions
- CMimeMapper * mime = CPrefs::sMimeTypes.FindMimeType(CMimeList::Tn3270);
- if (mime == NULL)
- return NULL;
-
- // Create the file
- LFileBufferStream * file = NULL;
- CFileMgr::UniqueFileSpec( CPrefs::GetTempFilePrototype(),
- CStr31(::GetCString(NETSCAPE_TN3270)), fileSpec);
-
- Try_ { // Not dealing with duplicates yet
- file = new LFileBufferStream (fileSpec);
- file->CreateNewDataFile(mime->GetAppSig(), mime->GetDocType(), 0);
- file->OpenDataFork(fsRdWrPerm);
- }
- Catch_(inErr)
- {
- return NULL;
- } EndCatch_
-
- // Write the arguments out
- // I really do not know what the format of the file is, so I am just guessing here
- WriteCString (file, "0 8 80 20 40 10 80 0 "); // part 1
- WriteCString (file, hostname);
- // part 2 of indecipherable file format
- WriteCString (file, " 2 1 15 1 1 1 23 0 1 ffff ffff ffff fc00 f37d 52f ffff 7a5d 9f8e 0 c42f eaff 1f21 b793 1431 dd6b 8c2 6a2 4eba 6aea dd6b 0 0 0 2a00 2a00 2a00 24 12 0 1 0 0 4eba 6aea dd6b 1 1 0 default 1 English_(U.S.) 12 80 24 80 System_Alert_Sound 2 19f 142 1 74747874 0"); // part2
- file->CloseDataFork();
- return file;
- }
-
- void FE_ConnectToRemoteHost(MWContext * ctxt, int url_type, char *
- hostname, char * port, char * username)
- {
- LFileBufferStream * telnetFile = NULL;
- switch (url_type) {
- case FE_RLOGIN_URL_TYPE:
- case FE_TELNET_URL_TYPE:
- FE_Progress(ctxt, (char *)GetCString( LAUNCH_TELNET_RESID ));
- telnetFile = CreateTelnetFile(hostname, port, username);
- break;
- case FE_TN3270_URL_TYPE:
- FE_Progress(ctxt, (char *)GetCString( LAUNCH_TN3720_RESID ));
- telnetFile = CreateTn3270File(hostname, port, username);
- }
- if (telnetFile != NULL)
- {
- LaunchFile(telnetFile);
- CFileMgr::sFileManager.RegisterFile(telnetFile); // Register file for deletion
- }
- else
- ErrorManager::PlainAlert(TELNET_ERR_RESID);
- }
-
- /*------------------=----------------------------------------------------------
- Utilities
- --------------------=--------------------------------------------------------*/
-
- CStr255 gSaveAsPrompt;
-
- OSErr GUI_AskForFileSpec (StandardFileReply & reply);
- OSErr GUI_AskForFileSpec (StandardFileReply & reply)
- {
- ErrorManager::PrepareToInteract();
-
- UDesktop::Deactivate();
- if (gSaveAsPrompt.Length() == 0)
- gSaveAsPrompt = (const char*)GetCString( SAVE_AS_RESID );
- StandardPutFile (gSaveAsPrompt, reply.sfFile.name, &reply);
- UDesktop::Activate();
-
- if (!reply.sfGood)
- return userCanceledErr;
- return noErr;
- }
-
- int EarlManagerNetTicklerCallback(void)
- {
- // We need to tickle the network and the UI if we
- // are stuck in java networking code.
-
- if (PR_CurrentThread() == PR_GetPrimaryThread()) {
- (CFrontApp::GetApplication())->ProcessNextEvent();
- return false;
- }
-
- else {
- return true;
- }
- }
-
-
- #ifdef NSPR20_DISABLED
- int SocketSelectToFD_Type(SocketSelect s)
- {
- switch (s) {
- case eReadSocket:
- case eExceptionSocket:
- return NET_SOCKET_FD;
- case eLocalFileSocket:
- return NET_LOCAL_FILE_FD;
- case eEverytimeSocket:
- return NET_EVERYTIME_TYPE;
- }
- return 0; // Never reached
- }
- #endif
-
- // FE Select routines
- void FE_SetReadSelect (MWContext * /* context */, int sd)
- {
- #ifndef NSPR20
- gNetDriver->SetReadSelect(sd);
- #endif
- }
-
- void FE_ClearReadSelect (MWContext */* context */, int sd)
- {
- #ifndef NSPR20
- gNetDriver->ClearReadSelect(sd);
- #endif
- }
-
- void FE_SetConnectSelect (MWContext */* context */, int sd)
- {
- #ifndef NSPR20
- gNetDriver->SetConnectSelect(sd);
- #endif
- }
-
- void FE_ClearConnectSelect(MWContext */* context */, int sd)
- {
- #ifndef NSPR20
- gNetDriver->ClearConnectSelect(sd);
- #endif
- }
-
-
- void FE_SetFileReadSelect (MWContext */* context */, int fd)
- {
- #ifndef NSPR20
- gNetDriver->SetFileReadSelect(fd);
- #endif
- }
-
-
- void FE_ClearFileReadSelect (MWContext */* context */, int fd)
- {
- #ifndef NSPR20
- gNetDriver->ClearFileReadSelect(fd);
- #endif
- }
-
- int FE_StartAsyncDNSLookup (MWContext */* context */, char * host_port, void ** hoststruct_ptr_ptr, int sock)
- {
- #ifndef NSPR20
- *hoststruct_ptr_ptr = NULL;
- int err = gNetDriver->StartAsyncDNSLookup(host_port, (struct hostent **)hoststruct_ptr_ptr, sock);
- if (err == EAGAIN) // Because macsock knows nothing of netlib defines
- return MK_WAITING_FOR_LOOKUP;
- else
- return err;
- #endif
- return MK_WAITING_FOR_LOOKUP;
- }
-
-
- #ifdef PROFILE
- #pragma profile off
- #endif
-
-