diff --git a/DevTools/IPCCompiler/main.cpp b/DevTools/IPCCompiler/main.cpp index 016140976a..21e322bc0a 100644 --- a/DevTools/IPCCompiler/main.cpp +++ b/DevTools/IPCCompiler/main.cpp @@ -392,14 +392,7 @@ int main(int argc, char** argv) dbg() << " stream << endpoint_magic();"; dbg() << " stream << (int)MessageID::" << name << ";"; for (auto& parameter : parameters) { - if (parameter.type == "String") { - dbg() << " if (m_" << parameter.name << ".is_null()) {"; - dbg() << " stream << (i32)-1;"; - dbg() << " } else {"; - dbg() << " stream << static_cast(m_" << parameter.name << ".length());"; - dbg() << " stream << m_" << parameter.name << ";"; - dbg() << " }"; - } else if (parameter.type == "Gfx::Color") { + if (parameter.type == "Gfx::Color") { dbg() << " stream << m_" << parameter.name << ".value();"; } else if (parameter.type == "Gfx::Size") { dbg() << " stream << m_" << parameter.name << ".width();"; diff --git a/Libraries/LibIPC/Encoder.cpp b/Libraries/LibIPC/Encoder.cpp new file mode 100644 index 0000000000..61cc915d94 --- /dev/null +++ b/Libraries/LibIPC/Encoder.cpp @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2020, Andreas Kling + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +namespace IPC { + +Encoder& Encoder::operator<<(bool value) +{ + return *this << (u8)value; +} + +Encoder& Encoder::operator<<(u8 value) +{ + m_buffer.append(value); + return *this; +} + +Encoder& Encoder::operator<<(u16 value) +{ + m_buffer.ensure_capacity(m_buffer.size() + 2); + m_buffer.unchecked_append((u8)value); + m_buffer.unchecked_append((u8)(value >> 8)); + return *this; +} + +Encoder& Encoder::operator<<(u32 value) +{ + m_buffer.ensure_capacity(m_buffer.size() + 4); + m_buffer.unchecked_append((u8)value); + m_buffer.unchecked_append((u8)(value >> 8)); + m_buffer.unchecked_append((u8)(value >> 16)); + m_buffer.unchecked_append((u8)(value >> 24)); + return *this; +} + +Encoder& Encoder::operator<<(u64 value) +{ + m_buffer.ensure_capacity(m_buffer.size() + 8); + m_buffer.unchecked_append((u8)value); + m_buffer.unchecked_append((u8)(value >> 8)); + m_buffer.unchecked_append((u8)(value >> 16)); + m_buffer.unchecked_append((u8)(value >> 24)); + m_buffer.unchecked_append((u8)(value >> 32)); + m_buffer.unchecked_append((u8)(value >> 40)); + m_buffer.unchecked_append((u8)(value >> 48)); + m_buffer.unchecked_append((u8)(value >> 56)); + return *this; +} + +Encoder& Encoder::operator<<(i8 value) +{ + m_buffer.append((u8)value); + return *this; +} + +Encoder& Encoder::operator<<(i16 value) +{ + m_buffer.ensure_capacity(m_buffer.size() + 2); + m_buffer.unchecked_append((u8)value); + m_buffer.unchecked_append((u8)(value >> 8)); + return *this; +} + +Encoder& Encoder::operator<<(i32 value) +{ + m_buffer.ensure_capacity(m_buffer.size() + 4); + m_buffer.unchecked_append((u8)value); + m_buffer.unchecked_append((u8)(value >> 8)); + m_buffer.unchecked_append((u8)(value >> 16)); + m_buffer.unchecked_append((u8)(value >> 24)); + return *this; +} + +Encoder& Encoder::operator<<(i64 value) +{ + m_buffer.ensure_capacity(m_buffer.size() + 8); + m_buffer.unchecked_append((u8)value); + m_buffer.unchecked_append((u8)(value >> 8)); + m_buffer.unchecked_append((u8)(value >> 16)); + m_buffer.unchecked_append((u8)(value >> 24)); + m_buffer.unchecked_append((u8)(value >> 32)); + m_buffer.unchecked_append((u8)(value >> 40)); + m_buffer.unchecked_append((u8)(value >> 48)); + m_buffer.unchecked_append((u8)(value >> 56)); + return *this; +} + +Encoder& Encoder::operator<<(float value) +{ + union bits { + float as_float; + u32 as_u32; + } u; + u.as_float = value; + return *this << u.as_u32; +} + +Encoder& Encoder::operator<<(const char* value) +{ + return *this << StringView(value); +} + +Encoder& Encoder::operator<<(const StringView& value) +{ + m_buffer.append((const u8*)value.characters_without_null_termination(), value.length()); + return *this; +} + +Encoder& Encoder::operator<<(const String& value) +{ + if (value.is_null()) + return *this << (i32)-1; + *this << static_cast(value.length()); + return *this << value.view(); +} + +} diff --git a/Libraries/LibIPC/Encoder.h b/Libraries/LibIPC/Encoder.h index d4d1b2f4b6..c77bccd951 100644 --- a/Libraries/LibIPC/Encoder.h +++ b/Libraries/LibIPC/Encoder.h @@ -37,107 +37,19 @@ public: { } - Encoder& operator<<(bool value) - { - return *this << (u8)value; - } - - Encoder& operator<<(u8 value) - { - m_buffer.append(value); - return *this; - } - - Encoder& operator<<(u16 value) - { - m_buffer.ensure_capacity(m_buffer.size() + 2); - m_buffer.unchecked_append((u8)value); - m_buffer.unchecked_append((u8)(value >> 8)); - return *this; - } - - Encoder& operator<<(u32 value) - { - m_buffer.ensure_capacity(m_buffer.size() + 4); - m_buffer.unchecked_append((u8)value); - m_buffer.unchecked_append((u8)(value >> 8)); - m_buffer.unchecked_append((u8)(value >> 16)); - m_buffer.unchecked_append((u8)(value >> 24)); - return *this; - } - - Encoder& operator<<(u64 value) - { - m_buffer.ensure_capacity(m_buffer.size() + 8); - m_buffer.unchecked_append((u8)value); - m_buffer.unchecked_append((u8)(value >> 8)); - m_buffer.unchecked_append((u8)(value >> 16)); - m_buffer.unchecked_append((u8)(value >> 24)); - m_buffer.unchecked_append((u8)(value >> 32)); - m_buffer.unchecked_append((u8)(value >> 40)); - m_buffer.unchecked_append((u8)(value >> 48)); - m_buffer.unchecked_append((u8)(value >> 56)); - return *this; - } - - Encoder& operator<<(i8 value) - { - m_buffer.append((u8)value); - return *this; - } - - Encoder& operator<<(i16 value) - { - m_buffer.ensure_capacity(m_buffer.size() + 2); - m_buffer.unchecked_append((u8)value); - m_buffer.unchecked_append((u8)(value >> 8)); - return *this; - } - - Encoder& operator<<(i32 value) - { - m_buffer.ensure_capacity(m_buffer.size() + 4); - m_buffer.unchecked_append((u8)value); - m_buffer.unchecked_append((u8)(value >> 8)); - m_buffer.unchecked_append((u8)(value >> 16)); - m_buffer.unchecked_append((u8)(value >> 24)); - return *this; - } - - Encoder& operator<<(i64 value) - { - m_buffer.ensure_capacity(m_buffer.size() + 8); - m_buffer.unchecked_append((u8)value); - m_buffer.unchecked_append((u8)(value >> 8)); - m_buffer.unchecked_append((u8)(value >> 16)); - m_buffer.unchecked_append((u8)(value >> 24)); - m_buffer.unchecked_append((u8)(value >> 32)); - m_buffer.unchecked_append((u8)(value >> 40)); - m_buffer.unchecked_append((u8)(value >> 48)); - m_buffer.unchecked_append((u8)(value >> 56)); - return *this; - } - - Encoder& operator<<(float value) - { - union bits { - float as_float; - u32 as_u32; - } u; - u.as_float = value; - return *this << u.as_u32; - } - - Encoder& operator<<(const char* value) - { - return *this << StringView(value); - } - - Encoder& operator<<(const StringView& value) - { - m_buffer.append((const u8*)value.characters_without_null_termination(), value.length()); - return *this; - } + Encoder& operator<<(bool); + Encoder& operator<<(u8); + Encoder& operator<<(u16); + Encoder& operator<<(u32); + Encoder& operator<<(u64); + Encoder& operator<<(i8); + Encoder& operator<<(i16); + Encoder& operator<<(i32); + Encoder& operator<<(i64); + Encoder& operator<<(float); + Encoder& operator<<(const char*); + Encoder& operator<<(const StringView&); + Encoder& operator<<(const String&); private: MessageBuffer& m_buffer; diff --git a/Libraries/LibIPC/Makefile b/Libraries/LibIPC/Makefile index 1354dcca1c..0250443c1f 100644 --- a/Libraries/LibIPC/Makefile +++ b/Libraries/LibIPC/Makefile @@ -1,4 +1,5 @@ OBJS = \ + Encoder.o \ Endpoint.o \ Message.o