A couple of weeks back Justin mentioned forward plans for proton. I want to let everyone know what I've been working on recently to split up the proton-c library and hopefully make its source tree layout a bit easier to follow.
The JIRAs for this work are: https://issues.apache.org/jira/browse/PROTON-1350 https://issues.apache.org/jira/browse/PROTON-1351 The github PR is: https://github.com/apache/qpid-proton/pull/87 I'll describe the final results of the rearrangement/split as the best way to approach this - I'll note the noticeable API changes at the end. The re-organization introduces a core proton library called qpid- proton-core (libqpid-proton-core.so). This contains only the protocol processing engine of proton-c. These are the APIs included in the following headers (with a few supporting headers). One of the defining feature of this library is that it is totally portable with no OS dependencies at all. There are some compiler (standard library) dependencies mostly due to MS Visual Studio not supporting C99. - proton/engine.h -- Convenience include for --- proton/condition.h --- proton/connection.h --- proton/session.h --- proton/terminus.h --- proton/link.h --- proton/delivery.h --- proton/event.h --- proton/transport.h - proton/condition.h -- pn_condition_t - proton/connection.h -- pn_state_t -- pn_connection_t - proton/delivery.h -- pn_delivery_t -- pn_delivery_tag_t - proton/event.h -- pn_event_t -- pn_event_type_t -- pn_collector_t - proton/link.h -- pn_link_t -- pn_snd_settle_mode_t -- pn_rcv_settle_mode_t - proton/session.h -- pn_session_t - proton/transport.h -- pn_transport_t -- pn_trace_t -- pn_tracer_t - proton/codec.h -- pn_type_t -- pn_atom_t -- pn_data_t - proton/disposition.h -- pn_disposition_t - proton/error.h -- pn_error_t - proton/message.h -- pn_message_t - proton/sasl.h -- pn_sasl_t -- pn_sasl_outcome_t - proton/ssl.h -- pn_ssl_domain_t -- pn_ssl_t -- pn_ssl_mode_t -- pn_ssl_resume_status_t -- pn_ssl_verify_mode_t -- pn_ssl_cert_subject_subfield (! name not consistent with others) -- pn_ssl_hash_alg (! name not consistent with others) - proton/terminus.h -- pn_terminus_t -- pn_terminus_type_t -- pn_durability_t -- pn_expiry_policy_t -- pn_distribution_mode_t Supporting headers: - proton/types.h -- Declares nearly all the types used in the APIs. It is included nearly everywhere to get these declarations. -- Maybe it should actually declare *all* of them. - proton/type_compat.h -- Used to portably get stdbool/stdint and ssize_t types - proton/import_export.h -- Used to portably handle API symbol export and hiding. - proton/object.h -- This is not really part of the user API, and may only be needed for reactor based bindings. -- [pn_object_t] (actually void*) -- pn_handle_t -- pn_shandle_t -- pn_class_t -- pn_string_t -- pn_list_t -- pn_map_t -- pn_hash_t -- pn_iterator_t -- pn_record_t - proton/cid.h -- This is also part of the object system and again may only be needed for reactor based bindings. -- pn_cid_t I'm not sure this is really a good core API at all. At least Proton logging should be revisited and perhaps redesigned. - proton/log.h -- pn_logger_t The next set of APIs are "extras" - they are not included in the core and are purely provided as conveniences. These may be bundled into their own library qpid-proton-extra (libqpid-proton-extra.so) - include/proton/parser.h -- This contains a parser from a textual format to the proton-c pn_data_t type. - include/proton/url.h -- This contains a parser that can dissect URLs used for specifying connection and messaging addresses. The remaining part of the library is regarded as legacy and stays in the existing qpid-proton library. - include/proton/handlers.h - include/proton/messenger.h - include/proton/reactor.h - include/proton/selectable.h These headers are for the messenger and reactor APIs. The existing proton library (qpid-proton/libqpid-proton.so) still exists and still has the same content as before (Except for some APIs that were really internal and have now been hidden away - see the section at the end). The intention is that moving forward all the language bindings to proton-c will be modified to only use the core APIs, with perhaps the extra library used if necessary. This is already the case for the go binding which has already been modified to only use core APIs. The C++ binding is fairly close to only using the core APIs, but will probably require the URL parser from the extras library. Other bindings will follow. The proton-c source tree organization has been simplified somewhat and rearranged so that the different API sections described above map directly to source tree directories. [Everything here is relative to the proton-c/src in the full source distribution] Core library: All source in directories - core - The actual proton-c engine - compiler - Any compiler specific core (currently there is only MSVC code here) - sasl - The code supporting the SASL protocol layer. This code may not all be OS independent as it is used to interface an external library to proton. The default implementation of SASL is pure ANSI C. - ssl - The code supporting the ssl protocol layer. Again this code is not entirely OS independent as the optional schannel support is Windows only. Extra (potential) library: All source in directory - extra The legacy APIs are in the remaining directories: - handlers - messenger - platform - This contains OS and compiler specific code for the legacy APIs. - reactor - reactor/io - This contains io implementations for the reactor and messenger APIs. For the moment the installed header files have not been rearranged in the source tree, although it may be a good idea for some future work to separate them by category. These changes shouldn't be noticeable to anyone using the current qpid-proton library is it is more-or-less unchanged. The "more-or-less" has a little detail though: I have moved a few previously exposed APIs to be internal only - they are not used by any example and logically aren't needed. but it is possible that someone somewhere is using them. These are: proton/io.h proton/selector.h proton/scanner.h This has turned out to be far longer than I intended - I hope it is clear enough. Comments, criticisms etc. all welcome. Andrew --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@qpid.apache.org For additional commands, e-mail: users-h...@qpid.apache.org