macshell.cp
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:8k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are 
  16.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above.  If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  */
  33. /*
  34.  * See <http://developer.apple.com/technotes/tn/tn1070.html> for information about BOAs
  35.  *
  36.  */
  37.  
  38. #include <AppleEvents.h>
  39. #include <Gestalt.h>
  40. #include <Errors.h>
  41. #include <LowMem.h>
  42. #include "prthread.h"
  43. #include "prinit.h"
  44. #include "prlog.h"
  45. #include "serv.h"
  46. #include "dataconn.h"
  47. #include "macshell.h"
  48. #define kSleepMax 20
  49. static PRBool   gQuitFlag;
  50. static long  gSleepVal;
  51. //----------------------------------------------------------------------------
  52. PRBool GetQuitFlag()
  53. {
  54. return gQuitFlag;
  55. }
  56. //----------------------------------------------------------------------------
  57. void SetQuitFlag(PRBool quitNow)
  58. {
  59. gQuitFlag = quitNow;
  60. }
  61. // Apple event handlers to be installed
  62. //----------------------------------------------------------------------------
  63. static pascal OSErr DoAEOpenApplication(AppleEvent * theAppleEvent, AppleEvent * replyAppleEvent, long refCon)
  64. {
  65.     return noErr;
  66. }
  67. //----------------------------------------------------------------------------
  68. static pascal OSErr DoAEOpenDocuments(AppleEvent * theAppleEvent, AppleEvent * replyAppleEvent, long refCon)
  69. {
  70.     return errAEEventNotHandled;
  71. }
  72. //----------------------------------------------------------------------------
  73. static pascal OSErr DoAEPrintDocuments(AppleEvent * theAppleEvent, AppleEvent * replyAppleEvent, long refCon)
  74. {
  75.     return errAEEventNotHandled;
  76. }
  77. //----------------------------------------------------------------------------
  78. static pascal OSErr DoAEQuitApplication(AppleEvent * theAppleEvent, AppleEvent * replyAppleEvent, long refCon)
  79. {
  80.     gQuitFlag = PR_TRUE;
  81.     return noErr;
  82. }
  83. // install Apple event handlers
  84. //----------------------------------------------------------------------------
  85. static void InitAppleEventsStuff(void)
  86. {
  87.     OSErr err;
  88. err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, NewAEEventHandlerProc(DoAEOpenApplication), 0, false);
  89. if (err == noErr)
  90. err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, NewAEEventHandlerProc(DoAEOpenDocuments), 0, false);
  91. if (err == noErr)
  92. err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, NewAEEventHandlerProc(DoAEPrintDocuments), 0, false);
  93. if (err == noErr)
  94. err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, NewAEEventHandlerProc(DoAEQuitApplication), 0, false);
  95. #if DEBUG
  96. if (err != noErr)
  97. DebugStr("pInstall event handler failed");
  98. #endif
  99. }
  100. // high-level event dispatching
  101. //----------------------------------------------------------------------------
  102. static void DoHighLevelEvent(EventRecord * theEventRecPtr)
  103. {
  104.     (void) AEProcessAppleEvent(theEventRecPtr);
  105. }
  106. #pragma mark -
  107. //----------------------------------------------------------------------------
  108. // Increase the space allocated for the background only application stack.
  109.  //
  110.  // Warning: SetApplLimit always sets the stack to at least as large as the
  111.  //    default stack for the machine (8K on machines with original QuickDraw,
  112.  //    24K on machines with Color QuickDraw), so the application partition
  113.  //    must be large enough to accommodate an appropriate stack and heap.
  114.  //    Call this only once, at the beginning of the BOA.
  115.  //
  116.  // Another warning:
  117.  //    Don't bother trying to set the stack size to something lower than 24K.
  118.  //    If SetApplLimit is called to do this, it will silently lower ApplLimit
  119.  //    to a 24K stack. (The limit is 8K on machines without Color QuickDraw.
  120.  //    In this sample, we don't allow an increment less than 24K.)
  121. static OSErr IncreaseBOAStack(Size additionalStackSize)
  122. {
  123. OSErr err;
  124. // Check that we aren't running with a corrupt heap. If we are,
  125. // fix the problem.  This was a bug with FBA's before System 7.5.5.
  126. // With System Software later than 7.5.5, this "fix" is harmless.
  127. THz myZone = GetZone();
  128. if (myZone->bkLim != LMGetHeapEnd())
  129. LMSetHeapEnd(myZone->bkLim);
  130. // Increase the stack size by lowering the heap limit.
  131. SetApplLimit((Ptr) ((unsigned long) GetApplLimit() - additionalStackSize));
  132. err = MemError();
  133. if (err == noErr) MaxApplZone();
  134. return err;
  135. }
  136.    
  137. //----------------------------------------------------------------------------
  138. static void MemoryInit(long numMasterBlocks)
  139. {
  140. IncreaseBOAStack(1024 * 64);
  141. for (long i = 0; i < numMasterBlocks; i ++)
  142. MoreMasters();
  143. }
  144. #pragma mark -
  145. //----------------------------------------------------------------------------
  146. static void DoIdleProcessing()
  147. {
  148. PR_Sleep(PR_INTERVAL_NO_WAIT); // give time to NSPR threads
  149. }
  150. //----------------------------------------------------------------------------
  151. static OSErr HandleOneEvent()
  152. {
  153. EventRecord theEvent;
  154. Boolean gotEvent;
  155. OSErr err = noErr;
  156. // tweak the sleep time depending on whether cartman is doing anything or not
  157. gSleepVal = AreConnectionsActive() ? 0 : kSleepMax;
  158. gotEvent = WaitNextEvent(everyEvent, &theEvent, gSleepVal, nil);
  159. if (gotEvent)
  160. {
  161. switch (theEvent.what)
  162. {
  163. case kHighLevelEvent:
  164. DoHighLevelEvent(&theEvent);
  165. break;
  166. }
  167. }
  168. else
  169. {
  170. DoIdleProcessing();
  171. }
  172. return noErr;
  173. }
  174. //----------------------------------------------------------------------------
  175. static void DoApplicationCleanup()
  176. {
  177. SSM_KillAllThreads();
  178. }
  179. // this is in main.c
  180. extern void RunMacPSM(void *);
  181. //----------------------------------------------------------------------------
  182. static PRIntn DoMainEventLoop(PRIntn argc, char **argv)
  183. {
  184.   SSM_CreateAndRegisterThread(PR_USER_THREAD, 
  185. RunMacPSM, 
  186. NULL, 
  187. PR_PRIORITY_NORMAL,
  188. PR_LOCAL_THREAD,
  189. PR_UNJOINABLE_THREAD, 0);
  190. // let's let NSPR threads start off
  191. PR_Sleep(PR_INTERVAL_NO_WAIT); // give time to NSPR threads
  192. // main event loop
  193. while (!gQuitFlag)
  194. {
  195. OSErr err = HandleOneEvent();
  196. }
  197. DoApplicationCleanup();
  198. return 0;
  199. }
  200. //----------------------------------------------------------------------------
  201. static void DoApplicationSetup()
  202. {
  203. char *fakeArgv[] = { NULL, NULL }; // do we need to add the application name in argv[0] ?
  204. PR_Initialize(DoMainEventLoop, 0, fakeArgv, 0);
  205. }
  206. #pragma mark -
  207. //----------------------------------------------------------------------------
  208. void main(void)
  209. {
  210. // initialize QuickDraw globals. This is the only Toolbox init that we
  211. // should do for an FBA
  212. InitGraf(&qd.thePort);
  213. MemoryInit(10);
  214. // initialize application globals
  215. gQuitFlag = PR_FALSE;
  216. gSleepVal = kSleepMax;
  217. // is the Apple Event Manager available?
  218. long gestResponse;
  219. Boolean haveAppleEvents;
  220. OSErr err = Gestalt(gestaltAppleEventsAttr, &gestResponse);
  221. if (err == noErr && (gestResponse & (1 << gestaltAppleEventsPresent)) != 0)
  222. haveAppleEvents = true;
  223. if (!haveAppleEvents) return;
  224. // install Apple event handlers
  225. InitAppleEventsStuff();
  226. // setup the app. This calls into NSPR, which calls our DoMainEventLoop() function.
  227. DoApplicationSetup();
  228. }