author | Michael Krelin <hacker@klever.net> | 2013-02-13 22:38:54 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2013-02-13 22:38:54 (UTC) |
commit | d6545bd95153a5e41cdae441643f4e4a0af94a49 (patch) (unidiff) | |
tree | 51e1ae7f4a3cba4de21e9c62b28c55d414064566 | |
parent | dd545573337e3c54ad4c2c64d72f750ad03aa2c9 (diff) | |
download | iii-d6545bd95153a5e41cdae441643f4e4a0af94a49.zip iii-d6545bd95153a5e41cdae441643f4e4a0af94a49.tar.gz iii-d6545bd95153a5e41cdae441643f4e4a0af94a49.tar.bz2 |
introduce mimewriter classess for gsoap mime streaming
Signed-off-by: Michael Krelin <hacker@klever.net>
-rw-r--r-- | src/eyetil.cc | 10 | ||||
-rw-r--r-- | src/eyetil.h | 22 |
2 files changed, 32 insertions, 0 deletions
diff --git a/src/eyetil.cc b/src/eyetil.cc index 6ccc4ae..fba8724 100644 --- a/src/eyetil.cc +++ b/src/eyetil.cc | |||
@@ -182,12 +182,22 @@ bool tarchive_t::read_data_into_fd(int fd) { | |||
182 | assert(a); | 182 | assert(a); |
183 | return archive_read_data_into_fd(a,fd)==ARCHIVE_OK; | 183 | return archive_read_data_into_fd(a,fd)==ARCHIVE_OK; |
184 | } | 184 | } |
185 | 185 | ||
186 | 186 | ||
187 | binary_t integrity_digest(const void *ptr,size_t size,const std::string& ukey) { | 187 | binary_t integrity_digest(const void *ptr,size_t size,const std::string& ukey) { |
188 | md5_digester rv; | 188 | md5_digester rv; |
189 | std::transform( (block512_t*)ptr, ((block512_t*)ptr)+size/sizeof(block512_t), | 189 | std::transform( (block512_t*)ptr, ((block512_t*)ptr)+size/sizeof(block512_t), |
190 | rv.updater<uint16_t>(), block512_t::tcpcksum ); | 190 | rv.updater<uint16_t>(), block512_t::tcpcksum ); |
191 | rv.update( binary_t(ukey) ); | 191 | rv.update( binary_t(ukey) ); |
192 | return rv.final(); | 192 | return rv.final(); |
193 | } | 193 | } |
194 | |||
195 | mimewrite_tarfile::mimewrite_tarfile(tmpdir_t& d) { | ||
196 | f.open((fn=d.get_file("the-tarfile.tar")).c_str(),std::ios_base::in|std::ios_base::out|std::ios_base::trunc|std::ios_base::binary); | ||
197 | } | ||
198 | mimewrite_tarfile::~mimewrite_tarfile() { | ||
199 | unlink(fn.c_str()); | ||
200 | } | ||
201 | int mimewrite_tarfile::write(const char *buf,size_t len) { | ||
202 | return f.write(buf,len) ? (idigest.update(buf,len),SOAP_OK) : SOAP_ERR; | ||
203 | } | ||
diff --git a/src/eyetil.h b/src/eyetil.h index 8784cb4..64948d0 100644 --- a/src/eyetil.h +++ b/src/eyetil.h | |||
@@ -1,20 +1,22 @@ | |||
1 | #ifndef __EYETIL_H | 1 | #ifndef __EYETIL_H |
2 | #define __EYETIL_H | 2 | #define __EYETIL_H |
3 | 3 | ||
4 | #include <vector> | 4 | #include <vector> |
5 | #include <string> | 5 | #include <string> |
6 | #include <fstream> | ||
6 | #include <archive.h> | 7 | #include <archive.h> |
7 | #include <archive_entry.h> | 8 | #include <archive_entry.h> |
8 | #include "openssl/md5.h" | 9 | #include "openssl/md5.h" |
10 | #include "soapH.h" | ||
9 | 11 | ||
10 | struct throwable_exit { | 12 | struct throwable_exit { |
11 | int rc; | 13 | int rc; |
12 | throwable_exit(int rc_) : rc(rc_) { } | 14 | throwable_exit(int rc_) : rc(rc_) { } |
13 | }; | 15 | }; |
14 | 16 | ||
15 | class binary_t : public std::vector<unsigned char> { | 17 | class binary_t : public std::vector<unsigned char> { |
16 | public: | 18 | public: |
17 | binary_t() { } | 19 | binary_t() { } |
18 | binary_t(size_type n) : std::vector<unsigned char>(n) { } | 20 | binary_t(size_type n) : std::vector<unsigned char>(n) { } |
19 | binary_t(const std::string& h) { from_hex(h); } | 21 | binary_t(const std::string& h) { from_hex(h); } |
20 | binary_t(const void *d,size_t s) { from_data(d,s); } | 22 | binary_t(const void *d,size_t s) { from_data(d,s); } |
@@ -101,16 +103,36 @@ class tarchive_t { | |||
101 | struct archive_entry *e; | 103 | struct archive_entry *e; |
102 | 104 | ||
103 | tarchive_t(void *p,size_t s); | 105 | tarchive_t(void *p,size_t s); |
104 | ~tarchive_t(); | 106 | ~tarchive_t(); |
105 | 107 | ||
106 | bool read_next_header(); | 108 | bool read_next_header(); |
107 | 109 | ||
108 | std::string entry_pathname(); | 110 | std::string entry_pathname(); |
109 | 111 | ||
110 | bool read_data_into_fd(int fd); | 112 | bool read_data_into_fd(int fd); |
111 | }; | 113 | }; |
112 | 114 | ||
115 | struct mimewrite_base { | ||
116 | virtual ~mimewrite_base() { } | ||
117 | |||
118 | virtual int write(const char *buf,size_t len) = 0; | ||
119 | virtual void close() = 0; | ||
120 | }; | ||
121 | struct mimewrite_string : public mimewrite_base { | ||
122 | std::string str; | ||
123 | int write(const char *buf,size_t len) { str.append(buf,len); return SOAP_OK; }; | ||
124 | void close() { } | ||
125 | }; | ||
126 | struct mimewrite_tarfile : public mimewrite_base { | ||
127 | std::string fn; | ||
128 | std::fstream f; | ||
129 | integrity_digester idigest; | ||
130 | mimewrite_tarfile(tmpdir_t& d); | ||
131 | ~mimewrite_tarfile(); | ||
132 | int write(const char *buf,size_t len); | ||
133 | void close() { } | ||
134 | }; | ||
113 | binary_t integrity_digest(const void *ptr,size_t size, | 135 | binary_t integrity_digest(const void *ptr,size_t size, |
114 | const std::string& ukey); | 136 | const std::string& ukey); |
115 | 137 | ||
116 | #endif /* __EYETIL_H */ | 138 | #endif /* __EYETIL_H */ |