/* * computes a checksum (we call it fingerprint) on all the catalog-keys. We do * not include the values, since we want catalogs for different languages of the * same app to have the same fingerprint, since we use it to separate different * catalog-versions. We use a simple sum because there is no well known * checksum algorithm that gives the same result if the string are sorted in the * wrong order, and this does happen, as an hash map is an unsorted container. */ uint32 BHashMapCatalog::ComputeFingerprint() const { uint32 checksum = 0; int32 hash; CatMap::Iterator iter = fCatMap.GetIterator(); CatMap::Entry entry; while (iter.HasNext()) { entry = iter.Next(); hash = entry.key.fHashVal; checksum += hash; } return checksum; }
status_t DefaultCatalog::Flatten(BDataIO *dataIO) { UpdateFingerprint(); // make sure we have the correct fingerprint before we flatten it status_t res; BMessage archive; int32 count = fCatMap.Size(); res = archive.AddString("class", "DefaultCatalog"); if (res == B_OK) res = archive.AddInt32("c:sz", count); if (res == B_OK) res = archive.AddInt16("c:ver", kCatArchiveVersion); if (res == B_OK) res = archive.AddString("c:lang", fLanguageName.String()); if (res == B_OK) res = archive.AddString("c:sig", fSignature.String()); if (res == B_OK) res = archive.AddInt32("c:fpr", fFingerprint); if (res == B_OK) res = archive.Flatten(dataIO); CatMap::Iterator iter = fCatMap.GetIterator(); CatMap::Entry entry; while (res == B_OK && iter.HasNext()) { entry = iter.Next(); archive.MakeEmpty(); res = archive.AddString("c:ostr", entry.key.fString.String()); if (res == B_OK) res = archive.AddString("c:ctxt", entry.key.fContext.String()); if (res == B_OK) res = archive.AddString("c:comt", entry.key.fComment.String()); if (res == B_OK) res = archive.AddInt32("c:hash", entry.key.fHashVal); if (res == B_OK) res = archive.AddString("c:tstr", entry.value.String()); if (res == B_OK) res = archive.Flatten(dataIO); } return res; }