(FILECREATED "27-Jun-86 22:53:17" {QV}<NOTECARDS>1.3K>KIRKPATCH012.;1 9628   

      changes to:  (VARS KIRKPATCH012COMS)
		   (FNS NCNoteFileTitleMiddleButtonFn))


(* Copyright (c) 1986 by Xerox Corporation. All rights reserved.)

(PRETTYCOMPRINT KIRKPATCH012COMS)

(RPAQQ KIRKPATCH012COMS ((* * Changed fn from NCDATABASE)
			   (FNS NC.OpenDatabaseFile)))
(* * Changed fn from NCDATABASE)

(DEFINEQ

(NC.OpenDatabaseFile
  (LAMBDA (NoteFileOrFileName Access Don'tCacheTypesAndTitlesFlg QuietFlg Don'tCreateFlg 
			      Convertw/oConfirmFlg Don'tCreateArrayFlg Don'tTruncateFlg 
			      Don'tCreateInterfaceFlg Don'tGetSpecialCardsFlg InterestedWindow)
                                                             (* kirk: "27-Jun-86 21:55")

          (* * Open an already existing NoteFile and return a NoteFile object)



          (* * rht 8/7/84: For nonexistent files, asks user whether to create unless Don'tCreateFlg is non-nil.)



          (* * rht 1/9/85: Checks NC.UncachingNotCompleted global var. If non-nil, then previous notefile died unnaturally, 
	  so we first clear junk off the IDs.)



          (* * rht 8/6/85: Added Don'tTruncateFlg, which, if on, prevents the check for truncation.)



          (* * fgh 10/16/85 Updated to use new cacheing scheme.)



          (* * kirk 10/29/85: Now does cacheing of types and titles as background process.)



          (* * fkr 11/8/85: Converted from Streams to NoteFile object.)



          (* * kirk 30Nov85 Added a check for correct version number.)



          (* * rht 12/6/85: Moved Kirk's above patch to NC.CheckForNeededConversion and modified somewhat.
	  Added check for plausible header.)



          (* * rht 1/8/86: Now reuses old notefile object if there is one for this filename.)



          (* * fgh 1/13/86: Fixed bug with returning File Name with embedded call to CreateDatabaseFile.
	  Now just calls OpenDatabaseFile recursively using result of CreateDatabaseFile.)



          (* * fgh 1/16/86 Folded the cacheing of the special cards into BuildHashArray instead of making it a separate 
	  function after the hash array is already read in.)



          (* * kirk 20Jan86 Added NC.AskYesOrNo and InterestedWindow for prompt)



          (* * fgh 5/2/86 Implemented before and after opening hooks using NC.OpenNoteFileFns global variable.)



          (* * fgh 6/8/86 Added code to insure that two files with SameUIDP would never be open at once.)



          (* * kirk 27Jun86 Now calls NC.SetUpNoteFileInterface if already OPEN)


    (PROG (NoteFile FileName Name Stream NewStream Card CardTotal)
	    (OR Access (SETQ Access (QUOTE BOTH)))
	    (SETQ FileName (COND
		((type? NoteFile NoteFileOrFileName)
		  (SETQ NoteFile NoteFileOrFileName)
		  (fetch (NoteFile FullFileName) of NoteFileOrFileName))
		(T NoteFileOrFileName)))
	    (if (NOT (OR FileName (SETQ FileName (NC.DatabaseFileName 
								      "Name of NoteFile to open:"
										" -- " T NIL NIL 
										InterestedWindow))))
		then (RETURN NIL))
	    (if (OPENP FileName)
		then (NC.SetUpNoteFileInterface NoteFile)
		       (NC.PrintMsg NIL T FileName " is an already open file." (CHARACTER 13))
		       (RETURN NIL))
	    (if (NOT (SETQ Name (INFILEP FileName)))
		then (COND
			 (Don'tCreateFlg (NC.PrintMsg NIL T "Couldn't find NoteFile " FileName "."
							(CHARACTER 13))
					 (RETURN NIL))
			 ((NC.AskYesOrNo (CONCAT "Unable to find NoteFile " FileName "."
						     (CHARACTER 13)
						     "Want to create a new NoteFile by that name? ")
					   " -- " "Yes" T (NC.AttachPromptWindow InterestedWindow))
			   (SETQ NoteFile (NC.CreateDatabaseFile FileName NIL "Opening NoteFile" 
								     T))
			   (if (NOT (type? NoteFile NoteFile))
			       then (NC.PrintMsg NIL T "Unable to create Notefile " FileName "."
						     (CHARACTER 13))
				      (RETURN NIL)
			     else (RETURN (NC.OpenDatabaseFile NoteFile Access 
								     Don'tCacheTypesAndTitlesFlg 
								     QuietFlg Don'tCreateFlg 
								     Convertw/oConfirmFlg 
								     Don'tCreateArrayFlg 
								     Don'tTruncateFlg 
								     Don'tCreateInterfaceFlg 
								     Don'tGetSpecialCardsFlg))))
			 (T (RETURN NIL))))

          (* * Run through OpenNoteFileFns with param of BEFORE. Exit if any returns DON'T)


	    (if (for Function in NC.OpenNoteFileFns thereis
							   (OR (EQ Function (QUOTE DON'T))
								 (EQ (QUOTE DON'T)
								       (APPLY* Function Name 
										 NoteFile
										 (QUOTE BEFORE)))))
		then (RETURN NIL))

          (* * Open the file)


	    (OR QuietFlg (NC.PrintMsg NIL T "Opening ... " (CHARACTER 13)))
	    (if (NULL (SETQ Stream (CAR (ERSETQ (OPENSTREAM Name Access (QUOTE OLD)
									(QUOTE ((TYPE BINARY))))))))
		then (NC.PrintMsg NIL T "Couldn't open " FileName "." (CHARACTER 13))
		       (RETURN NIL))                       (* Use existing notefile object if there is one for 
							     this file name.)
	    (OR (type? NoteFile NoteFile)
		  (SETQ NoteFile (OR (NC.NoteFileFromFileName FileName)
					 (create NoteFile))))
	    (replace (NoteFile Stream) of NoteFile with Stream)
	    (replace (NoteFile FullFileName) of NoteFile with (FULLNAME Stream))
	    (NC.SetMonitor NoteFile (CREATE.MONITORLOCK (MKATOM (CONCAT Name ":LOCK"))))
	    (NC.GetNoteFileHeader NoteFile)

          (* * Make sure there is no other open NF with this UID.)


	    (LET (NF)
	         (if (AND (SETQ NF (GETHASH (fetch (NoteFile UID) of NoteFile)
						    NC.NoteFilesHashArray))
			      (NEQ (fetch (NoteFile FullFileName) of NoteFile)
				     (fetch (NoteFile FullFileName) of NF))
			      (NC.NoteFileOpenP NF))
		     then (FLASHW PROMPTWINDOW)
			    (NC.PrintMsg NIL T "Couldn't open " FileName (CHARACTER 13)
					   "because "
					   (fetch (NoteFile FullFileName) of NF)
					   " is already open "
					   (CHARACTER 13)
					   "and has the same UID.")
			    (if (STREAMP (fetch (NoteFile Stream) of NoteFile))
				then (CLOSEF? (fetch (NoteFile Stream) of NoteFile)))
			    (replace (NoteFile Stream) of NoteFile with NIL)
			    (RETURN NIL)))

          (* * See if notefile is out of date. If so, convert to current version.)


	    (if (NOT (NC.CheckForNeededConversion NoteFile Convertw/oConfirmFlg))
		then (CLOSEF (fetch (NoteFile Stream) of NoteFile))
		       (NC.PrintMsg NIL T "Open cancelled.")
		       (RETURN NIL))                       (* See if notefile header seems reasonable.
							     If not, bail out.)
	    (if (NOT (NC.PlausibleNoteFileHeaderP NoteFile))
		then (NC.PrintMsg NIL NIL 
				      "Notefile has bad header.  Please see a NoteCards wizard."
				      (CHARACTER 13)
				      "Open cancelled.")
		       (RETURN NIL))
	    (COND
	      ((NULL Don'tTruncateFlg)                     (* Can either bail out entirely or run inspector and 
							     then bail out.)
		(SELECTQ (SETQ NewStream (NC.CheckForNeededTruncation NoteFile Access))
			   (ABORT (CLOSEF Stream)
				  (NC.PrintMsg NIL T "Open cancelled.")
				  (RETURN NIL))
			   (ABORTANDINSPECT (CLOSEF Stream)
					    (NC.ScavengerPhase1 Name)
					    (RETURN NIL))
			   NIL)
		(AND (STREAMP NewStream)
		       (replace (NoteFile Stream) of NoteFile with NewStream))))

          (* * Stash the notefile in the global notefiles hash array.)


	    (NC.StoreNoteFile NoteFile)

          (* * Build the hash array and cache the special cards if necessary)


	    (OR Don'tCreateArrayFlg (NC.BuildHashArray NoteFile QuietFlg Don'tGetSpecialCardsFlg))
	    (NC.PrintMsg NIL T "Open cancelled.")
	    (OR Don'tGetSpecialCardsFlg (NC.GetSpecialCards NoteFile QuietFlg))

          (* * Make sure the NF can't be closed by CLOSEALL)


	    (WHENCLOSE (fetch (NoteFile Stream) of NoteFile)
			 (QUOTE CLOSEALL)
			 (QUOTE NO))
	    (COND
	      ((NULL Don'tCacheTypesAndTitlesFlg)          (* Cache all of the titles in this database)
		(replace (NoteFile CachingProcess) of NoteFile
		   with (ADD.PROCESS (LIST (FUNCTION NC.CacheTypesAndTitles)
						 NoteFile)))))
	    (COND
	      ((NULL Don'tCreateInterfaceFlg)              (* Make an interface menu for this notefile.)
		(NC.SetUpNoteFileInterface NoteFile)))
	    (AND (NULL QuietFlg)
		   (NC.PrintMsg NIL T "Opened " (FULLNAME Stream)
				  (CHARACTER 13)))
	    (SETQ NC.LastNoteFileOpened NoteFile)

          (* * Run through OpenNoteFIleFns with param of AFTER. Stop if any returns DON'T)


	    (for Function in NC.OpenNoteFileFns thereis (EQ (QUOTE DON'T)
								    (APPLY* Function Name NoteFile
									      (QUOTE AFTER))))

          (* * return the opened NF)


	    (RETURN NoteFile))))
)
(PUTPROPS KIRKPATCH012 COPYRIGHT ("Xerox Corporation" 1986))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (409 9545 (NC.OpenDatabaseFile 419 . 9543)))))
STOP