Commit Graph

367 Commits

Author SHA1 Message Date
Marcin Gibula 76cf06d0ba Comment fix 2018-05-14 21:34:43 +02:00
Marcin Gibula 2aa55b83c7 Replace old API with DeferredConfirm class 2018-05-14 21:12:34 +02:00
Marcin Gibula bf1caa1eae Add DeferredConfirm class 2018-05-14 21:05:49 +02:00
Marcin Gibula a90c620709 Add BasicAckFrame and BasicNackFrame to class list 2018-05-14 21:05:07 +02:00
Marcin Gibula eeee1c3c5f Rename setConfirmMode() to confirmSelect() 2018-05-14 12:59:20 +02:00
Marcin Gibula e0b04ad7e0 Remove messageCounter() 2018-05-14 12:55:15 +02:00
Emiel Bruijntjes 976e948cb0 added comments 2018-05-11 11:58:55 +02:00
Mathias Devos 9bb20437d0 Fixed unused parameter warnings in header files 2018-05-11 08:52:43 +08:00
Dirkco du Plessis 5ec49d5b8a Added CountCallback to support 32bit unsigned int passed in defferedget. 2018-04-23 08:30:37 +01:00
Peter A. Bigot 4d34c582d0 numericfield: cleanup for floating point types
Rework so floating point values are supported to the same degree as
integer values.

Closes #214
2018-04-22 16:30:37 -05:00
Dirkco du Plessis 1479922901 Fix MSVC compile warning C4800 for bitwise operation resulting in int to boolean assignment.
Fix MSVC compile warning C4244 possible loss of data. Possible data loss from uint64_t to uint32_t.
2018-04-22 15:53:52 +01:00
Peter A. Bigot d0b5189d1e Envelope: ensure const objects cannot be changed through _body
In commit 00b81949d3 where Message and
Envelope objects were made uncopiable the Envelope _body member was
changed from const char * to char * and a const_cast introduced to
remove the qualifier from the pointer passed to the constructor.

This technically produces undefined behavior when constructing an
Envelope() to publish data from a const buffer.  It also risks future
bugs if a new subclass of Envelope mutates const objects through the
_body pointer.

Envelope does not need to support mutable or owned content.  Move this
capability down to Message which is used in restricted situations where
the body size is set once and its content built up piecewise.
2018-04-20 18:27:53 -05:00
Emiel Bruijntjes d857fbafde better comment for the channel::consume() call, the comment about the consumer tag was wrong (fixes #211) 2018-04-19 09:56:35 +02:00
theirix a624bc872c Added virtual dtor to OutBuffer 2018-04-18 15:46:46 +03:00
theirix 539128e559 Replaced C-casts with const_cast for Envelope::body_ 2018-04-18 14:59:35 +03:00
Aljar Meesters 1db6ed13a6 libev implementation was incorrect when one single handler was used to manage multiple connections 2018-04-12 12:05:22 +02:00
Marcin Gibula bfd91b6ab5 Merge with upstream 2018-04-10 10:30:01 +02:00
Emiel Bruijntjes 69a201e741 optimizid dealing with ssl connections by not going back to the event loop that often, and prevented that object was staying in send state if it was endlessly sending data and not receiving anything, found this out when working on issue #207 2018-04-05 11:10:55 +02:00
Emiel Bruijntjes b26058f3e2 renamed bytesQueued() to queued() 2018-04-01 22:34:15 +02:00
Mike Playle 8800d2917e Add method to return the amount of queued outgoing data 2018-04-01 10:54:05 +01:00
tilsche cf7d2e49ff allow for a clean shutdown of asio connections
remove heartbeat timer on close
make sure only weak references are stored in bindings even below C++17
2018-03-12 12:07:09 +01:00
Emiel Bruijntjes f1c32242f7 Merge branch 'master' of github.com:CopernicaMarketingSoftware/AMQP-CPP 2018-03-10 14:56:18 +01:00
Emiel Bruijntjes d2b2d5af14 shared-ptr has been turned into a unique-ptr for the tcp-state 2018-03-10 14:55:57 +01:00
Emiel Bruijntjes 11786ff10b update docblock in boostasio class to warn users about the possible low quality of the code 2018-03-10 14:55:23 +01:00
Emiel Bruijntjes 23cae9de84 fixed Address constructor 2018-03-10 10:32:48 +01:00
Emiel Bruijntjes d81565fe6a fixed that stream operator of address wrote the port number when the default amqps port was used 2018-03-10 10:31:40 +01:00
Emiel Bruijntjes 1ee18911ce fixed writing address to std::stream 2018-03-10 10:20:52 +01:00
Emiel Bruijntjes 367de51d77 added method to intercept tls handshakes, and to verify certificates 2018-03-10 00:59:14 +01:00
Emiel Bruijntjes 4c2b8ff68e added ability to set the handle to the openssl library (so that programs that load openssl via dlopen() can still use amqp-cpp) 2018-03-09 15:08:52 +01:00
Emiel Bruijntjes f23bcf19f1 improved docblocks in tcpstate.h header file, when an error or closed is reported to user space, the _handler variable is now reset to prevent that it will be used to report more than once (we still need to check if this does not trigger other errors), and the state object is no longer destructed after a reportClosed() call, so that it can clean up nicely (which we need to the tls shutdown anyway) 2018-03-08 10:02:42 +01:00
Aleksandr Serbin b0adbb1878 Fixed MinGW compilation on Windows 2018-03-06 18:58:02 +02:00
Emiel Bruijntjes a025e6c1c9 breaking change: the linux-tcp module is no longer included by default, applications that rely on this now have to explicitly include amcpcpp/linux_tcp 2018-03-06 08:46:17 +01:00
Emiel Bruijntjes 5b8841c937 removed more tabs 2018-03-06 08:45:12 +01:00
Emiel Bruijntjes 69c615d0a4 removed tcp prefix from all ssl related classes 2018-03-06 08:39:42 +01:00
Emiel Bruijntjes 463eed89c0 work in progress on closing ssl connections 2018-03-05 22:24:19 +01:00
Tamas Elekes e46dfcf3b8 work in progress on ssl support for the AMQP-CPP library 2018-03-05 17:29:37 +01:00
Tamas Elekes 342268e50a support for amqps:// addresses in the AMQP::Address class (although it does not yet make a real secure connection) 2018-03-02 13:53:00 +01:00
Tamas Elekes ab817384b1 fixed auth method prefix extra / char 2018-03-02 12:54:09 +01:00
Tamas Elekes b9047f5ea7 added ampqs:// parsing to address 2018-03-02 12:14:43 +01:00
Emiel Bruijntjes 41239a1952 fixed to make returning message functional, and added test code 2018-03-01 22:54:50 +01:00
Emiel Bruijntjes 1ccd93cc5e final step (although untested) for handling returned messages 2018-03-01 22:27:27 +01:00
Emiel Bruijntjes 1f3500cee8 breaking changes:
channel.publish() now returns a DeferredConsumer object on which callbacks can be installed for handling returned messages,
channel.get().onSize() has a different behavior: it now reports the message size (and no longer the queue size),
channel.get().onCount() has been added: it reports the queue size (this used to be the onSize() method),
channel.consume().onSize() method has been added to find out the size of the upcoming message
2018-03-01 21:12:53 +01:00
Emiel Bruijntjes f39df772d3 breaking changes:
channel.publish() now returns a DeferredConsumer object on which callbacks can be installed for handling returned messages,
channel.get().onSize() has a different behavior: it now reports the message size (and no longer the queue size),
channel.get().onCount() has been added: it reports the queue size (this used to be the onSize() method),
channel.consume().onSize() method has been added to find out the size of the upcoming message
2018-03-01 21:12:50 +01:00
Emiel Bruijntjes ef76876d67 refactored code to make room for a deferredpublisher class (which will also use the deferredreceiver base class) 2018-03-01 18:07:18 +01:00
Emiel Bruijntjes 520fe40201 refactored handling of incoming messages from consume and get operations, to prepare for future handling of returned messages and publisher confirms. this also implies a small change to the api: the begin-callback when a message is received now also gets the original exchange and routing key (which could be useful) 2018-03-01 17:34:27 +01:00
Emiel Bruijntjes 3ccc6af475 added deferredreceiver files (forgotter in prev commit) 2018-02-27 05:09:03 +01:00
Emiel Bruijntjes e0feb17ecc renamed deferredconsumerbase into deferredreceiver, because it is not only a base class for the consumer, but also for other receiving operations: get requests and in the future also for returned messages 2018-02-27 05:08:21 +01:00
Emiel Bruijntjes ec327de396 less conservative caching of outgoing data. This fixes #184 2018-02-07 10:08:32 +01:00
Emiel Bruijntjes f5540e9af2 fixed autodelete flag for declaring an exchange and added support for internal exchange. this fixes #183 2018-02-06 21:54:56 +01:00
Steven Geddis accc1810a0 remove timer interval from ctor init list 2018-02-01 15:31:19 +01:00
Steven Geddis 5a853134aa remove second ctor with heartbeat interval (extend class instead). Change private to protected to allow LibBoostAsioHandler to be extended. 2018-02-01 15:27:59 +01:00
Steven Geddis 33c8e76a7e correct comment 2018-02-01 13:11:23 +01:00
Steven Geddis ae3b94fe92 use custom heartbeat interval outright, if set. 2018-02-01 13:05:41 +01:00
Steven Geddis b713d48bb9 add second constructor with heartbeat interval; apply modern cpp typedefs; Add comments; 2018-02-01 12:44:48 +01:00
zerodefect af1b54e268
Removed double inclusion of boost/function.hpp 2018-01-30 11:45:40 +00:00
zerodefect 1e9d1360f7 Fixed build error. 2018-01-30 10:43:08 +00:00
zerodefect 4b2c423896 Build examples now with travis-ci to ensure new changes don't break existing code. Fixed warnings as a result of lambda captures. 2018-01-30 10:07:27 +00:00
Aljar Meesters c287382770 fix includes because existing code was no longer compiling after the latest changes 2018-01-30 10:45:16 +01:00
Emiel Bruijntjes 3d823adb51 add include for boost/function.hpp 2018-01-30 09:27:43 +01:00
Aart Stuurman 99974d36d3 fixed strcasecmp error on windows platforms. 2018-01-29 17:29:27 +01:00
Aart Stuurman 0995b3e0ec fixed htonll compile error on windows. 2018-01-29 17:12:06 +01:00
Aart Stuurman f64b705c19 Merge branch 'clean-build' of https://github.com/surgura/AMQP-CPP into clean-build 2018-01-28 22:20:18 +01:00
Aart Stuurman 62065431b3 forgot file 2018-01-26 22:42:56 +01:00
Aart Stuurman 99cc34d922 Added linux_tcp.h so we can now once again use the tcp implementation of the handler. 2018-01-26 22:42:28 +01:00
Aart Stuurman f25efd2235 Merge https://github.com/CopernicaMarketingSoftware/AMQP-CPP into travis 2018-01-25 18:17:43 +01:00
Steven Geddis 959e6238ae code formatting; capture strand by copy in timer handler 2018-01-24 15:06:35 +01:00
Steven Geddis 8477fbb272 add PTR_FROM_THIS define; remove io_handler code duplication via read/write/dispatch wrapper functions. 2018-01-24 13:24:43 +01:00
Aart Stuurman cf7261add5 Reordered public include files so they are now in include/amqpcpp/. 2018-01-24 01:58:18 +01:00
Aart Stuurman 4c7a71e3a6 Fixed compile error on g++ caused by fixing warning. 2018-01-24 00:59:46 +01:00
Aart Stuurman b211fc7779 fixed 32 bit warnings. 2018-01-24 00:38:07 +01:00
Aart Stuurman 4072430fb3 Attempt to fix warning C4267 2018-01-24 00:19:55 +01:00
Steven Geddis d71040b2e5 fix bad opening comment block 2018-01-23 19:16:44 +01:00
Aart Stuurman 27f765b5f7 linux tcp is now opt-out instead of opt-in(to keep compatibility with the original lib). 2018-01-23 19:15:10 +01:00
Steven Geddis 4652a9cbdf libboostasio.h does not compile with clang-3.9 due to following error when compile if cpp17 preprocessor check: embedding a directive within macro arguments has undefined behavior [-Werror,-Wembedded-directive]. Fix this by moving the bind away from preprocessor macro. Replace the STRAND_SOCKET_HANDLER, STRAND_TIMER_HANDLER macros with template functions. 2018-01-23 18:55:46 +01:00
Aart Stuurman 5701d28b2b added BUILD_TCP option to build the linux sockets implementation. 2018-01-23 18:49:59 +01:00
Aart Stuurman 001dfaa7e0 - Moved linux specific TCP implementation to a seperate folder and removed it from default build. Does not yet build correctly if you want that.
- Fixed conversion warnings from <some integer> type to uint32_t, which happens a lot around here. This is no functional change, just making it explicit so the compiler doesn't warn.
2018-01-23 16:47:53 +01:00
Alessandro Pischedda fd14790166 fix boost::placeholders undefined error and remain well explicited than use just '_1' or '_2' 2018-01-18 10:08:56 +01:00
Alessandro Pischedda 97124dc604
Fix compile
remove ?boost::placeholders::' .
2018-01-17 15:20:04 +01:00
Emiel Bruijntjes b25bd583a3 added operator< to AMQP::Address 2017-12-29 19:27:40 +01:00
Emiel Bruijntjes f05aba0782 added TcpConnection::fileno() to expose the internal filedescriptor / socket 2017-12-12 17:10:51 +01:00
Emiel Bruijntjes c63f62189e better docblocks so that future users will understand the difference between the callbacks for a consumer (mentioned in issue #156) 2017-11-21 16:45:05 +01:00
Emiel Bruijntjes 60466cc6bf Updated comment for Channel and TcpChannel constructors (to prevent issues like #154) 2017-11-17 11:38:54 +01:00
Emiel Bruijntjes d75ae2ebe1 fix compile issue because comma was missing 2017-10-24 12:54:29 +02:00
zerodefect 034e72bbc2 Added example/test application to demonstrate boost asio io_service handler. 2017-10-23 11:40:49 +01:00
zerodefect 5410f1abdd Replaced tabs with spaces in LibBoostAsioHandler 2017-10-19 16:14:21 +01:00
zerodefect cdd9918e6a Cleaned up docs/comments in LibBoostAsioHandler 2017-10-19 16:06:41 +01:00
zerodefect a9daf7e769 Added strand to LibBoostAsioHandler.h to ensure that 1 thread goes through the 'gate' (from the io_service set of threads) at any one time. 2017-10-19 15:59:40 +01:00
zerodefect 12ffe885c1 Cleaned up existing boost handler. There were a few bits that needed tidying up. 2017-10-19 14:44:29 +01:00
zerodefect e3e0c6da19 Added timer boost asio event handler to perform health checks. 2017-10-13 09:26:32 +01:00
zerodefect d1b2139af0 Cleaned up the handler upon conducting some additional testing. 2017-10-12 17:11:38 +01:00
zerodefect e9cb9fbe92 Renamed libboostasio.hpp to libboostasio.h. Added header to copied files as part of install. 2017-10-12 11:41:41 +01:00
zerodefect 204b68401e Added boost asio TCP handler for use on POSIX-based systems 2017-10-12 11:22:47 +01:00
Emiel Bruijntjes 27ac6aeea5 added operator<< to write a amqp address to a stream 2017-06-21 09:44:52 +02:00
Emiel Bruijntjes acd6698db3 the libev timer no longer takes ownership over the event loop 2017-06-21 09:35:48 +02:00
Emiel Bruijntjes 49337d078d heartbeats will now only be sent if the connection is idle 2017-06-19 10:24:03 +02:00
Emiel Bruijntjes fda26f20f4 update the readme, heartbeats are now disabled by default, only the libev implementation has enabled them, resolves #137 2017-06-16 11:17:13 +01:00
Emiel Bruijntjes 90d9946474 implemented heartbeats for libev 2017-06-16 10:36:34 +01:00
Emiel Bruijntjes a091921e88 added connection::heartbeat() method, userspace programs are responsible for calling this method once every 60 seconds 2017-06-16 10:14:42 +01:00
Marcin Gibula 3ab9eed268 Simplify message counter logic 2017-06-08 23:41:55 +02:00
Marcin Gibula f0712cfdc2 Add ACK and NACK callbacks to Channel 2017-06-08 22:50:45 +02:00
Marcin Gibula 30e652c669 Add Channel::setConfirmMode() and Channel::messageCounter() methods 2017-06-08 22:19:55 +02:00
Marcin Gibula c7a12d22c1 Add confirm.select and confirm.select-ok frames 2017-06-08 22:00:28 +02:00
Daan Mulder b2877434cf fix new bug in parsing amqp:// address where the default vhost was incorrectly overwritten 2017-05-11 13:59:07 +02:00
Emiel Bruijntjes 8501f19c0b fixed parsing amqp:// address 2017-05-04 15:51:23 +02:00
RafalGoslawski 5e895f3b9f Update CMakeLists.txt. fixes #123 2017-05-04 11:34:17 +02:00
Emiel Bruijntjes d7214d1373 added Addresses class to parse a comma separated list of addresses 2017-05-01 22:06:28 +02:00
Emiel Bruijntjes 2a249ae7ea fixed issue with parsing the password in a amqp:// string 2017-05-01 21:59:45 +02:00
Emiel Bruijntjes af6886be92 added comparison operators to Address and Login classes 2017-04-26 09:00:01 +02:00
Emiel Bruijntjes 6f6c98f453 fixed compile issue 2017-03-16 11:36:35 +01:00
Emiel Bruijntjes 0d9b4c8bba reinstalled channel methods that were removed to stay compatible with previous amqp-cpp release 2017-03-13 14:02:33 +01:00
Okke bdae991324 Moved header files to include/ because of broken header dependencies 2017-03-09 11:53:13 +01:00
Emiel Bruijntjes 71eba4c5d3 prevent copying of buffers 2017-03-09 09:25:26 +01:00
Emiel Bruijntjes 1f5f641d8b we now use passthrough buffers, so we no longer have to dynamically allocate a buffer for each and every outgoing message 2017-03-09 00:18:53 +01:00
Emiel Bruijntjes e59d0ff387 removed envelope::message() method because it is expensive 2017-03-08 14:23:05 +01:00
Emiel Bruijntjes 00b81949d3 the AMQP::Message and AMQP::Envelope objects can now longer be copied or moved, and the signatures for creating an envelope and publishing a message have been made much more strict. This could be a API breaking change, to the version number should be upped 2017-03-08 13:32:51 +01:00
Okke c6608cee0a Added even more debug code for the channelimpl class 2017-03-07 10:10:11 +01:00
Okke 055431de6e Fixed compilation issue due to recent changes in ChannelImpl 2017-03-03 12:56:54 +01:00
Emiel Bruijntjes d3c0ea293b better error message if channel is in an error state 2017-03-02 12:09:08 +01:00
Emiel Bruijntjes ed2ffd3f03 added method tcpconnection::flush() 2016-09-19 10:19:06 +02:00
Emiel Bruijntjes 5bb7b1a36f added const char * constructors to AMQP::Login class 2016-09-15 12:53:55 +02:00
Emiel Bruijntjes 173225071e we no longer use "emit" for method names, because it seems to conflict with the Qt library that uses emit as some sort of macro 2016-09-10 20:36:06 +02:00
Martijn Otto afb04a8f30 Re-introduced the casting operators with a note explaining why we need this. 2016-09-05 10:11:31 +02:00
theirix c6643062b6 Removed unneeded self-cast operators
They are not used and caused a lot of warnings
while compiling and using AMQP-CPP
2016-09-02 22:33:12 +03:00
Emiel Bruijntjes 383914c0c7 Merge pull request #80 from theirix/sigpipe-osx
Avoid SIGPIPE on OS X without MSG_NOSIGNAL
2016-07-27 05:09:44 -04:00
Martijn Otto 53dd7c74c5 Merge pull request #86 from ogapo/master
libuv drop in implementation for TcpHandler
2016-07-18 15:12:24 +02:00
David Nikdel fd69a4c01d map closed sockets to both read and write
- this is more consistent with libev so probably will match what existing code expects
2016-07-16 20:43:19 -04:00
David Nikdel 584d92e751 can't use struct elaboration with typedef 2016-07-16 20:30:03 -04:00
David Nikdel 1e1ec0c133 Update libuv.h
- if status is not ok, report that as readable
- no need to stop uv_poll_t before changing events according to the docs
2016-07-16 20:27:00 -04:00
javeme 4b7874c5b6 Implement copy constructor for class Monitor
To support the instance copy of Monitor like the following:
    AMQP::Monitor monitor(consumer);
    consumer->bindExchange(exchange, AMQP::direct).onSuccess([&, monitor](){
        // do something when the consumer is ready!
        if(monitor.valid())
            consumer->doSomething();
    });
2016-07-17 00:54:42 +08:00
David Nikdel b8d2c0c600 fix casting 2016-07-14 23:49:31 -04:00
David Nikdel 5042b699bd create libuv.h based on libev.h 2016-07-14 23:30:43 -04:00
theirix 66f2001c7b Avoid SIGPIPE on OS X without MSG_NOSIGNAL
OS X does not have Linux-specific option MSG_NOSIGNAL.
SIGPIPE can be avoided on OS X by using sockopt SO_NOSIGPIPE.
Credits: https://noahdesu.github.io/2014/01/16/port-sendmsg.html
2016-07-10 21:44:14 +03:00
David van Erkelens dddd16b74d Make sure single gets are processed correctly as well 2016-07-05 16:39:12 +02:00
Martijn Otto 5d741bfd2d Merge branch 'master' of github.com:CopernicaMarketingSoftware/AMQP-CPP 2016-07-04 10:14:00 +02:00
Martijn Otto 5b40c04f2a Added documentation about missing RabbitMQ functionality 2016-07-04 10:13:50 +02:00
Martijn Otto c055b1a439 Merge pull request #77 from javeme/return-type-of-waiting
Correct the returning type of Connection::waiting()
2016-07-04 09:41:54 +02:00
javeme 5cff314d88 Correct the returning type of Connection::waiting()
The returning type of Connection::waiting() should be bool,
but currently it's size_t type.
2016-07-03 21:35:44 +08:00
Maksim Kuzevanov 1dcbc33b53 make it compile with cmake 2.8/gcc 4.7.3 2016-07-01 17:29:35 +03:00
Martijn Otto b91e0589f6 Updated cmake lists and added include, closes issue #75 2016-06-28 14:14:07 +02:00
Martijn Otto 2f1851728c Merge pull request #72 from XeCycle/fionread-solaris
Some portability fixes for Solaris-like systems
2016-06-27 10:57:24 +02:00
Martijn Otto d911d71dfa Removed the ugly typedef 2016-06-27 10:52:58 +02:00
javeme 5c3ba7b00a Program crashes when receiving a message due to memory corruption
crashes due to the wrong way using aligned_storage.

Steps to reproduce:
1. Start a consumer
  channel.consume(queue, tag).onMessage(msgCallback)
2. Send a message to the consumer
3. The program crashes

Environment:
Windows 7 / VS2010

The reason:
The Windows prompted to memory corruption, I found some strange phenomenon
about stack_ptr<Message>, such as:
  1.sizeof(stack_ptr<Message>) is equal to 2
  2.stack_ptr._initialized becomes true after construct() called (actually,
    it never has been assigned true, please see [1])

Finally I found that the root cause was stack_ptr._data, we directly used
aligned_storage rather than aligned_storage::type[2] as the type of _data.
so the _data was just an empty struct, and subsequent operations were
performed in illegal memory. It eventually led to the crash.

This patch we fixed the bug and add "_initialized = true" at the end of the
method stack_ptr::construct().

[1] https://github.com/CopernicaMarketingSoftware/AMQP-CPP/blob/master/include/stack_ptr.h#L83
[2] http://www.cplusplus.com/reference/type_traits/aligned_storage/
2016-06-27 02:03:15 +08:00
Carl Lei 55aba43078 portability fix for pow overload resolution
On Solaris the compiler is missing the template overload.
2016-06-25 20:15:44 +08:00
Martijn Otto ba6b3e2923 Copied the methods to both implementations so they can return their concrete type 2016-06-23 16:02:04 +02:00
Martijn Otto 2c60151d31 Only allocate a message and its data when a consumer wants to and allow consumers to receive the individual parts 2016-06-23 14:42:50 +02:00
Emiel Bruijntjes 24c8527b5d added tcpinbuffer with much less allocation 2016-06-15 13:32:30 -04:00
Emiel Bruijntjes 6320e2ae0e added consistent-hash exchange (same as pull request #68) 2016-06-15 11:20:31 -04:00
Emiel Bruijntjes 59830c659c added connection::maxFrame() and connection::expected() methods to give hints about the amount of data that the connection::parse() method ideally expects 2016-06-15 04:57:46 -04:00
Jan Westerdiep 7384b521ac small legibility fixes 2016-06-10 15:21:10 +02:00
hoxnox 15fa529bfd Bugfix: add missing include guards 2016-04-06 17:49:39 +03:00