(FILECREATED " 3-Jun-87 14:22:35" {QV}<NOTECARDS>1.3K>NEXT>PMIPATCH043.;2 19270
changes to: (VARS PMIPATCH043COMS)
(FNS NC.OpenNoteFile NC.NoteFileNoticedP)
previous date: " 2-Jun-87 12:37:03" {QV}<NOTECARDS>1.3K>NEXT>PMIPATCH043.;1)
(* Copyright (c) 1987 by Xerox Corporation. All rights reserved.)
(PRETTYCOMPRINT PMIPATCH043COMS)
(RPAQQ PMIPATCH043COMS ((* * pmi 6/3/87: Fixes bug #557: NoteFile open gives amusing message if
file is not really a notefile. Added check and warning for filenames
which do not have the .notefile extension and have not yet been noticed
(operated on)
by NoteCards.)
(* * Changed in NCDATABASE)
(FNS NC.OpenNoteFile)
(* * New for NCDATABASE)
(FNS NC.NoteFileNoticedP)))
(* * pmi 6/3/87: Fixes bug #557: NoteFile open gives amusing message if file is not really a
notefile. Added check and warning for filenames which do not have the .notefile extension and
have not yet been noticed (operated on) by NoteCards.)
(* * Changed in NCDATABASE)
(DEFINEQ
(NC.OpenNoteFile
(LAMBDA (NoteFileOrFileName Don'tCacheTypesAndTitlesFlg Don'tCreateFlg ConvertNoConfirmFlg
Don'tCreateArrayFlg Can'tTruncateFlg Don'tCreateInterfaceFlg
Don'tGetSpecialCardsFlg InterestedWindow PublicOrPrivate MenuPosition
QuietFlg ReadOnlyFlg Don'tCheckForTruncationFlg)
(* pmi: " 3-Jun-87 14:14")
(* * 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)
(* * rht 3/25/87: Now calls NC.CoerceToInterestedWindow.)
(* * pmi 3/31/87: Moved line of code which sets the ReadOnlyFlg to just after the test for an open notefile.
Otherwise, a notefile opened read-only could be changed to one opened normally.)
(* * rht 4/2/87: Now passes InterestedWindow to opennotefilefns.)
(* * rg 4/2/87 enlarged scope of NC.ProtectedNoteFileOperation)
(* * RG 4/3/87 replaced missing InterestedWindow arg to OpenNoteFileFn)
(* * pmi 5/19/87: Removed NoteFilesHashArray argument. Replaced call to NC.StoreNoteFileInHashArray with
NC.NoticeNoteFile in general cleanup.)
(* * pmi 5/20/87: Moved the open test up to almost the beginning of the function.)
(* * pmi 5/29/87: Deleted extra InterestedWindow argument to NC.ProtectedNoteFileOperation.
Added call to NC.RemoveAccessToNoteFile to "unnotice" this notefile if the file does not exist, and remove its
icon, if it has one. If InterestedWindow is the window for this NoteFile's interface, then change it to
NC.NoteCardsIconWindow.)
(* * pmi 6/3/87: Added check and warning for filenames which do not have the .notefile extension and which have not
yet been noticed (operated on) by NoteCards.)
(DECLARE (GLOBALVARS NC.OpenNoteFileFns NC.LastNoteFileOpened))
(* * NOTE: Session lock turns into NoteFile lock after NoteFile is created)
(PROG (NoteFile FileName NewerFileName OldVersion NewVersion NoteFileMenu ReturnValue
CriticalUIDs)
(* * Figure out the name of the file containing the NoteFile)
(if (NULL (SETQ FileName (if (type? NoteFile NoteFileOrFileName)
then (fetch (NoteFile FullFileName) of
NoteFileOrFileName)
elseif NoteFileOrFileName
else (NC.DatabaseFileName
"Name of NoteFile to open:"
" -- " T NIL NIL
InterestedWindow))))
then (RETURN NIL))
(* * Check for the .NoteFile extension if this notefile has not been noticed by NoteCards.)
(if (AND (NEQ (U-CASE (FILENAMEFIELD FileName (QUOTE EXTENSION)))
(QUOTE NOTEFILE))
(NOT (NC.NoteFileNoticedP FileName)))
then (NC.PrintMsg InterestedWindow T FileName
" does not have a .NOTEFILE extension."
(CHARACTER 13))
(if (NULL (NC.AskYesOrNo (CONCAT "Are you sure you want to open "
FileName " as a NoteFile?")
" -- " "N" NIL InterestedWindow T NIL))
then (NC.ClearMsg InterestedWindow T)
(RETURN NIL)))
(* * If this is an open NoteFIle, just bring up its menu.)
(if (NC.NoteFileOpenP FileName)
then (OR Don'tCreateInterfaceFlg (NC.SetUpNoteFileInterface (
NC.NoteFileFromFileName
FileName)
MenuPosition
InterestedWindow))
(NC.ClearMsg InterestedWindow T) (* bring up or create notefile icon if needed)
(RETURN NIL))
(* * Check for higher version of same notefile)
(if (AND (SETQ OldVersion (FILENAMEFIELD FileName (QUOTE VERSION)))
(SETQ NewVersion (FILENAMEFIELD (SETQ NewerFileName
(FULLNAME (PACKFILENAME
(QUOTE VERSION)
NIL
(QUOTE BODY)
FileName)))
(QUOTE VERSION)))
(LESSP OldVersion NewVersion))
then
(* * Notify user)
(NC.PrintMsg InterestedWindow T "A higher version of " FileName " exists."
(CHARACTER 13))
(* * Open the version the user requests.)
(if (NC.AskYesOrNo (CONCAT "Open " NewerFileName " instead?")
" -- " "N" NIL InterestedWindow T NIL)
then (SETQ FileName NewerFileName)
(SETQ NoteFileOrFileName (NC.NoteFileFromFileName FileName))
(if (SETQ NoteFileMenu (GETPROP FileName (QUOTE Menu)))
then (replace (NoteFile Menu) of NoteFileOrFileName
with NoteFileMenu))))
(* * 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)
(RETURN
(NC.ProtectedNoteFileOperation
NoteFile "Open NoteFile" (OR (OPENWP InterestedWindow)
(SETQ InterestedWindow (NC.CoerceToInterestedWindow
NoteFile)))
(PROG NIL
(* * Figure out the appropriate device vector from the file name.)
(NC.InstallDeviceVectorInNoteFile NoteFile PublicOrPrivate)
(* * Moved this replace to after test for open notefile. Otherwise, if notefile is open read-only, it well be
changed to regular open.)
(replace (NoteFile ReadOnlyFlg) of NoteFile with ReadOnlyFlg)
(* * 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)
InterestedWindow))))
then (if (WINDOWP InterestedWindow)
then (NC.PrintMsg InterestedWindow NIL
"Open canceled for NoteFile "
FileName "." (CHARACTER
13))
(DISMISS NC.MsgDelay)
(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.RemoveAccessToNoteFile
NoteFile)
(SETQ InterestedWindow
(NC.CoerceToInterestedWindow
InterestedWindow))
(NC.ProcessNoteFileNotFoundError
NoteFile
Don'tCacheTypesAndTitlesFlg
Don'tCreateFlg ConvertNoConfirmFlg
Don'tCreateArrayFlg
Can'tTruncateFlg
Don'tCreateInterfaceFlg
Don'tGetSpecialCardsFlg
InterestedWindow PublicOrPrivate
MenuPosition QuietFlg ReadOnlyFlg
Don'tCheckForTruncationFlg))
(NoteFileNeedsConversion (
NC.ProcessNoteFileNeedsConversionError
NoteFile
Don'tCacheTypesAndTitlesFlg
Don'tCreateFlg
ConvertNoConfirmFlg
Don'tCreateArrayFlg
Can'tTruncateFlg
Don'tCreateInterfaceFlg
Don'tGetSpecialCardsFlg
InterestedWindow
PublicOrPrivate
MenuPosition QuietFlg
ReadOnlyFlg
Don'tCheckForTruncationFlg))
(NoteFileNeedsTruncation (
NC.ProcessNoteFileNeedsTruncationError
NoteFile
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))
(DISMISS NC.MsgDelay)
(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.NoticeNoteFile NoteFile)
(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)
InterestedWindow)))
(* * 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))))))))
)
(* * New for NCDATABASE)
(DEFINEQ
(NC.NoteFileNoticedP
(LAMBDA (NoteFileOrFileName) (* pmi: " 3-Jun-87 12:29")
(* * pmi 6/2/87: Created to check if notefile has been noticed by NoteCards.)
(LET (FullFileName NoteFile)
(if (type? NoteFile NoteFileOrFileName)
then (SETQ NoteFile NoteFileOrFileName)
(SETQ FullFileName (fetch (NoteFile Menu) of NoteFile))
elseif (SETQ FullFileName (FULLNAME NoteFileOrFileName))
then (SETQ NoteFile (NC.NoteFileFromFileName FullFileName)))
(OR (MEMBER NoteFile (NC.ListOfNoteFiles))
(MEMBER FullFileName NC.NoticedNoteFileNames)))))
)
(PUTPROPS PMIPATCH043 COPYRIGHT ("Xerox Corporation" 1987))
(DECLARE: DONTCOPY
(FILEMAP (NIL (1076 18437 (NC.OpenNoteFile 1086 . 18435)) (18469 19188 (NC.NoteFileNoticedP 18479 .
19186)))))
STOP