macshell.cp

来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· CP 代码 · 共 294 行

CP
294
字号
/* * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ *  * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. *  * The Original Code is the Netscape security libraries. *  * The Initial Developer of the Original Code is Netscape * Communications Corporation.  Portions created by Netscape are  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All * Rights Reserved. *  * Contributor(s): *  * Alternatively, the contents of this file may be used under the * terms of the GNU General Public License Version 2 or later (the * "GPL"), in which case the provisions of the GPL are applicable  * instead of those above.  If you wish to allow use of your  * version of this file only under the terms of the GPL and not to * allow others to use your version of this file under the MPL, * indicate your decision by deleting the provisions above and * replace them with the notice and other provisions required by * the GPL.  If you do not delete the provisions above, a recipient * may use your version of this file under either the MPL or the * GPL. *//* * See <http://developer.apple.com/technotes/tn/tn1070.html> for information about BOAs * */ #include <AppleEvents.h>#include <Gestalt.h>#include <Errors.h>#include <LowMem.h>#include "prthread.h"#include "prinit.h"#include "prlog.h"#include "serv.h"#include "dataconn.h"#include "macshell.h"#define kSleepMax	20static PRBool	 	gQuitFlag;static long 		gSleepVal;//----------------------------------------------------------------------------PRBool GetQuitFlag(){	return gQuitFlag;}//----------------------------------------------------------------------------void SetQuitFlag(PRBool quitNow){	gQuitFlag = quitNow;}// Apple event handlers to be installed//----------------------------------------------------------------------------static pascal OSErr DoAEOpenApplication(AppleEvent * theAppleEvent, AppleEvent * replyAppleEvent, long refCon){    return noErr;}//----------------------------------------------------------------------------static pascal OSErr DoAEOpenDocuments(AppleEvent * theAppleEvent, AppleEvent * replyAppleEvent, long refCon){    return errAEEventNotHandled;}//----------------------------------------------------------------------------static pascal OSErr DoAEPrintDocuments(AppleEvent * theAppleEvent, AppleEvent * replyAppleEvent, long refCon){    return errAEEventNotHandled;}//----------------------------------------------------------------------------static pascal OSErr DoAEQuitApplication(AppleEvent * theAppleEvent, AppleEvent * replyAppleEvent, long refCon){    gQuitFlag = PR_TRUE;    return noErr;}// install Apple event handlers//----------------------------------------------------------------------------static void InitAppleEventsStuff(void){    OSErr err;	err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, NewAEEventHandlerProc(DoAEOpenApplication), 0, false);	if (err == noErr)		err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, NewAEEventHandlerProc(DoAEOpenDocuments), 0, false);	if (err == noErr)		err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, NewAEEventHandlerProc(DoAEPrintDocuments), 0, false);	if (err == noErr)		err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, NewAEEventHandlerProc(DoAEQuitApplication), 0, false);#if DEBUG	if (err != noErr)		DebugStr("\pInstall event handler failed");#endif}// high-level event dispatching//----------------------------------------------------------------------------static void DoHighLevelEvent(EventRecord * theEventRecPtr){    (void) AEProcessAppleEvent(theEventRecPtr);}#pragma mark -//----------------------------------------------------------------------------// Increase the space allocated for the background only application stack. // // Warning: SetApplLimit always sets the stack to at least as large as the //    default stack for the machine (8K on machines with original QuickDraw, //    24K on machines with Color QuickDraw), so the application partition //    must be large enough to accommodate an appropriate stack and heap. //    Call this only once, at the beginning of the BOA. // // Another warning: //    Don't bother trying to set the stack size to something lower than 24K. //    If SetApplLimit is called to do this, it will silently lower ApplLimit //    to a 24K stack. (The limit is 8K on machines without Color QuickDraw. //    In this sample, we don't allow an increment less than 24K.)static OSErr IncreaseBOAStack(Size additionalStackSize){	OSErr err;	// Check that we aren't running with a corrupt heap. If we are,	// fix the problem.  This was a bug with FBA's before System 7.5.5.	// With System Software later than 7.5.5, this "fix" is harmless.	THz	myZone = GetZone();	if (myZone->bkLim != LMGetHeapEnd())		LMSetHeapEnd(myZone->bkLim);	// Increase the stack size by lowering the heap limit.	SetApplLimit((Ptr) ((unsigned long) GetApplLimit() - additionalStackSize));	err = MemError();	if (err == noErr) MaxApplZone();	return err;}   //----------------------------------------------------------------------------static void MemoryInit(long numMasterBlocks){	IncreaseBOAStack(1024 * 64);		for (long i = 0; i < numMasterBlocks; i ++)		MoreMasters();}#pragma mark -//----------------------------------------------------------------------------static void DoIdleProcessing(){	PR_Sleep(PR_INTERVAL_NO_WAIT); // give time to NSPR threads}//----------------------------------------------------------------------------static OSErr HandleOneEvent(){	EventRecord	theEvent;	Boolean		gotEvent;	OSErr			err = noErr;	// tweak the sleep time depending on whether cartman is doing anything or not		gSleepVal = AreConnectionsActive() ? 0 : kSleepMax;	gotEvent = WaitNextEvent(everyEvent, &theEvent, gSleepVal, nil);	if (gotEvent)	{		switch (theEvent.what)		{			case kHighLevelEvent:				DoHighLevelEvent(&theEvent);				break;		}	}	else	{		DoIdleProcessing();	}	return noErr;}//----------------------------------------------------------------------------static void DoApplicationCleanup(){		SSM_KillAllThreads();}// this is in main.cextern void RunMacPSM(void *);//----------------------------------------------------------------------------static PRIntn DoMainEventLoop(PRIntn argc, char **argv){  SSM_CreateAndRegisterThread(PR_USER_THREAD, 							RunMacPSM, 							NULL, 							PR_PRIORITY_NORMAL,							PR_LOCAL_THREAD,							PR_UNJOINABLE_THREAD, 0);	// let's let NSPR threads start off	PR_Sleep(PR_INTERVAL_NO_WAIT); // give time to NSPR threads	// main event loop	while (!gQuitFlag)	{		OSErr	err = HandleOneEvent();			}	DoApplicationCleanup();	return 0;}//----------------------------------------------------------------------------static void DoApplicationSetup(){	char *fakeArgv[] = { NULL, NULL };		// do we need to add the application name in argv[0] ?	PR_Initialize(DoMainEventLoop, 0, fakeArgv, 0);}#pragma mark -//----------------------------------------------------------------------------void main(void){	// initialize QuickDraw globals. This is the only Toolbox init that we	// should do for an FBA	InitGraf(&qd.thePort);	MemoryInit(10);	// initialize application globals	gQuitFlag = PR_FALSE;	gSleepVal = kSleepMax;	// is the Apple Event Manager available?	long		gestResponse;	Boolean	haveAppleEvents;	OSErr err = Gestalt(gestaltAppleEventsAttr, &gestResponse);	if (err == noErr && (gestResponse & (1 << gestaltAppleEventsPresent)) != 0)		haveAppleEvents = true;			if (!haveAppleEvents) return;	// install Apple event handlers	InitAppleEventsStuff();	// setup the app. This calls into NSPR, which calls our DoMainEventLoop() function.	DoApplicationSetup();}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?