(FILECREATED " 4-Sep-86 18:32:25" {QV}<NOTECARDS>1.3K>NEXT>FGHPATCH108.;1 13787  

      changes to:  (VARS FGHPATCH108COMS))


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

(PRETTYCOMPRINT FGHPATCH108COMS)

(RPAQQ FGHPATCH108COMS ((* * For server -- FROM NCDATABASE)
			  (FNS NC.OpenNoteFile)))
(* * For server -- FROM NCDATABASE)

(DEFINEQ

(NC.OpenNoteFile
  (LAMBDA (NoteFileOrFileName NoteFilesHashArray Don'tCacheTypesAndTitlesFlg Don'tCreateFlg 
			      Convertw/oConfirmFlg Don'tCreateArrayFlg Don'tTruncateFlg 
			      Don'tCreateInterfaceFlg Don'tGetSpecialCardsFlg InterestedWindow 
			      PublicOrPrivate Don'tCheckOperationsInProgressFlg MenuPosition QuietFlg 
			      ReadOnlyFlg)                   (* fgh: " 4-Sep-86 18:31")

          (* * fgh 5/23/86 Renamed to NC.OpenNoteFile from NC.OpenDatabaseFile. Total revamp to implement device vector.)



          (* * kef 7/18/86: Inserted a call to stuff the UID into the NoteFile because BuildHashArray needed it.)



          (* * kef 7/21/86: Moved up the install of the NoteFile into the NoteFileHashArray to before the building of the 
	  NoteFile's hash array. The reason is that the remote multi client build hash array function needs to get a list of 
	  UIDs, and in order to do this, it needs to grab a Courier stream for the NoteFile given only the UID.
	  It can only do this if the UID is registered in the NoteFilesHashArray.)



          (* * fgh 8/31/86 Updated to account for changes made to system since 5/23/86 revamp. Changes reimplemented include:
	  (fgh 6/8/86 Added code to insure that two files with SameUIDP would never be open at once.) 
	  (fgh 6/25/86 Added contention locks -- NC.ProtectedNoteFileOperation, Don'tCheckOperationInProgressFlg etc.) 
	  (fgh 6/27/86 Added MenuPsotion arg to pass to SetUpNoteFileInterface) (kirk 15Jul86 Added call to 
	  NC.SetUpNoteFileInterface if already open))



          (* * fgh 9/1/86 Reimplemented ReadOnly NoteFile open.)



          (* * fgh 9/4/86 Put in default for NoteFilesHashArray which is NC.NoteFilesHashArray)


    (DECLARE (GLOBALVARS NC.OpenNoteFileFns NC.LastNoteFileOpened))

          (* * If the value returned is not a NoteFile, let the user know there's been some problem.)


    (PROG (NoteFile FileName ReturnValue CriticalUIDs)

          (* * Figure out the name of the file containing the NoteFile)


	    (if (NULL (SETQ FileName (COND
			      ((type? NoteFile NoteFileOrFileName)
				(fetch (NoteFile FullFileName) of NoteFileOrFileName))
			      (NoteFileOrFileName)
			      (T (NC.DatabaseFileName "Name of NoteFile to open:" " -- " T NIL NIL 
							InterestedWindow)))))
		then (RETURN))                           (* SETQ FileName (OR (FULLNAME FileName) FileName))

          (* * Create a NoteFile object or use existing notefile object if there is one for this file name.)


	    (SETQ NoteFile (if (type? NoteFile NoteFileOrFileName)
				 then NoteFileOrFileName
			       else (OR (NC.NoteFileFromFileName FileName)
					    (create NoteFile))))
	    (replace (NoteFile FullFileName) of NoteFile with FileName)
	    (replace (NoteFile ReadOnlyFlg) of NoteFile with ReadOnlyFlg)

          (* * If there is no interested window, see if the menu window can be used.)


	    (if (AND (NULL InterestedWindow)
			 (fetch (NoteFile Menu) of NoteFile))
		then (SETQ InterestedWindow (WFROMMENU (fetch (NoteFile Menu) of NoteFile)))
		  )

          (* * Figure out the appropriate device vector from the file name.)


	    (NC.InstallDeviceVectorInNoteFile NoteFile PublicOrPrivate)

          (* * If this is an open NoteFIle, just bring up its menu.)


	    (if (NC.NoteFileOpenP NoteFile)
		then (OR Don'tCreateInterfaceFlg (NC.SetUpNoteFileInterface NoteFile 
										  MenuPosition))
                                                             (* bring up or create notefile icon if needed)
		       (RETURN NIL))

          (* * Notify user.)


	    (OR QuietFlg (NC.PrintMsg InterestedWindow T "Opening NoteFile: " FileName " ..."
					  (CHARACTER 13)))

          (* * Check to see if this NoteFile is busy doing something else)


	    (if (AND (NULL Don'tCheckOperationsInProgressFlg)
			 (PROCESSP (NC.NoteFileProp NoteFile (QUOTE ProcessInProgress))))
		then (NC.PrintOperationInProgressMsg InterestedWindow (QUOTE Open% NoteFile)
							 (NC.NoteFileProp NoteFile (QUOTE 
									      OperationInProgress)))
		       (RETURN NIL))

          (* * Run rest of function with contention lock.)


	    (RETURN
	      (NC.ProtectedNoteFileOperation
		NoteFile Open% NoteFile
		(PROG 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 FileName NoteFile
								 (QUOTE BEFORE)))))
			    then (if (WINDOWP InterestedWindow)
				       then (NC.PrintMsg InterestedWindow NIL 
							     "Open aborted for NoteFile "
							     FileName "." (CHARACTER 13)))
				   (RETURN))

          (* * Call the device specific OpenNoteFileFn, which returns a list of special UIDs)


		        (if (NULL (ERSETQ (SETQ ReturnValue (APPLY* (fetch (NoteFile
											 
										   OpenNoteFileFn)
										 of NoteFile)
									      NoteFile 
									      InterestedWindow))))
			    then (SETQ ReturnValue (QUOTE NoteFileOpenFailed)))

          (* * Process error returns from the OpenNoteFileFn)


		        (if (NOT (LITATOM ReturnValue))
			    then 

          (* * OpenNoteFileFn returned correctly)


				   (SETQ CriticalUIDs ReturnValue)
			  else 

          (* * Error, process it.)


				 (SETQ ReturnValue
				   (OR (SELECTQ ReturnValue
						    (NoteFileNotFound (
								  NC.ProcessNoteFileNotFoundError
									NoteFile NoteFilesHashArray 
								      Don'tCacheTypesAndTitlesFlg 
									Don'tCreateFlg 
									Convertw/oConfirmFlg 
									Don'tCreateArrayFlg 
									Don'tTruncateFlg 
									Don'tCreateInterfaceFlg 
									Don'tGetSpecialCardsFlg 
									InterestedWindow 
									PublicOrPrivate 
								Don'tCheckOperationsInProgressFlg 
									MenuPosition QuietFlg 
									ReadOnlyFlg))
						    (NoteFileNeedsConversion (
							   NC.ProcessNoteFileNeedsConversionError
									       NoteFile 
									       NoteFilesHashArray 
								      Don'tCacheTypesAndTitlesFlg 
									       Don'tCreateFlg 
									     Convertw/oConfirmFlg 
									      Don'tCreateArrayFlg 
									       Don'tTruncateFlg 
									  Don'tCreateInterfaceFlg 
									  Don'tGetSpecialCardsFlg 
									       InterestedWindow 
									       PublicOrPrivate 
								Don'tCheckOperationsInProgressFlg 
									       MenuPosition QuietFlg 
									       ReadOnlyFlg))
						    (NoteFileNeedsTruncation (
							   NC.ProcessNoteFileNeedsTruncationError
									       NoteFile 
									       NoteFilesHashArray 
								      Don'tCacheTypesAndTitlesFlg 
									       Don'tCreateFlg 
									     Convertw/oConfirmFlg 
									      Don'tCreateArrayFlg 
									       Don'tTruncateFlg 
									  Don'tCreateInterfaceFlg 
									  Don'tGetSpecialCardsFlg 
									       InterestedWindow 
									       PublicOrPrivate 
								Don'tCheckOperationsInProgressFlg 
									       MenuPosition QuietFlg 
									       ReadOnlyFlg))
						    (NoteFileAlreadyOpen
						      (ERSETQ (NC.ReportError
								  NIL
								  (CONCAT (fetch (NoteFile 
										     FullFileName)
									       of NoteFile)
									    
					    " is already open for exclusive access. Open failed."))))
						    (NoteFileOpenFailed
						      (ERSETQ (NC.ReportError
								  NIL
								  (CONCAT "Open of "
									    (fetch (NoteFile 
										     FullFileName)
									       of NoteFile)
									    
								    " failed for unknown reason."))))
						    (NoteFileHeaderBad
						      (ERSETQ (NC.ReportError
								  NIL
								  (CONCAT "Header of NoteFile "
									    (fetch (NoteFile 
										     FullFileName)
									       of NoteFile)
									    
							  " is bad.  Contact a NoteCards wizard."))))
						    (PROGN (ERSETQ (NC.ReportError
									 NIL
									 (CONCAT 
									   "Unknown error code ("
										   ReturnValue 
						     ") returned by OpenNoteFileFn for NoteFile "
										   FileName)))))
					 ReturnValue))

          (* * notify the user. if there's been a problem)


				 (if (AND (NOT (type? NoteFile ReturnValue))
					      (WINDOWP InterestedWindow))
				     then (NC.PrintMsg InterestedWindow NIL 
							   "Open aborted for NoteFile "
							   FileName "." (CHARACTER 13)))

          (* * return whatever the error processing returned.)


				 (RETURN ReturnValue))
		        (SETQ ReturnValue)

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


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

          (* * If needed, build a hash array by calling the device specific BuilHashArrayFn.)


		        (replace (NoteFile UID) of NoteFile with (fetch (NoteFileCriticalUIDs
										  NoteFile)
									  of CriticalUIDs))

          (* * Store this NoteFile object in the appropriate NoteFile hash array)


		        (NC.StoreNoteFileInHashArray NoteFile (OR NoteFilesHashArray 
								      NC.NoteFilesHashArray))
		        (if (NOT Don'tCreateArrayFlg)
			    then (OR QuietFlg (NC.PrintMsg InterestedWindow T 
								 "Opening NoteFile: "
								 FileName
								 (CHARACTER 13)
								 "Building index array ..."
								 (CHARACTER 13)))
				   (if (OR (NULL (ERSETQ (SETQ ReturnValue
								   (APPLY*
								     (fetch (NoteFile 
										 BuildHashArrayFn)
									of NoteFile)
								     NoteFile QuietFlg 
								     InterestedWindow
								     (CONCAT "Opening NoteFile "
									       (fetch (NoteFile
											  
										     FullFileName)
										  of NoteFile)
									       (CHARACTER 13))))))
					       (NOT (type? NoteFile ReturnValue)))
				       then 

          (* * Error during building of hash array)


					      (ERSETQ (NC.ReportError NIL
									  (CONCAT
									    
							  "Build Hash Array failed for NoteFile "
									    (fetch (NoteFile 
										     FullFileName)
									       of NoteFile)
									    " because " ReturnValue)))
					      (RETURN)))

          (* * Set up critical UIDs in NoteFile object using the values returned from OpenNoteFileFn.)


		        (NC.InstallCriticalUIDsInNoteFile NoteFile CriticalUIDs)

          (* * if needed, cache the special cards)


		        (if (NOT Don'tGetSpecialCardsFlg)
			    then (NC.GetSpecialCards NoteFile QuietFlg InterestedWindow
							 (CONCAT "Opening NoteFile: "
								   (fetch (NoteFile FullFileName)
								      of NoteFile)
								   (CHARACTER 13))))

          (* * If needed, start the titles and types caching process)


		        (if (NOT Don'tCacheTypesAndTitlesFlg)
			    then (replace (NoteFile CachingProcess) of NoteFile
				      with (ADD.PROCESS (LIST (FUNCTION 
								      NC.CacheTypesAndTitles)
								    NoteFile))))

          (* * If needed, open up a NoteFile interface.)


		        (if (NOT Don'tCreateInterfaceFlg)
			    then (NC.SetUpNoteFileInterface NoteFile MenuPosition))

          (* * Record this as the last NF opened.)


		        (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 FileName 
										  NoteFile
										  (QUOTE AFTER))))

          (* * Go home, returning NoteFile)


		        (if (NULL QuietFlg)
			    then (NC.PrintMsg InterestedWindow T "Opening NoteFile: " FileName
						  (CHARACTER 13)
						  "Done."
						  (CHARACTER 13))
				   (DISMISS 100)
				   (NC.ClearMsg InterestedWindow T))
		        (RETURN NoteFile)))))))
)
(PUTPROPS FGHPATCH108 COPYRIGHT ("Xerox Corporation" 1986))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (370 13705 (NC.OpenNoteFile 380 . 13703)))))
STOP