(FILECREATED "13-Mar-87 18:21:15" {QV}<NOTECARDS>1.3K>NEXT>RGPATCH019.;2 19739  

      changes to:  (VARS RGPATCH019COMS)
		   (FNS NC.OpenNoteFile)

      previous date: "13-Mar-87 18:10:04" {QV}<NOTECARDS>1.3K>NEXT>RGPATCH019.;1)


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

(PRETTYCOMPRINT RGPATCH019COMS)

(RPAQQ RGPATCH019COMS ((* * rg 3/13/87 fixed bug introduced into NC.OpenNoteFile)
			 (* * changes to NCDATABASE)
			 (FNS NC.OpenNoteFile NC.CreateNoteFile)))
(* * rg 3/13/87 fixed bug introduced into NC.OpenNoteFile)

(* * changes to NCDATABASE)

(DEFINEQ

(NC.OpenNoteFile
  [LAMBDA (NoteFileOrFileName NoteFilesHashArray Don'tCacheTypesAndTitlesFlg Don'tCreateFlg 
			      ConvertNoConfirmFlg Don'tCreateArrayFlg Can'tTruncateFlg 
			      Don'tCreateInterfaceFlg Don'tGetSpecialCardsFlg InterestedWindow 
			      PublicOrPrivate MenuPosition QuietFlg ReadOnlyFlg 
			      Don'tCheckForTruncationFlg)    (* Randy.Gobbel "13-Mar-87 18:06")

          (* * 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)



          (* * kirk/rht 8/29/86: Now resets Name after conversion from version 2 to version3.)



          (* * rht 10/29/86: Changed "aborted" to "canceled" in message.)



          (* * rht 10/31/86: Added Don'tCheckForTruncationFlg arg.)



          (* * rht&pmi 11/21/86: Took away the protection from around the AFTER call to open events fns.)



          (* * pmi 12/12/86: Added InterestedWindow argument to NC.SetUpNoteFileInterface so that it can print a prompt to 
	  the user about placing the NoteFile menu.)



          (* * rg 3/4/87 Added NC.ProtectedSessionOperation wrapper, removed Don'tCheckOperationsInProgressFlg)


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

          (* * NOTE: Session lock turns into NoteFile lock after NoteFile is created)


    (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)
	    (RETURN
	      (NC.ProtectedNoteFileOperation
		NoteFile "Open NoteFile" InterestedWindow
		(PROG NIL

          (* * 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 
										 InterestedWindow))
                                                             (* bring up or create notefile icon if needed)
				   (RETURN NIL))

          (* * Notify user.)


		        (OR QuietFlg (NC.PrintMsg InterestedWindow T "Opening NoteFile: " 
						      FileName " ..." (CHARACTER 13)))
		        (SETQ ReturnValue
			  (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 canceled for NoteFile "
								       FileName "." (CHARACTER
									 13))
							(NC.ClearMsg InterestedWindow T))
					     (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 
								      Don'tCheckForTruncationFlg]
				      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 ConvertNoConfirmFlg 
								   Don'tCreateArrayFlg 
								   Can'tTruncateFlg 
								   Don'tCreateInterfaceFlg 
								   Don'tGetSpecialCardsFlg 
								   InterestedWindow PublicOrPrivate 
								   MenuPosition QuietFlg ReadOnlyFlg 
								   Don'tCheckForTruncationFlg))
					       (NoteFileNeedsConversion (
							   NC.ProcessNoteFileNeedsConversionError
									  NoteFile NoteFilesHashArray 
								      Don'tCacheTypesAndTitlesFlg 
									  Don'tCreateFlg 
									  ConvertNoConfirmFlg 
									  Don'tCreateArrayFlg 
									  Can'tTruncateFlg 
									  Don'tCreateInterfaceFlg 
									  Don'tGetSpecialCardsFlg 
									  InterestedWindow 
									  PublicOrPrivate 
									  MenuPosition QuietFlg 
									  ReadOnlyFlg 
								       Don'tCheckForTruncationFlg))
					       (NoteFileNeedsTruncation (
							   NC.ProcessNoteFileNeedsTruncationError
									  NoteFile NoteFilesHashArray 
								      Don'tCacheTypesAndTitlesFlg 
									  Don'tCreateFlg 
									  ConvertNoConfirmFlg 
									  Don'tCreateArrayFlg 
									  Can'tTruncateFlg 
									  Don'tCreateInterfaceFlg 
									  Don'tGetSpecialCardsFlg 
									  InterestedWindow 
									  PublicOrPrivate 
									  MenuPosition QuietFlg 
									  ReadOnlyFlg 
								       Don'tCheckForTruncationFlg))
					       [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 canceled for NoteFile "
							       FileName "." (CHARACTER 13))
						(NC.ClearMsg InterestedWindow T))

          (* * 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)
						  (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 
									  InterestedWindow))

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


			          (SETQ NC.LastNoteFileOpened NoteFile)
			          (RETURN NoteFile)))
		        (if (type? NoteFile ReturnValue)
			    then 

          (* * 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))
					      (NC.ClearMsg InterestedWindow T))
				   (RETURN NoteFile)
			  else 

          (* * Bail out if open was unsuccessful.)


				 (RETURN NIL])

(NC.CreateNoteFile
  [LAMBDA (NoteFileOrFileName SizeInCards Don'tCreateSpecialCards InterestedWindow OperationMsg 
			      QuietFlg PublicOrPrivate)      (* Randy.Gobbel " 6-Mar-87 12:35")

          (* * Create a NoteFile. Most of the work should be done by the device specific create notefile fn.)



          (* * fgh 9/1/86 First created.)



          (* * fgh&rht 9/5/86: Now creates small temporary hash array.)


    (LET (NoteFile NoteFileName ReturnValue)

          (* * Get the name from the user if necessary.)


         [SETQ NoteFileName (if (type? NoteFile NoteFileOrFileName)
				  then (fetch (NoteFile FullFileName) of NoteFileOrFileName)
				else (OR NoteFileOrFileName (NC.DatabaseFileName 
						    "What is the name of the file to be created?"
										       " -- " T T NIL 
										 InterestedWindow]
         (if (NULL NoteFileName)
	     then (QUOTE CreateCancelled)
	   else 

          (* * Create a NoteFile object with a UID, etc.)


		  [SETQ NoteFile (if (type? NoteFile NoteFileOrFileName)
				       then NoteFileOrFileName
				     else (OR (NC.NoteFileFromFileName NoteFileName)
						  (create NoteFile]
		  (replace (NoteFile UID) of NoteFile with (NC.MakeUID))
		  (replace (NoteFile MonitorLock) of NoteFile with (CREATE.MONITORLOCK
									   (QUOTE 
									       Creating% NoteFile)))
		  (replace (NoteFile FullFileName) of NoteFile with NoteFileName)
		  (replace (NoteFile ReadOnlyFlg) of NoteFile with NIL) 

          (* * only a small hash array for creating a file.)


		  [replace (NoteFile HashArray) of NoteFile
		     with (NC.CreateUIDHashArray (CONSTANT (LENGTH (RECORDFIELDNAMES
									     (QUOTE 
									     NoteFileCriticalUIDs]

          (* * Install the appropriate device vector)


		  (NC.InstallDeviceVectorInNoteFile NoteFile PublicOrPrivate) 

          (* * Say something to the user.)


		  (OR QuietFlg (NC.PrintMsg InterestedWindow T (OR OperationMsg "")
						"Creating NoteFile " NoteFileName 
						".  Please wait...  "))

          (* * Call the device specific create notefile fn.)


		  (if [type? NoteFile (SETQ ReturnValue
				   (CAR (ERSETQ (APPLY* (fetch (NoteFile CreateNoteFileFn)
								 of NoteFile)
							      NoteFile SizeInCards InterestedWindow 
							      OperationMsg QuietFlg]
		      then 

          (* * Device specific Create NoteFile fn returned okay. Go an an create the special cards.)


			     (if Don'tCreateSpecialCards
			       else (replace (NoteFile NextIndexNum) of NoteFile with 1)
				      (NC.InitializeSpecialCards NoteFile))

          (* * Checkpoint the NF, then close it and return the NF objet.)


			     (NC.CheckpointNoteFile NoteFile QuietFlg T InterestedWindow 
						      OperationMsg)
			     (if [type? NoteFile (SETQ ReturnValue
					      (CAR (ERSETQ (APPLY* (fetch (NoteFile 
										  CloseNoteFileFn)
									    of NoteFile)
									 NoteFile SizeInCards 
									 InterestedWindow 
									 OperationMsg QuietFlg]
				 then                      (* Close went okay.)
					(if (NULL QuietFlg)
					    then (NC.PrintMsg InterestedWindow NIL "Done!"
								  (CHARACTER 13))
						   (NC.ClearMsg InterestedWindow T))
                                                             (* Clean out the NF object and "notice it".)
					(create NoteFile smashing NoteFile UID ←
								      (fetch (NoteFile UID)
									 of NoteFile)
								      FullFileName ←
								      (fetch (NoteFile FullFileName)
									 of NoteFile)
								      Menu ← (fetch (NoteFile
											Menu)
										of NoteFile)
								      NoteFileDevice ←
								      (fetch (NoteFile 
										   NoteFileDevice)
									 of NoteFile))
					(NC.StoreNoteFileInHashArray NoteFile NC.NoteFilesHashArray)
                                                             (* Set the DatabaseFileNameSuggestion)
					(SETQ NC.DatabaseFileNameSuggestion
					  (PACKFILENAME (QUOTE VERSION)
							  NIL
							  (QUOTE BODY)
							  (fetch (NoteFile FullFileName)
							     of NoteFile)))
                                                             (* Return the NoteFile.)
					NoteFile
			       else                        (* Problems with closing the NoteFile -- error)
				      (NC.ReportError "NC.CreateNoteFile" (CONCAT 
				       "Could not close nortefile after it was created because: "
										      ReturnValue))
				      ReturnValue)
		    else 

          (* * There was an error in the device specific create notefile fn.)


			   (NC.ReportError "NC.CreateNoteFile" (CONCAT 
							      "Could not create NoteFile due to "
									   ReturnValue " error."))
			   ReturnValue])
)
(PUTPROPS RGPATCH019 COPYRIGHT ("Xerox Corporation" 1987))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (604 19658 (NC.OpenNoteFile 614 . 14524) (NC.CreateNoteFile 14526 . 19656)))))
STOP