bool StackAndTile::_HandleMessage(BPrivate::LinkReceiver& link, BPrivate::LinkSender& reply) { int32 what; link.Read<int32>(&what); switch (what) { case BPrivate::kSaveAllGroups: { BMessage allGroupsArchive; GroupIterator groups(this, fDesktop); while (true) { SATGroup* group = groups.NextGroup(); if (group == NULL) break; if (group->CountItems() <= 1) continue; BMessage groupArchive; if (group->ArchiveGroup(groupArchive) != B_OK) continue; allGroupsArchive.AddMessage("group", &groupArchive); } int32 size = allGroupsArchive.FlattenedSize(); char buffer[size]; if (allGroupsArchive.Flatten(buffer, size) == B_OK) { reply.StartMessage(B_OK); reply.Attach<int32>(size); reply.Attach(buffer, size); } else reply.StartMessage(B_ERROR); reply.Flush(); break; } case BPrivate::kRestoreGroup: { int32 size; if (link.Read<int32>(&size) == B_OK) { char buffer[size]; BMessage group; if (link.Read(buffer, size) == B_OK && group.Unflatten(buffer) == B_OK) { status_t status = SATGroup::RestoreGroup(group, this); reply.StartMessage(status); reply.Flush(); } } break; } default: return false; } return true; }
status_t ServerPicture::ImportData(BPrivate::LinkReceiver& link) { int32 size = 0; link.Read<int32>(&size); off_t oldPosition = fData->Position(); fData->Seek(0, SEEK_SET); status_t status = B_NO_MEMORY; char* buffer = new(std::nothrow) char[size]; if (buffer) { status = B_OK; ssize_t read = link.Read(buffer, size); if (read < B_OK || fData->Write(buffer, size) < B_OK) status = B_ERROR; delete [] buffer; } fData->Seek(oldPosition, SEEK_SET); return status; }