Line data Source code
1 : /*
2 : Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file
3 :
4 : This file is part of libzmq, the ZeroMQ core engine in C++.
5 :
6 : libzmq is free software; you can redistribute it and/or modify it under
7 : the terms of the GNU Lesser General Public License (LGPL) as published
8 : by the Free Software Foundation; either version 3 of the License, or
9 : (at your option) any later version.
10 :
11 : As a special exception, the Contributors give you permission to link
12 : this library with independent modules to produce an executable,
13 : regardless of the license terms of these independent modules, and to
14 : copy and distribute the resulting executable under terms of your choice,
15 : provided that you also meet, for each linked independent module, the
16 : terms and conditions of the license of that module. An independent
17 : module is a module which is not derived from or based on this library.
18 : If you modify this library, you must extend this exception to your
19 : version of the library.
20 :
21 : libzmq is distributed in the hope that it will be useful, but WITHOUT
22 : ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
23 : FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
24 : License for more details.
25 :
26 : You should have received a copy of the GNU Lesser General Public License
27 : along with this program. If not, see <http://www.gnu.org/licenses/>.
28 : */
29 :
30 : #include "precompiled.hpp"
31 : #include <stdlib.h>
32 : #include <string.h>
33 :
34 : #include "platform.hpp"
35 : #ifdef ZMQ_HAVE_WINDOWS
36 : #include "windows.hpp"
37 : #endif
38 :
39 : #include "raw_decoder.hpp"
40 : #include "err.hpp"
41 :
42 33 : zmq::raw_decoder_t::raw_decoder_t (size_t bufsize_) :
43 66 : allocator( bufsize_, 1 )
44 : {
45 33 : int rc = in_progress.init ();
46 33 : errno_assert (rc == 0);
47 33 : }
48 :
49 99 : zmq::raw_decoder_t::~raw_decoder_t ()
50 : {
51 33 : int rc = in_progress.close ();
52 33 : errno_assert (rc == 0);
53 66 : }
54 :
55 107 : void zmq::raw_decoder_t::get_buffer (unsigned char **data_, size_t *size_)
56 : {
57 107 : *data_ = allocator.allocate();
58 107 : *size_ = allocator.size();
59 107 : }
60 :
61 63 : int zmq::raw_decoder_t::decode (const uint8_t *data_, size_t size_,
62 : size_t &bytes_used_)
63 : {
64 : int rc = in_progress.init ((unsigned char*)data_, size_,
65 : shared_message_memory_allocator::call_dec_ref,
66 126 : allocator.buffer (),
67 189 : allocator.provide_content ());
68 :
69 : // if the buffer serves as memory for a zero-copy message, release it
70 : // and allocate a new buffer in get_buffer for the next decode
71 63 : if (in_progress.is_zcmsg ()) {
72 33 : allocator.advance_content();
73 33 : allocator.release();
74 : }
75 :
76 63 : errno_assert (rc != -1);
77 63 : bytes_used_ = size_;
78 63 : return 1;
79 : }
|