(FILECREATED " 9-Dec-86 14:56:01" {QV}<NOTECARDS>1.3K>NEXT>RHTPATCH169.;2 23198
changes to: (VARS RHTPATCH169COMS)
(FNS NC.MakeLink NC.CreateCrossFileLinkCard)
previous date: " 9-Dec-86 12:39:07" {QV}<NOTECARDS>1.3K>NEXT>RHTPATCH169.;1)
(* Copyright (c) 1986 by Xerox Corporation. All rights reserved.)
(PRETTYCOMPRINT RHTPATCH169COMS)
(RPAQQ RHTPATCH169COMS ((* * Fixes to crossfilelinks bugs #312, 313 reported by John Tang.)
(* * Change to NCREPAIR)
(FNS NC.ScavengeDatabaseFile)
(* * Change to NCLINKS)
(FNS NC.MakeLink)
(* * Change to NCCROSSFILELINKS)
(FNS NC.CreateCrossFileLinkCard)))
(* * Fixes to crossfilelinks bugs #312, 313 reported by John Tang.)
(* * Change to NCREPAIR)
(DEFINEQ
(NC.ScavengeDatabaseFile
(LAMBDA (NoteFileOrFileName BadLinkLabelsFlg ListOfBoxesToReconstruct
ListOfCardsNeedingGlobalLinksReconstructed InterestedWindow)
(* rht: " 9-Dec-86 11:44")
(* Scavenge the database FileName. Essentially throw away all of the information about From and ToLinks and
recreate them by retrieving the link information from the substance of each card and from the list of global links
from the card.)
(* * rht 8/9/84: Now calls NC.OpenDatabaseFile to do the file open.)
(* * rht 7/17/85: Changed so can take a stream argument. Also handles link labels. If BadLinkLabelsFlg is non-nil,
then don't try to read current link labels. Just rebuild them from what's out there. Otherwise, only rebuild if
find new any new ones.)
(* * fgh 22-Jul-85 Takes a list of bad file box cards and reconstructs the file boxes from the From pointer lists
of all the cards in the NoteFile.)
(* * fgh 30-Jul-85 Takes a list of cards with bad global links and reconstructs the global links list from the From
pointer lists of all the cards in the NoteFile.)
(* * rht 11/23/85: Updated to handle new notefile and card object formats.)
(* * rht 12/1/85: Now calls NC.GetMainCardData and NC.GetLinks instead of NC.GetNoteCard.)
(* * rht 12/19/85: Massive overhaul for sake of speed. Should be wizzier now.)
(* * fgh 2/4/86 Now works on open NFs. No need to error check since this function should always be called from
earlier phases of the inspect & repaier.)
(* * fgh 5/21/86 Fixed bug in handling of global links.)
(* * rht 7/16/86: Added InterestedWindow arg.)
(* * rht 7/16/86: Now calls NC.PutLinks passing UseOldDatesFlg.)
(* * rht 9/5/86: Now checks that link is valid before passing it to NC.DelReferencesToCard.)
(* * rht 10/29/86: Now closes prompt win at end if no filing info to tell.)
(* * rht 12/9/86: Now calls NC.CardNeedsFilingP to check whether any cards need to be filed in ToBeFiled box.)
(PROG (NoteFile FileName CardTotal NoteCardNumber OldLinkLabels DiscoveredLinkLabels
ReconstructLinks ReconstructGlobalLinks ToBeFiledCards)
(* * First, take care of checking stream's validity, etc.)
(SETQ FileName (if (type? NoteFile NoteFileOrFileName)
then (SETQ NoteFile NoteFileOrFileName)
(fetch (NoteFile FullFileName) of NoteFileOrFileName)
else NoteFileOrFileName)) (* Try to open notefile.)
(if (NULL (OPENP FileName))
then (if (NULL (SETQ NoteFile
(NC.OpenDatabaseFile FileName NIL T NIL NIL NIL NIL T T NIL
InterestedWindow)))
then (NC.PrintMsg InterestedWindow NIL "Couldn't open " FileName "."
(CHARACTER 13)
"Repair aborted.")
(RETURN NIL)))
(* * If link labels aren't screwed up, then read them in.)
(OR BadLinkLabelsFlg (SETQ OldLinkLabels (NC.RetrieveLinkLabels NoteFile T)))
(* * Mark every card that needs its global links or substance reconstructed so we don't have to search the lists so
much.)
(for Card in ListOfCardsNeedingGlobalLinksReconstructed do (NC.SetUserDataProp
Card
(QUOTE
NeedsGlobalLinksReconstructedFlg)
T))
(for Box in ListOfBoxesToReconstruct do (NC.SetUserDataProp Box (QUOTE
NeedsReconstructingFlg)
T))
(* Read through all NoteCard substances to find actual pointers. Use this to create the To Links list.
The list collection function checks to make sure each link is valid.)
(SETQ CardTotal (SUB1 (fetch (NoteFile NextIndexNum)
NoteFile)))
(NC.PrintMsg InterestedWindow T "Rebuilding notefile links." (CHARACTER 13)
"Collecting Links for item " 1 " out of " CardTotal ".")
(SETQ NoteCardNumber 0)
(NC.MapCards
NoteFile
(FUNCTION (LAMBDA (Card)
(BLOCK)
(SETQ NoteCardNumber (ADD1 NoteCardNumber))
(AND (ZEROP (REMAINDER NoteCardNumber 10))
(NC.PrintMsg InterestedWindow T "Rebuilding notefile links." (CHARACTER
13)
"Collecting Links for item " NoteCardNumber " out of "
CardTotal "."))
(if (NC.FetchUserDataProp Card (QUOTE NeedsReconstructingFlg))
then (* Card substance and links will be reconstructed so
no need to try to read substance.)
(NC.GetLinks Card)
(if (NOT (NC.FetchUserDataProp Card (QUOTE
NeedsGlobalLinksReconstructedFlg)))
then (NC.SetUserDataProp Card (QUOTE ScavengerToLinks)
(NC.FetchGlobalLinks Card))
(NC.SetUserDataProp Card (QUOTE ScavengerGlobalLinks)
(NC.FetchGlobalLinks Card)))
(NC.DeactivateCard Card T)
else (NC.GetMainCardData Card)
(NC.GetLinks Card)
(NC.ActivateCard Card)
(if (EQ (NC.FetchStatus Card)
(QUOTE ACTIVE))
then (* Collect links having active destinations.
Delete the others.)
(NC.SetUserDataProp
Card
(QUOTE ScavengerToLinks)
(NCONC (for Link in (CAR (NC.CollectReferences
Card))
eachtime (BLOCK)
when (if (EQ (NC.FetchStatus
(fetch (Link
DestinationCard)
of Link))
(QUOTE ACTIVE))
else (AND (type? Link Link)
(NC.DelReferencesToCard
Card Link))
NIL)
collect Link)
(if (NC.FetchUserDataProp Card (QUOTE
NeedsGlobalLinksReconstructedFlg))
else (NC.SetUserDataProp Card (QUOTE
ScavengerGlobalLinks)
(NC.FetchGlobalLinks
Card))
(NC.FetchGlobalLinks Card))))
(if (NC.FetchUserDataProp Card (QUOTE
NeedsGlobalLinksReconstructedFlg))
else (NC.SetUserDataProp Card (QUOTE
ScavengerGlobalLinks)
(NC.FetchGlobalLinks Card)))
(* If there are file boxes to be reconstructed, then look thru the From links to see if this card was filed in one
of the to-be-reconstructed boxes)
(AND ListOfBoxesToReconstruct
(for Link in (NC.FetchFromLinks Card)
eachtime (BLOCK)
when (AND (NC.ChildLinkP Link)
(NC.FetchUserDataProp
(fetch (Link SourceCard)
of Link)
(QUOTE NeedsReconstructingFlg)))
do (push ReconstructLinks Link)))
(* If there are global links to be reconstructed, then look thru the From links to see if this card had a global
link from a card whose global links need reconstructing.)
(AND ListOfCardsNeedingGlobalLinksReconstructed
(for Link in (NC.FetchFromLinks Card)
eachtime (BLOCK)
when (AND (NC.GlobalLinkP Link)
(NC.FetchUserDataProp
(fetch (Link SourceCard)
of Link)
(QUOTE
NeedsGlobalLinksReconstructedFlg)))
do (push ReconstructGlobalLinks Link)))
(NC.DeactivateCard Card T))))))
(* * Reconstruct any cards as requested)
(for BoxToReconstruct in ListOfBoxesToReconstruct eachtime (BLOCK)
do (* Make a new file box using the given card.)
(NC.MakeNoteCard (QUOTE FileBox)
NoteFile "Untitled: Reconstructed during repair" T NIL
BoxToReconstruct)
(* File cards whose from links indicate that they used to be filed in this file box. Also add these new links to
collected ToLinks.)
(NC.SetUserDataProp BoxToReconstruct (QUOTE ScavengerToLinks)
(APPEND (NC.FetchUserDataProp BoxToReconstruct
(QUOTE ScavengerToLinks)
)
(for Link in ReconstructLinks
eachtime (BLOCK)
when (NC.SameCardP BoxToReconstruct
(fetch (Link
SourceCard)
of Link))
collect (NC.MakeChildLink
(fetch (Link DestinationCard)
of Link)
BoxToReconstruct NIL))))
(* Put the card away)
(NC.PutMainCardData BoxToReconstruct)
(NC.DeactivateCard BoxToReconstruct T))
(* * Reconstruct any global link lists as required)
(for Link in ReconstructGlobalLinks bind ThisCardsToLinks ThisCardsGlobalLinks
SourceCard
eachtime (BLOCK)
do (SETQ SourceCard (fetch (Link SourceCard) of Link))
(* Add it to the GlobalLinks list for its source card
unless it's already there.)
(if (for GlobalLink in (SETQ ThisCardsGlobalLinks (NC.FetchUserDataProp
SourceCard
(QUOTE ScavengerGlobalLinks)))
eachtime (BLOCK) never (NC.SameLinkP Link GlobalLink))
then (NC.SetUserDataProp SourceCard (QUOTE ScavengerGlobalLinks)
(CONS Link ThisCardsGlobalLinks)))
(* Add it to the source card's ToLinks list unless
it's already there)
(if (for ToLink in (SETQ ThisCardsToLinks (NC.FetchUserDataProp
SourceCard
(QUOTE ScavengerToLinks)))
eachtime (BLOCK) never (NC.SameLinkP Link ToLink))
then (NC.SetUserDataProp SourceCard (QUOTE ScavengerToLinks)
(CONS Link ThisCardsToLinks))))
(* * Compute the From Links list by "inverting" the To Links list)
(NC.PrintMsg InterestedWindow T "Repairing NoteFile." (CHARACTER 13)
"Inverting links for item " 1 " out of " CardTotal ".")
(SETQ NoteCardNumber 0)
(NC.MapCards NoteFile (FUNCTION (LAMBDA (Card)
(SETQ NoteCardNumber (ADD1 NoteCardNumber))
(AND (ZEROP (REMAINDER NoteCardNumber 100))
(NC.PrintMsg InterestedWindow T "Repairing NoteFile."
(CHARACTER 13)
"Inverting links for item " NoteCardNumber
" out of "
CardTotal "."))
(if (EQ (NC.FetchStatus Card)
(QUOTE ACTIVE))
then (for Link in (NC.FetchUserDataProp Card (QUOTE
ScavengerToLinks))
bind DestinationCard LinkLabel eachtime (BLOCK)
do (* Add this ToLink as a FromLink for the link's
destination card.)
(NC.SetUserDataProp (SETQ DestinationCard
(fetch (Link
DestinationCard)
of Link))
(QUOTE ScavengerFromLinks)
(CONS Link
(NC.FetchUserDataProp
DestinationCard
(QUOTE
ScavengerFromLinks))))
(* Accumulate the link labels into a list.)
(if (NOT (FMEMB (SETQ LinkLabel
(fetch (Link Label)
of Link))
DiscoveredLinkLabels))
then (push DiscoveredLinkLabels LinkLabel)))))
))
(* * Reset all of the To and From Links lists in the database)
(NC.PrintMsg InterestedWindow T "Repairing NoteFile." (CHARACTER 13)
"Rewriting links for item " 1 " out of " CardTotal ".")
(SETQ NoteCardNumber 0)
(NC.MapCards NoteFile (FUNCTION (LAMBDA (Card)
(SETQ NoteCardNumber (ADD1 NoteCardNumber))
(AND (ZEROP (REMAINDER NoteCardNumber 10))
(NC.PrintMsg InterestedWindow T "Repairing NoteFile."
(CHARACTER 13)
"Rewriting links for item " NoteCardNumber
" out of "
CardTotal "."))
(if (EQ (NC.FetchStatus Card)
(QUOTE ACTIVE))
then (NC.SetGlobalLinks Card (NC.FetchUserDataProp
Card
(QUOTE ScavengerGlobalLinks)))
(NC.SetToLinks Card (NC.FetchUserDataProp Card
(QUOTE
ScavengerToLinks)))
(NC.SetFromLinks Card (NC.FetchUserDataProp Card
(QUOTE
ScavengerFromLinks)))
(* Check whether this card isn't filed anywhere.)
(if (NC.CardNeedsFilingP Card)
then (push ToBeFiledCards Card))
(NC.PutLinks Card T))
(* Clean any junk off the card.)
(NC.DeactivateCard Card T)
(NC.SetUserDataPropList Card NIL))))
(* * File any unfiled cards in the ToBeFiled box.)
(if ToBeFiledCards
then (NC.PrintMsg InterestedWindow T "Filing " (LENGTH ToBeFiledCards)
" cards in ToBeFiled box ...")
(NCP.FileCards ToBeFiledCards (fetch (NoteFile ToBeFiledCard)
of NoteFile)))
(* Rewrite link labels if we've found any new ones.)
(if (LDIFFERENCE DiscoveredLinkLabels OldLinkLabels)
then (NC.StoreLinkLabels NoteFile (UNION DiscoveredLinkLabels OldLinkLabels)))
(* Clean up and get out.)
(NC.CheckpointDatabase NoteFile T)
(NC.ForceDatabaseClose NoteFile)
(NC.PrintMsg InterestedWindow T "Repair Completed for " (FULLNAME FileName)
".")
(if ToBeFiledCards
then (NC.PrintMsg InterestedWindow NIL "Filed " (LENGTH ToBeFiledCards)
" cards in ToBeFiled box.")
else (NC.ClearMsg InterestedWindow T)))))
)
(* * Change to NCLINKS)
(DEFINEQ
(NC.MakeLink
(LAMBDA (Window LinkLabel DestinationCard SourceCard DisplayMode AnchorMode Message NoDisplayFlg
LinkToInsertAfter CrossFileLinksMode) (* rht: " 9-Dec-86 14:50")
(* * Make a link from (OR Window SourceCard) to DestinationCard with linklabel of LinkLabel)
(* * rht 1/12/85: If need to create a new card, then now shows card type menu near window of SourceID.)
(* * rht 1/13/85: Added extra args Message and NoDisplayFlg.)
(* * rht 3/26/85: Added LinkToInsertAfter arg which should be NIL or a link to insert the new To link after.
If NIL, then insert at front of ToLinks.)
(* * kirk 9/23/85: took out GETPROMPTWINDOW call for asknotecardtype)
(* * kirk: 14Nov85: changed NC.CoerceToID to to NC.CoerceToCard)
(* * fgh 11/16/85 Changed from PROG to LET and used COND to contyrol returnmed value.)
(* * fgh 2/5/86 Changed call DefaultLinkDisplayMode to FetchLinkDisplayMode)
(* * fgh 6/5/86 Now calls AskLinkLabel if LinkLabel arg is NIL)
(* * rht 7/4/86: Added check for readonly card.)
(* * kef 7/17/86: Added calls to grab the write permission on the appropriate card parts.)
(* * kef 7/22/86: Saves the links on the Destination Card now right away, while still holding onto the FROMLINKS
write lock.)
(* * fgh 8/30/86 Adpated to use NC.IfCardPartNotBusy.)
(* * rht 9/29/86: Tossed Ken's call to NC.PutFromLinks; It was the cause of too many nasty breaks.
Also made syntactic fixes.)
(* * rht 10/4/86: Now handles cross file links. New arg CrossFileLinksMode determines whether cross-file link will
be two-way, i.e. will destination card know it's being linked to.)
(* * rht 11/10/86: Now creates new crossfile link if Destination card is a CrossFileLink card that we didn't just
create.)
(* * rht 11/14/86: Now checks if non-nil DestinationCard before trying to do cross-filelink stuff.)
(* * pmi 12/5/86: Modified message to NC.SelectNoteCards to mention SHIFT-selection.)
(* * rht 12/9/86: Throws out JustCreatedFlg marker stuff.)
(DECLARE (GLOBALVARS NC.SelectingSingleCardMenu NC.NewCrossFileLinksTwoWayFlg))
(OR SourceCard (SETQ SourceCard (NC.CoerceToCard Window)))
(AND (NC.CheckForNotReadOnly SourceCard Window "Can't make links in ")
(LET (Link Type)
(OR Window (SETQ Window (NC.FetchWindow SourceCard)))
(OR Message (SETQ Message "Please shift-select the Card or Box to be linked to."))
(OR LinkLabel (SETQ LinkLabel (NC.AskLinkLabel Window NIL NIL T NIL)))
(OR DestinationCard (SETQ DestinationCard
(NC.SelectNoteCards T (FUNCTION (LAMBDA (Card)
(COND
((NOT (NC.SameCardP Card SourceCard))
T)
(T (NC.PrintMsg Window T
"A Card/Box cannot link to itself. "
(CHARACTER 13)
"Selection ignored."
(CHARACTER 13))
NIL))))
NC.SelectingSingleCardMenu SourceCard NIL Message)))
(if (EQ DestinationCard (QUOTE *New% Card*))
then (SETQ DestinationCard (AND (SETQ Type (NC.AskNoteCardType
(WINDOWREGION Window)))
(NC.CoerceToCard
(NC.MakeNoteCard Type
(fetch (Card
NoteFile)
of SourceCard)
NIL NoDisplayFlg)))))
(* * If we're trying to link to a CrossFileLink card, then check whether card was just created.
If so, then it's the first link, otherwise we make a new CrossFileLink.)
(if (AND DestinationCard (NC.CrossFileLinkCardP DestinationCard))
then (SETQ DestinationCard (NC.GetCrossFileLinkDestCard DestinationCard))
(NC.SetUserDataProp DestinationCard (QUOTE JustCreatedFlg)
NIL))
(if DestinationCard
then (NC.IfCardPartNotBusy
DestinationCard
(QUOTE FROMLINKS)
(NC.IfCardPartNotBusy SourceCard (QUOTE TOLINKS)
(* * If have cross-file link, then make two new crossfilelink cards, one per notefile. Make global link over there
from crossfilelink card to DestinationCard and local link here from SourceCard to crossfilelink card.)
(if (NOT (NC.SameNoteFileP
(fetch (Card NoteFile)
of SourceCard)
(fetch (Card NoteFile)
of DestinationCard)))
then
(LET ((CrossFileLinksTwoWayFlg
(OR (EQ CrossFileLinksMode
(QUOTE TWOWAY))
(AND (NULL
CrossFileLinksMode)
NC.NewCrossFileLinksTwoWayFlg))))
(if CrossFileLinksTwoWayFlg
then (NC.MakeGlobalLink
Window LinkLabel
DestinationCard
(
NC.CreateCrossFileLinkCard
DestinationCard
SourceCard T)
DisplayMode))
(SETQ DestinationCard
(NC.CreateCrossFileLinkCard
SourceCard
DestinationCard
CrossFileLinksTwoWayFlg))))
(SETQ Link (create Link
UID ←(NC.MakeUID)
SourceCard ← SourceCard
DestinationCard ←
DestinationCard
AnchorMode ← AnchorMode
Label ← LinkLabel
DisplayMode ←(OR
DisplayMode
(NC.FetchLinkDisplayMode
SourceCard))))
(NC.AddToLink Link LinkToInsertAfter)
(NC.AddFromLink Link)
Link))
else NIL)))))
)
(* * Change to NCCROSSFILELINKS)
(DEFINEQ
(NC.CreateCrossFileLinkCard
(LAMBDA (SourceCard DestCard TwoWayFlg) (* rht: " 9-Dec-86 14:50")
(* * Create a cross file link card in SourceCard's notefile.)
(* * rht 11/19/86: Now rips off version number from destination notefile hint.)
(* * rht 12/9/86: No longer records fact that card was "just created.")
(LET ((DestNoteFile (fetch (Card NoteFile) of DestCard))
CrossFileLinkCard)
(SETQ CrossFileLinkCard (NC.MakeNoteCard (QUOTE CrossFileLink)
(fetch (Card NoteFile) of SourceCard)
(NC.FetchTitle DestCard)
T
(create CrossFileLinkSubstance
CrossFileLinkDestCardUID ←(fetch
(Card UID) of DestCard)
CrossFileLinkDestNoteFileUID ←(fetch
(NoteFile UID) of DestNoteFile)
CrossFileLinkDestFileHint ←(
PACKFILENAME (QUOTE VERSION)
NIL
(QUOTE BODY)
(fetch
(NoteFile
FullFileName)
of DestNoteFile)
)
CrossFileLinkTwoWayFlg ← TwoWayFlg)))
(* Indicate that card was just created.)
CrossFileLinkCard)))
)
(PUTPROPS RHTPATCH169 COPYRIGHT ("Xerox Corporation" 1986))
(DECLARE: DONTCOPY
(FILEMAP (NIL (764 15657 (NC.ScavengeDatabaseFile 774 . 15655)) (15688 21731 (NC.MakeLink 15698 .
21729)) (21771 23116 (NC.CreateCrossFileLinkCard 21781 . 23114)))))
STOP