public Archive.ArchiveData read(HistoryLinkMap linkMap, LinkDataFactory linkFactory) throws IOException {
        Archive.ArchiveData data = readArchiveData(linkMap, linkFactory);

        for (Archive.RootObject obj : data.mRootObjects) {
            if (obj.mDigest.isNullDigest()) {
                continue;
            }
            readLink(linkMap, linkFactory, obj.mDigest);
        }

        for (Block block : data.mBlocks) {
            for (LinkDigest digest : block.getDigests()) {
                if (mIgnoreMissingLinks) {
                    try {
                        readLink(linkMap, linkFactory, digest);
                    } catch (IOException ioe) {
                        // NOP
                    }
                } else {
                    readLink(linkMap, linkFactory, digest);
                }
            }
        }

        return data;
    }