From 262dca00ef6a14806be232e05abf433985ac13c0 Mon Sep 17 00:00:00 2001 From: rexy712 Date: Wed, 18 Sep 2019 18:10:27 -0700 Subject: [PATCH] Renamed uploaded file structs --- include/matrix/client.hpp | 14 ++-- include/matrix/fat_strings.hpp | 14 ++-- include/matrix/roomcxn.hpp | 8 +- include/matrix/upload_info.hpp | 119 +++++++++++++++++++++++----- include/raii/binary.hpp | 18 +++++ include/raii/binary_string_conv.hpp | 18 +++++ include/raii/default_allocator.hpp | 18 +++++ src/matrix/client.cpp | 68 ++++++++-------- src/matrix/fat_strings.cpp | 70 ++++++++-------- src/matrix/roomcxn.cpp | 8 +- src/raii/binary.cpp | 18 +++++ 11 files changed, 261 insertions(+), 112 deletions(-) diff --git a/include/matrix/client.hpp b/include/matrix/client.hpp index feed25e..8a451c9 100644 --- a/include/matrix/client.hpp +++ b/include/matrix/client.hpp @@ -107,32 +107,32 @@ namespace matrix{ * Returns: file_info struct containing the url of the file on the homeserver. * Note check the file_info::fileurl field to check if the upload succeeded. */ - file_info upload_file(const file_details& file)const; + uploaded_file upload_file(const file_details& file)const; /* * Upload a file as an image. * Returns: image_info struct containing the url of the image on the homeserver. * Note check the image_info::fileurl field to check if the upload succeeded. */ - image_info upload_image(const image_details& file)const; + uploaded_image upload_image(const image_details& file)const; /* * Upload data as a video. * Returns: video_info struct containing the url of the image on the homeserver. * Note check the video_info::fileurl field to check if the upload succeeded. */ - video_info upload_video(const video_details& file)const; + uploaded_video upload_video(const video_details& file)const; /* * Upload a file as an audio file. * Returns: audio_info struct containing the url of the image on the homeserver. * Note check the audio_info::fileurl field to check if the upload succeeded. */ - audio_info upload_audio(const audio_details& file)const; + uploaded_audio upload_audio(const audio_details& file)const; - bool create_thumbnail(image_info& info)const; - bool create_thumbnail(video_info& video)const; + bool create_thumbnail(uploaded_image& info)const; + bool create_thumbnail(uploaded_video& video)const; private: - file_info _upload_file(const file_details& file, const raii::curl_llist& header)const; + uploaded_file _upload_file(const file_details& file, const raii::curl_llist& header)const; }; } diff --git a/include/matrix/fat_strings.hpp b/include/matrix/fat_strings.hpp index ab59967..c8e1fba 100644 --- a/include/matrix/fat_strings.hpp +++ b/include/matrix/fat_strings.hpp @@ -25,18 +25,14 @@ //but will rarely need rebuilt #include "raii/string.hpp" - -struct image_info; -struct video_info; -struct file_info; -struct audio_info; +#include "matrix/upload_info.hpp" namespace matrix::detail{ - raii::string _image_body(const image_info& image); - raii::string _video_body(const video_info& video); - raii::string _file_body(const file_info& video); - raii::string _audio_body(const audio_info& audio); + raii::string _image_body(const uploaded_image& image); + raii::string _video_body(const uploaded_video& video); + raii::string _file_body(const uploaded_file& video); + raii::string _audio_body(const uploaded_audio& audio); raii::string _message_body(const raii::string_base& text); } diff --git a/include/matrix/roomcxn.hpp b/include/matrix/roomcxn.hpp index 42e6211..4f96fe0 100644 --- a/include/matrix/roomcxn.hpp +++ b/include/matrix/roomcxn.hpp @@ -59,10 +59,10 @@ namespace matrix{ //sending events raii::rjp_string send_custom_event(const raii::string_base& event, const raii::string_base& eventtype)const; raii::rjp_string send_message(const raii::string_base& text)const; - raii::rjp_string send_file(const file_info& file)const; - raii::rjp_string send_image(const image_info& image)const; - raii::rjp_string send_video(const video_info& video)const; - raii::rjp_string send_audio(const audio_info& audio)const; + raii::rjp_string send_file(const uploaded_file& file)const; + raii::rjp_string send_image(const uploaded_image& image)const; + raii::rjp_string send_video(const uploaded_video& video)const; + raii::rjp_string send_audio(const uploaded_audio& audio)const; bool send_typing(bool active, int timeout = 5000)const; bool send_read_receipt(const raii::string_base& eventid)const; diff --git a/include/matrix/upload_info.hpp b/include/matrix/upload_info.hpp index 4fbef62..5bf73fd 100644 --- a/include/matrix/upload_info.hpp +++ b/include/matrix/upload_info.hpp @@ -26,6 +26,8 @@ namespace matrix{ + struct client; + struct file_details{ raii::binary data; raii::string name; @@ -39,28 +41,107 @@ namespace matrix{ raii::string mimetype; }; - struct file_info{ - raii::rjp_string fileurl; - raii::string filename; - raii::string mimetype; - size_t filesize; - }; - struct image_info : public file_info{ - using file_info::operator=; - size_t width; - size_t height; + class uploaded_file + { + friend class matrix::client; + protected: + raii::rjp_string m_fileurl; + raii::string m_filename; + raii::string m_mimetype; + size_t m_filesize = 0; - raii::rjp_string thumburl; - raii::string thumbmime; - size_t thumb_width; - size_t thumb_height; - size_t thumbsize; + public: + constexpr uploaded_file(void) = default; + uploaded_file(const uploaded_file&) = default; + uploaded_file(uploaded_file&&) = default; + ~uploaded_file(void) = default; + + uploaded_file& operator=(const uploaded_file&) = default; + uploaded_file& operator=(uploaded_file&&) = default; + + constexpr operator bool(void)const{return m_fileurl;} + + const raii::string& mimetype(void)const{return m_mimetype;} + const raii::string& name(void)const{return m_filename;} + const raii::rjp_string& url(void)const{return m_fileurl;} + constexpr size_t size(void)const{return m_filesize;} }; - struct video_info : public image_info{ - using image_info::operator=; + + class thumbnail_info + { + friend class matrix::client; + protected: + raii::rjp_string m_url; + raii::string m_mimetype; + size_t m_width = 0; + size_t m_height = 0; + size_t m_size = 0; + + public: + constexpr thumbnail_info(void) = default; + thumbnail_info(const thumbnail_info&) = default; + thumbnail_info(thumbnail_info&&) = default; + ~thumbnail_info(void) = default; + + thumbnail_info& operator=(const thumbnail_info&) = default; + thumbnail_info& operator=(thumbnail_info&&) = default; + + constexpr operator bool(void)const{return m_url;} + + constexpr size_t width(void)const{return m_width;} + constexpr size_t height(void)const{return m_height;} + constexpr size_t size(void)const{return m_size;} + const raii::rjp_string& url(void)const{return m_url;} + const raii::string& mimetype(void)const{return m_mimetype;} }; - struct audio_info : public file_info{ - using file_info::operator=; + class uploaded_image : public uploaded_file + { + friend class matrix::client; + protected: + size_t m_width = 0; + size_t m_height = 0; + thumbnail_info m_thumb; + + public: + constexpr uploaded_image(void) = default; + uploaded_image(const uploaded_image&) = default; + uploaded_image(uploaded_image&&) = default; + ~uploaded_image(void) = default; + + uploaded_image& operator=(const uploaded_image&) = default; + uploaded_image& operator=(uploaded_image&&) = default; + /*uploaded_image& operator=(const uploaded_file& f){ + uploaded_file::operator=(f); + return *this; + } + uploaded_image& operator=(uploaded_file&& f){ + uploaded_file::operator=(std::move(f)); + return *this; + }*/ + using uploaded_file::operator=; + + constexpr size_t width(void)const{return m_width;} + constexpr size_t height(void)const{return m_height;} + constexpr auto thumb_width(void)const{return m_thumb.width();} + constexpr auto thumb_height(void)const{return m_thumb.height();} + constexpr auto thumb_size(void)const{return m_thumb.size();} + decltype(auto) thumb_url(void)const{return m_thumb.url();} + decltype(auto) thumb_mimetype(void)const{return m_thumb.mimetype();} + }; + struct uploaded_video : public uploaded_image{ + friend class matrix::client; + uploaded_video& operator=(const uploaded_file& f){ + uploaded_image::operator=(f); + return *this; + } + uploaded_video& operator=(uploaded_file&& f){ + uploaded_image::operator=(std::move(f)); + return *this; + } + }; + struct uploaded_audio : public uploaded_file{ + friend class matrix::client; + using uploaded_file::operator=; }; } diff --git a/include/raii/binary.hpp b/include/raii/binary.hpp index 5c34165..3e0260c 100644 --- a/include/raii/binary.hpp +++ b/include/raii/binary.hpp @@ -1,3 +1,21 @@ +/** + This file is a part of rexy's matrix client + Copyright (C) 2019 rexy712 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + #ifndef RAII_BINARY_HPP #define RAII_BINARY_HPP diff --git a/include/raii/binary_string_conv.hpp b/include/raii/binary_string_conv.hpp index 981e3a2..f53a5fe 100644 --- a/include/raii/binary_string_conv.hpp +++ b/include/raii/binary_string_conv.hpp @@ -1,3 +1,21 @@ +/** + This file is a part of rexy's matrix client + Copyright (C) 2019 rexy712 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + #ifndef RAII_BINARY_STRING_CONV_HPP #define RAII_BINARY_STRING_CONV_HPP diff --git a/include/raii/default_allocator.hpp b/include/raii/default_allocator.hpp index 3791347..d6e66ed 100644 --- a/include/raii/default_allocator.hpp +++ b/include/raii/default_allocator.hpp @@ -1,3 +1,21 @@ +/** + This file is a part of rexy's matrix client + Copyright (C) 2019 rexy712 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + #ifndef RAII_DEFAULT_ALLOCATOR_HPP #define RAII_DEFAULT_ALLOCATOR_HPP diff --git a/src/matrix/client.cpp b/src/matrix/client.cpp index 254b933..3646912 100644 --- a/src/matrix/client.cpp +++ b/src/matrix/client.cpp @@ -88,32 +88,32 @@ namespace matrix{ } //upload media - file_info client::upload_file(const file_details& file)const{ + uploaded_file client::upload_file(const file_details& file)const{ return _upload_file(file, raii::curl_llist{}); } - image_info client::upload_image(const image_details& file)const{ - image_info ret = {}; + uploaded_image client::upload_image(const image_details& file)const{ + uploaded_image ret = {}; raii::curl_llist headers(raii::string("Content-Type: "_ss + file.mimetype)); ret = _upload_file(file, headers); - ret.width = file.width; - ret.height = file.height; - ret.mimetype = file.mimetype; + ret.m_width = file.width; + ret.m_height = file.height; + ret.m_mimetype = file.mimetype; return ret; } - audio_info client::upload_audio(const audio_details& file)const{ - audio_info ret = {}; + uploaded_audio client::upload_audio(const audio_details& file)const{ + uploaded_audio ret = {}; raii::curl_llist headers(raii::string("Content-Type: "_ss + file.mimetype)); ret = _upload_file(file, headers); - ret.mimetype = file.mimetype; + ret.m_mimetype = file.mimetype; return ret; } - video_info client::upload_video(const video_details& file)const{ - video_info ret = {}; + uploaded_video client::upload_video(const video_details& file)const{ + uploaded_video ret = {}; raii::curl_llist headers(raii::string("Content-Type: "_ss + file.mimetype)); ret = _upload_file(file, headers); - ret.width = file.width; - ret.height = file.height; - ret.mimetype = file.mimetype; + ret.m_width = file.width; + ret.m_height = file.height; + ret.m_mimetype = file.mimetype; return ret; } @@ -126,35 +126,35 @@ namespace matrix{ return size*nmemb; } - bool client::create_thumbnail(image_info& info)const{ + bool client::create_thumbnail(uploaded_image& info)const{ image_details i; raii::string reply_header; - if(info.thumb_width > info.width || info.thumb_height > info.height){ - info.thumburl = info.fileurl; - info.thumbsize = info.filesize; - info.thumbmime = info.mimetype; + if(info.thumb_width() > info.width() || info.thumb_height() > info.height()){ + info.m_thumb.m_url = info.m_fileurl; + info.m_thumb.m_size = info.m_filesize; + info.m_thumb.m_mimetype = info.m_mimetype; } m_curl.setopt(CURLOPT_HEADERFUNCTION, _thumbnail_header_callback); m_curl.setopt(CURLOPT_HEADERDATA, &reply_header); - i.data = _get_curl_binary(m_ses->urls.file_thumbnail(m_ses->homeserver, info.fileurl, info.thumb_width, info.thumb_height, "crop"_ss)); + i.data = _get_curl_binary(m_ses->urls.file_thumbnail(m_ses->homeserver, info.m_fileurl, info.m_thumb.m_width, info.m_thumb.m_height, "crop"_ss)); m_curl.setopt(CURLOPT_HEADERFUNCTION, NULL); m_curl.setopt(CURLOPT_HEADERDATA, NULL); if(!i.data){ return false; } - i.width = info.thumb_width; - i.height = info.thumb_height; + i.width = info.thumb_width(); + i.height = info.thumb_height(); i.mimetype = std::move(reply_header); - image_info thumb_data = upload_image(i); - if(!thumb_data.fileurl) + uploaded_image thumb_data = upload_image(i); + if(!thumb_data.m_fileurl) return false; - info.thumburl = std::move(thumb_data.fileurl); - info.thumbsize = thumb_data.filesize; - info.thumbmime = std::move(thumb_data.mimetype); + info.m_thumb.m_url = std::move(thumb_data.m_fileurl); + info.m_thumb.m_size = thumb_data.m_filesize; + info.m_thumb.m_mimetype = std::move(thumb_data.m_mimetype); return true; } - bool client::create_thumbnail(video_info& info)const{ - return create_thumbnail(static_cast(info)); + bool client::create_thumbnail(uploaded_video& info)const{ + return create_thumbnail(static_cast(info)); } /******************************* @@ -182,9 +182,9 @@ namespace matrix{ memcpy(data->get()+oldlen, ptr, size*nmemb); return size*nmemb; } - file_info client::_upload_file(const file_details& file, const raii::curl_llist& header)const{ + uploaded_file client::_upload_file(const file_details& file, const raii::curl_llist& header)const{ raii::string fileurl; - file_info retval = {}; + uploaded_file retval = {}; internal_upload_data upload_data = {file.data.get(), file.data.size()}; m_curl.postreq(); m_curl.setopt(CURLOPT_POSTFIELDS, NULL); @@ -211,9 +211,9 @@ namespace matrix{ RJP_search_res res = rjp_search_member(root.get(), "content_uri", 0); if(!res.value) return {}; - retval.fileurl = res.value; - retval.filename = file.name; - retval.filesize = file.data.size(); + retval.m_fileurl = res.value; + retval.m_filename = file.name; + retval.m_filesize = file.data.size(); return retval; } } diff --git a/src/matrix/fat_strings.cpp b/src/matrix/fat_strings.cpp index 76d3151..42db123 100644 --- a/src/matrix/fat_strings.cpp +++ b/src/matrix/fat_strings.cpp @@ -23,81 +23,81 @@ namespace matrix::detail{ - raii::string _image_body(const image_info& image){ - raii::string url = raii::json_escape(image.fileurl); + raii::string _image_body(const uploaded_image& image){ + raii::string url = raii::json_escape(image.url()); const raii::string_base* thumburl; - if(image.thumburl) - thumburl = &image.thumburl; + if(image.thumb_url()) + thumburl = &image.thumb_url(); else thumburl = &url; //compiler intensive return raii::string( "{" - "\"body\":\"" + raii::json_escape(image.filename) + "\"," + "\"body\":\"" + raii::json_escape(image.name()) + "\"," "\"info\":{" - "\"h\":" + raii::itostr(image.height) + "," - "\"mimetype\":\"" + image.mimetype + "\"," - "\"size\":" + raii::itostr(image.filesize) + "," + "\"h\":" + raii::itostr(image.height()) + "," + "\"mimetype\":\"" + image.mimetype() + "\"," + "\"size\":" + raii::itostr(image.size()) + "," "\"thumnail_info\":{" - "\"h\":" + raii::itostr(image.thumb_height) + "," - "\"mimetype\":\"" + image.mimetype + "\"," - "\"size\":" + raii::itostr(image.thumbsize) + "," - "\"w\":" + raii::itostr(image.thumb_width) + + "\"h\":" + raii::itostr(image.thumb_height()) + "," + "\"mimetype\":\"" + image.mimetype() + "\"," + "\"size\":" + raii::itostr(image.thumb_size()) + "," + "\"w\":" + raii::itostr(image.thumb_width()) + "}," "\"thumbnail_url\":\"" + (*thumburl) + "\"," - "\"w\":" + raii::itostr(image.width) + + "\"w\":" + raii::itostr(image.width()) + "}," "\"msgtype\":\"m.image\"," "\"url\":\"" + url + "\"" "}"); } - raii::string _video_body(const video_info& video){ + raii::string _video_body(const uploaded_video& video){ return raii::string( "{" - "\"body\":\"" + raii::json_escape(video.filename) + "\"," + "\"body\":\"" + raii::json_escape(video.name()) + "\"," "\"info\":{" - "\"h\":" + raii::itostr(video.height) + "," - "\"mimetype\":\"" + video.mimetype + "\"," - "\"size\":" + raii::itostr(video.filesize) + "," + "\"h\":" + raii::itostr(video.height()) + "," + "\"mimetype\":\"" + video.mimetype() + "\"," + "\"size\":" + raii::itostr(video.size()) + "," "\"thumnail_info\":{" - "\"h\":" + raii::itostr(video.thumb_height) + "," + "\"h\":" + raii::itostr(video.thumb_height()) + "," "\"mimetype\":\"image/jpeg\"," - "\"size\":" + raii::itostr(video.thumbsize) + "," - "\"w\":" + raii::itostr(video.thumb_width) + + "\"size\":" + raii::itostr(video.thumb_size()) + "," + "\"w\":" + raii::itostr(video.thumb_width()) + "}," - "\"thumbnail_url\":\"" + video.thumburl + "\"," - "\"w\":" + raii::itostr(video.width) + + "\"thumbnail_url\":\"" + video.thumb_url() + "\"," + "\"w\":" + raii::itostr(video.width()) + "}," "\"msgtype\":\"m.video\"," - "\"url\":\"" + raii::json_escape(video.fileurl) + "\"" + "\"url\":\"" + raii::json_escape(video.url()) + "\"" "}"); } - raii::string _file_body(const file_info& file){ + raii::string _file_body(const uploaded_file& file){ return raii::string( "{" - "\"body\":\"" + raii::json_escape(file.filename) + "\"," + "\"body\":\"" + raii::json_escape(file.name()) + "\"," "\"info\":{" - "\"size\":" + raii::itostr(file.filesize) + + "\"size\":" + raii::itostr(file.size()) + "}," "\"msgtype\":\"m.file\"," - "\"body\":\"" + file.filename + "\"," - "\"url\":\"" + raii::json_escape(file.fileurl) + "\"" + "\"body\":\"" + file.name() + "\"," + "\"url\":\"" + raii::json_escape(file.url()) + "\"" "}"); } - raii::string _audio_body(const audio_info& audio){ + raii::string _audio_body(const uploaded_audio& audio){ return raii::string( "{" - "\"body\":\"" + raii::json_escape(audio.filename) + "\"," + "\"body\":\"" + raii::json_escape(audio.name()) + "\"," "\"info\":{" - "\"mimetype\":\"" + raii::json_escape(audio.mimetype) + "\"," - "\"size\":" + raii::itostr(audio.filesize) + + "\"mimetype\":\"" + raii::json_escape(audio.mimetype()) + "\"," + "\"size\":" + raii::itostr(audio.size()) + "}," "\"msgtype\":\"m.audio\"," - "\"body\":\"" + audio.filename + "\"," - "\"url\":\"" + raii::json_escape(audio.fileurl) + "\"" + "\"body\":\"" + audio.name() + "\"," + "\"url\":\"" + raii::json_escape(audio.url()) + "\"" "}"); } diff --git a/src/matrix/roomcxn.cpp b/src/matrix/roomcxn.cpp index 0791b5e..c4cea39 100644 --- a/src/matrix/roomcxn.cpp +++ b/src/matrix/roomcxn.cpp @@ -74,16 +74,16 @@ namespace matrix{ raii::rjp_string roomcxn::send_message(const raii::string_base& text)const{ return _send_message(detail::_message_body(text)); } - raii::rjp_string roomcxn::send_file(const file_info& file)const{ + raii::rjp_string roomcxn::send_file(const uploaded_file& file)const{ return _send_message(detail::_file_body(file)); } - raii::rjp_string roomcxn::send_image(const image_info& image)const{ + raii::rjp_string roomcxn::send_image(const uploaded_image& image)const{ return _send_message(detail::_image_body(image)); } - raii::rjp_string roomcxn::send_video(const video_info& video)const{ + raii::rjp_string roomcxn::send_video(const uploaded_video& video)const{ return _send_message(detail::_video_body(video)); } - raii::rjp_string roomcxn::send_audio(const audio_info& audio)const{ + raii::rjp_string roomcxn::send_audio(const uploaded_audio& audio)const{ return _send_message(detail::_audio_body(audio)); } bool roomcxn::send_typing(bool active, int timeout)const{ diff --git a/src/raii/binary.cpp b/src/raii/binary.cpp index c7c4dac..aa0aac5 100644 --- a/src/raii/binary.cpp +++ b/src/raii/binary.cpp @@ -1,3 +1,21 @@ +/** + This file is a part of rexy's matrix client + Copyright (C) 2019 rexy712 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + #include "raii/binary.hpp" namespace raii{