diff --git a/common/cpp/include/asapo/common/common_c.h b/common/cpp/include/asapo/common/common_c.h index 932e9c030fa2415a3e76ed9ccf8115d6c279c17e..8755312a2303ce993e694bd48dae4b1c0f80415c 100644 --- a/common/cpp/include/asapo/common/common_c.h +++ b/common/cpp/include/asapo/common/common_c.h @@ -1,7 +1,10 @@ #ifndef __COMMON_C_H__ #define __COMMON_C_H__ +#include <stddef.h> +#include <stdint.h> +#include <time.h> - +const unsigned AsapoHandleSize = 24; typedef int AsapoBool; #ifndef __COMMON_C_INTERFACE_IMPLEMENTATION__ typedef void* AsapoSourceCredentialsHandle; @@ -12,6 +15,12 @@ typedef void* AsapoStreamInfosHandle; typedef void* AsapoMessageDataHandle; #endif +//! c version of asapo::SourceType +enum AsapoSourceType { + kProcessed, + kRaw +}; + void asapo_free_handle(void** handle); void* asapo_new_handle(); diff --git a/common/cpp/include/asapo/common/internal/asapo_common_c_glue.h b/common/cpp/include/asapo/common/internal/asapo_common_c_glue.h index d1a85106f16802da239b7202e7aeaf7431981f23..9545dc7532347e79480ecb1d2570bc52931b1a8f 100644 --- a/common/cpp/include/asapo/common/internal/asapo_common_c_glue.h +++ b/common/cpp/include/asapo/common/internal/asapo_common_c_glue.h @@ -111,5 +111,6 @@ constexpr bool operator==(const u& lhs, const t& rhs) { } - +void time_point_to_time_spec(std::chrono::system_clock::time_point tp, + struct timespec* stamp); #endif diff --git a/common/cpp/src/common/CMakeLists.txt b/common/cpp/src/common/CMakeLists.txt index 5a22d46dc262c06116f083de5cd4a337d0c23e10..34ca5ead93ad7b75700f0254bf8fc0949f62e840 100644 --- a/common/cpp/src/common/CMakeLists.txt +++ b/common/cpp/src/common/CMakeLists.txt @@ -1,7 +1,11 @@ set(TARGET_NAME common) +set(SOURCE_FILES common_c_glue.cpp) + set(TEST_SOURCE_FILES ../../unittests/common/test_error.cpp) +add_library(${TARGET_NAME} STATIC ${SOURCE_FILES}) + set(TEST_LIBRARIES "${TARGET_NAME};system_io") -include_directories(${ASAPO_CXX_COMMON_INCLUDE_DIR}) +include_directories(${ASAPO_CXX_COMMON_INCLUDE_DIR} ../../include) add_plain_unit_test(${TARGET_NAME} "${TEST_SOURCE_FILES}" "${TEST_LIBRARIES}") diff --git a/common/cpp/src/common/common_c_glue.cpp b/common/cpp/src/common/common_c_glue.cpp index f1903f70cbc996e84988ec776017ee0aec5a5955..ce48fed6c8749de99aa19ce7d33558694bb4e91a 100644 --- a/common/cpp/src/common/common_c_glue.cpp +++ b/common/cpp/src/common/common_c_glue.cpp @@ -1,9 +1,9 @@ #define __COMMON_C_INTERFACE_IMPLEMENTATION__ -#include "asapo/asapo_common_c_glue.h - +#include "asapo/common/internal/asapo_common_c_glue.h" +#include <algorithm> int process_error(AsapoErrorHandle* error, asapo::Error err, - const asapo::ErrorTemplateInterface* p_exclude_err_template = nullptr) { + const asapo::ErrorTemplateInterface* p_exclude_err_template) { int retval = (err == nullptr || (p_exclude_err_template != nullptr && err == *p_exclude_err_template)) ? 0 : -1; if (error == nullptr) { return retval; @@ -17,7 +17,7 @@ int process_error(AsapoErrorHandle* error, asapo::Error err, } AsapoHandle* handle_or_null(AsapoHandle* handle, AsapoErrorHandle* error, asapo::Error err, - const asapo::ErrorTemplateInterface* p_exclude_err_template = nullptr) { + const asapo::ErrorTemplateInterface* p_exclude_err_template) { if (process_error(error, std::move(err), p_exclude_err_template) < 0) { if (handle != nullptr) { delete handle; @@ -28,9 +28,23 @@ AsapoHandle* handle_or_null(AsapoHandle* handle, AsapoErrorHandle* error, asapo: } } +void time_point_to_time_spec(std::chrono::system_clock::time_point tp, + struct timespec* stamp) { + stamp->tv_sec = std::chrono::duration_cast<std::chrono::seconds>(tp.time_since_epoch()).count(); + stamp->tv_nsec = std::chrono::duration_cast<std::chrono::nanoseconds>(tp.time_since_epoch()).count() % 1000000000; +} + extern "C" { +#include "asapo/common/common_c.h" + static_assert(kProcessed == asapo::SourceType::kProcessed&& + kRaw == asapo::SourceType::kRaw, + "incompatible bit reps between c++ and c for asapo::SourceType"); + + static_assert(AsapoHandleSize == sizeof(AsapoHandlerHolder<int>), + "AsapoHandleSize is not correct"); + AsapoStringHandle asapo_string_create(const char* str) { return AsapoStringHandle(new std::string(str)); @@ -60,8 +74,9 @@ extern "C" { /// \param[in] maxSize max size of buf in bytes void asapo_error_explain(const AsapoErrorHandle error, char* buf, size_t maxSize) { if (error->handle) { - strncpy(buf, error->handle->Explain().c_str(), maxSize - 1); - buf[maxSize] = '\0'; + const auto& msg = error->handle->Explain(); + std::copy_n(msg.begin(), std::max(msg.size(), maxSize), buf); + buf[std::max(maxSize - 1, msg.size())] = '\0'; } else { static std::string msg("no error"); std::copy_n(msg.begin(), std::max(msg.size(), maxSize), buf); diff --git a/consumer/api/c/include/asapo/consumer_c.h b/consumer/api/c/include/asapo/consumer_c.h index d6ef254ced8362e836f6bec48dfa2d59efb7ec09..069a4d7b902eee30168173094ffac0c16f189dfb 100644 --- a/consumer/api/c/include/asapo/consumer_c.h +++ b/consumer/api/c/include/asapo/consumer_c.h @@ -1,8 +1,8 @@ #ifndef __CONSUMER_C_H__ #define __CONSUMER_C_H__ +#include <asapo/common/common_c.h> #ifndef __CONSUMER_C_INTERFACE_IMPLEMENTATION__ -#include <asapo/common_c.h> typedef void* AsapoConsumerHandle; typedef void* AsapoMessageMetaHandle; typedef void* AsapoMessageMetasHandle; @@ -35,11 +35,6 @@ enum AsapoStreamFilter { kFinishedStreams, kUnfinishedStreams }; -//! c version of asapo::SourceType -enum AsapoSourceType { - kProcessed, - kRaw -}; //! c version of asapo::NetworkConnectionType enum AsapoNetworkConnectionType { kUndefined, diff --git a/consumer/api/cpp/src/consumer_c_glue.cpp b/consumer/api/cpp/src/consumer_c_glue.cpp index a60cbbb7e8b0e2efe76a60a5d824837803f459ff..444a72b96a6cc7ec2dea2c00263e9751cee7c663 100644 --- a/consumer/api/cpp/src/consumer_c_glue.cpp +++ b/consumer/api/cpp/src/consumer_c_glue.cpp @@ -86,20 +86,11 @@ extern "C" { kFinishedStreams == asapo::StreamFilter::kFinishedStreams&& kUnfinishedStreams == asapo::StreamFilter::kUnfinishedStreams, "incompatible bit reps between c++ and c for asapo::StreamFilter"); - static_assert(kProcessed == asapo::SourceType::kProcessed&& - kRaw == asapo::SourceType::kRaw, - "incompatible bit reps between c++ and c for asapo::SourceType"); static_assert(kUndefined == asapo::NetworkConnectionType::kUndefined&& kAsapoTcp == asapo::NetworkConnectionType::kAsapoTcp&& kFabric == asapo::NetworkConnectionType::kFabric, "incompatible bit reps between c++ and c for asapo::NetworkConnectionType"); - static void time_point_to_time_spec(std::chrono::system_clock::time_point tp, - struct timespec* stamp) { - stamp->tv_sec = std::chrono::duration_cast<std::chrono::seconds>(tp.time_since_epoch()).count(); - stamp->tv_nsec = std::chrono::duration_cast<std::chrono::nanoseconds>(tp.time_since_epoch()).count() % 1000000000; - } - AsapoBool asapo_is_error(AsapoErrorHandle err) { return err != nullptr && err->handle != nullptr; } diff --git a/examples/consumer/simple-consumer-c/consume.c b/examples/consumer/simple-consumer-c/consume.c index f084363d1590fb0577bcb6abf1a37e9c41c20da4..ea79dad81e91c704aad0aebd55bf4def0ea4ffaf 100644 --- a/examples/consumer/simple-consumer-c/consume.c +++ b/examples/consumer/simple-consumer-c/consume.c @@ -41,7 +41,7 @@ int main(int argc, char* argv[]) { asapo_consumer_get_next(consumer, group_id, &mm, &data, "default",&err); exit_if_error("Cannot get next record", err); - printf("id: %llu\n", asapo_message_meta_get_id(mm)); + printf("id: %lu\n", asapo_message_meta_get_id(mm)); printf("file name: %s\n", asapo_message_meta_get_name(mm)); printf("file content: %s\n", asapo_message_data_get_as_chars(data)); @@ -51,4 +51,4 @@ int main(int argc, char* argv[]) { asapo_free_handle(&group_id); return EXIT_SUCCESS; -} \ No newline at end of file +}