// Archive status_t SecurityContext::Archive(BMessage* archive, bool deep) const { if (!archive) return B_BAD_VALUE; status_t error = B_OK; ContextLocker _(const_cast<SecurityContext*>(this)); // users int32 userCount = fUsers->Size(); for (UserMap::Iterator it = fUsers->GetIterator(); it.HasNext();) { User* user = it.Next().value; BMessage userArchive; error = user->Archive(&userArchive, deep); if (error != B_OK) return error; error = archive->AddMessage("users", &userArchive); if (error != B_OK) return error; } // shares for (ShareMap::Iterator it = fShares->GetIterator(); it.HasNext();) { Share* share = it.Next().value; BMessage shareArchive; error = share->Archive(&shareArchive, deep); if (error != B_OK) return error; error = archive->AddMessage("shares", &shareArchive); if (error != B_OK) return error; } // permissions // we slice them per user BMessage* tmpUserArchives = new(std::nothrow) BMessage[userCount]; if (!tmpUserArchives) return B_NO_MEMORY; ArrayDeleter<BMessage> deleter(tmpUserArchives); HashMap<HashKey32<User*>, BMessage*> userArchives; int32 i = 0; for (UserMap::Iterator it = fUsers->GetIterator(); it.HasNext();) { User* user = it.Next().value; error = userArchives.Put(user, tmpUserArchives + i); if (error != B_OK) return error; i++; } // fill the per user archives for (PermissionMap::Iterator it = fPermissions->GetIterator(); it.HasNext();) { PermissionMap::Entry entry = it.Next(); BMessage* userArchive = userArchives.Get(entry.key.user); error = userArchive->AddInt32(entry.key.path.GetString(), entry.value.GetPermissions()); if (error != B_OK) return error; } // put the user permissions together BMessage permissionsArchive; for (UserMap::Iterator it = fUsers->GetIterator(); it.HasNext();) { User* user = it.Next().value; error = permissionsArchive.AddMessage(user->GetName(), userArchives.Get(user)); if (error != B_OK) return error; } error = archive->AddMessage("permissions", &permissionsArchive); if (error != B_OK) return error; return B_OK; }