diff --git a/cpp/README.md b/cpp/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f682d80981073e791c032dce7ccbae4a51695d50 --- /dev/null +++ b/cpp/README.md @@ -0,0 +1,86 @@ +# Vereign C++ Client Library + +## Overview + +TODO + +## Build + +The project uses git submodules for the gRPC protobuf definitions. + +So after cloning run `git submodule update --init`. + +The protobuf definitions and the generated C++ gRPC client/server are located in +[https://code.vereign.com/code/vcl-proto](https://code.vereign.com/code/vcl-proto) project and +are added as submodule at `proto` subdir. + +### Windows + +You need Visual Studio 2019 or alternatively install just the build tools and c++ compiler - go to +[https://visualstudio.microsoft.com/downloads/](https://visualstudio.microsoft.com/downloads/) +then scroll and open `Tools for Visual Studio 2019` and download/install `Visual Studio Build Tools 2019`. +The 2019 build tools include cmake, and currently it is 3.16.19112601-MSVC_2. +They also include Ninja build tool. + +**NOTE: Currently only builds with Ninja are tested under Windows** + +#### Build the third party dependencies + +Go to the `vcl/cpp` directory. + +First configure the cmake build. +Open `x64 Native Tools Command Prompt` it is preconfigured with all the needed tools including cmake +and ninja. + +```shell +> mkdir cmake-build-vendor-debug +> cd cmake-build-vendor-debug +> cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug ../vendor +``` + +Next build the dependencies. +Note that this will take a while, and that it could be slowed a lot by the windows defender. +You can configure the windows defender to the project directory. + +```shell +> ninja +``` + +#### Build the vereign library + +Go to the `vcl/cpp` directory. + +``` +> mkdir cmake-build-debug +> cd cmake-build-debug +> cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug .. +> ninja vereign -v +``` + +The `vereign.dll` will be created inside `cmake-build-debug\bin\Debug` directory. + +### C API Usage + +For C/C++ users, the library has a single header file located in `include\vereign` directory. + +The service is started with `vereign_service_start`. This will start a gRPC server in its own thread(s). +The call returns immediately. + +After the service is started you can use your favorite language generated gRPC client to communicate +with the service. + +Use the `vereign_service_selected_port` function to get the listen port of the gRPC server. + +When you are finished with the service, for example upon shutdown of the application, one must use +the `vereign_service_shutdown` API. It will shutdown the service and free any acquired resources. +Afterwards the returned `vereign_service` pointer from the start call is invalid and must not be used anymore. + +For more detailed info check the source code documentation in the header +[include/vereign/vereign.h](cpp/include/vereign/vereign.h). +You can also look at C++ usage example in the C API integration test +[tests/integration/integration_test.cc](cpp/tests/integration/integration_test.cc). + +The gRPC APIs are located here [https://code.vereign.com/code/vcl-proto/-/tree/master/proto%2Fvereign%2Fclient_library](https://code.vereign.com/code/vcl-proto/-/tree/master/proto%2Fvereign%2Fclient_library). + + +TODO: Add more documentation/reference; instructions to generate doxygen reference. diff --git a/cpp/include/vereign/vereign.h b/cpp/include/vereign/vereign.h index 2a25ecc92e3f1c96b65cca16e2ef402e2ee7f017..444ea0f638f229f6935c6a6694e43e03abe9d4d0 100644 --- a/cpp/include/vereign/vereign.h +++ b/cpp/include/vereign/vereign.h @@ -57,7 +57,9 @@ typedef struct vereign_service vereign_service; * * The returned ::vereign_service object must be destroyed with ::vereign_service_shutdown method. * After successful start, the gRPC bind port can be retrieved with the - * ::vereign_service_selected_port method. + * ::vereign_service_selected_port method. This is useful if the `listen_address` is in the form + * "<host>:" (for example "localhost:"), in which case the port is not provided by the user but + * from the OS. * * When the gRPC server cannot bind, `err` will have code VEREIGN_ERR_GRPC_BIND_FAILED. * Any other failures will set `err` with code VEREIGN_ERR_INTERNAL.