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{