/* * Copyright 2014, Augustin Cavalier (waddlesplash) * Distributed under the terms of the MIT License. */ #include #include #include namespace BPrivate { // #pragma mark - BMessageBuilder BMessageBuilder::BMessageBuilder(BMessage& message) : fNameStack(20, true), fCurrentMessage(&message) { } /*! Creates a new BMessage, makes it a child of the current one with "name", and then pushes the current Message onto the stack and makes the new Message the current one. */ status_t BMessageBuilder::PushObject(const char* name) { BMessage* newMessage = new(std::nothrow) BMessage; if (newMessage == NULL) return B_NO_MEMORY; ObjectDeleter messageDeleter(newMessage); BString* nameString = new(std::nothrow) BString(name); if (nameString == NULL) return B_NO_MEMORY; ObjectDeleter stringDeleter(nameString); if (!fNameStack.AddItem(nameString)) return B_NO_MEMORY; stringDeleter.Detach(); if (!fStack.AddItem(fCurrentMessage)) return B_NO_MEMORY; messageDeleter.Detach(); fCurrentMessage = newMessage; return B_OK; } /*! Convenience function that converts "name" to a string and calls PushObject(const char*) with it. */ status_t BMessageBuilder::PushObject(uint32 name) { BString nameString; nameString.SetToFormat("%" B_PRIu32, name); return PushObject(nameString.String()); } /*! Pops the last BMessage off the stack and makes it the current one. */ status_t BMessageBuilder::PopObject() { if (fStack.CountItems() < 1) return B_ERROR; BMessage* previousMessage = fStack.LastItem(); previousMessage->AddMessage(fNameStack.LastItem()->String(), fCurrentMessage); delete fCurrentMessage; fCurrentMessage = previousMessage; fStack.RemoveItemAt(fStack.CountItems() - 1); fNameStack.RemoveItemAt(fNameStack.CountItems() - 1); return B_OK; } /*! Gets the "what" of the current message. */ uint32 BMessageBuilder::What() { return fCurrentMessage->what; } /*! Sets the "what" of the current message. */ void BMessageBuilder::SetWhat(uint32 what) { fCurrentMessage->what = what; } /*! Gets the value of CountNames() from the current message. */ uint32 BMessageBuilder::CountNames(type_code type) { return fCurrentMessage->CountNames(type); } // #pragma mark - BMessageBuilder::Add (to fCurrentMessage) status_t BMessageBuilder::AddString(const char* name, const char* string) { return fCurrentMessage->AddString(name, string); } status_t BMessageBuilder::AddString(const char* name, const BString& string) { return fCurrentMessage->AddString(name, string); } status_t BMessageBuilder::AddInt8(const char* name, int8 value) { return fCurrentMessage->AddInt8(name, value); } status_t BMessageBuilder::AddUInt8(const char* name, uint8 value) { return fCurrentMessage->AddUInt8(name, value); } status_t BMessageBuilder::AddInt16(const char* name, int16 value) { return fCurrentMessage->AddInt16(name, value); } status_t BMessageBuilder::AddUInt16(const char* name, uint16 value) { return fCurrentMessage->AddUInt16(name, value); } status_t BMessageBuilder::AddInt32(const char* name, int32 value) { return fCurrentMessage->AddInt32(name, value); } status_t BMessageBuilder::AddUInt32(const char* name, uint32 value) { return fCurrentMessage->AddUInt32(name, value); } status_t BMessageBuilder::AddInt64(const char* name, int64 value) { return fCurrentMessage->AddInt64(name, value); } status_t BMessageBuilder::AddUInt64(const char* name, uint64 value) { return fCurrentMessage->AddUInt64(name, value); } status_t BMessageBuilder::AddBool(const char* name, bool value) { return fCurrentMessage->AddBool(name, value); } status_t BMessageBuilder::AddFloat(const char* name, float value) { return fCurrentMessage->AddFloat(name, value); } status_t BMessageBuilder::AddDouble(const char* name, double value) { return fCurrentMessage->AddDouble(name, value); } status_t BMessageBuilder::AddPointer(const char* name, const void* pointer) { return fCurrentMessage->AddPointer(name, pointer); } } // namespace BPrivate