Skip to content

Commit

Permalink
✨ Expose more function from SocketAcceptor
Browse files Browse the repository at this point in the history
  • Loading branch information
arthurlm committed Nov 13, 2023
1 parent c9eff40 commit a70adcc
Show file tree
Hide file tree
Showing 4 changed files with 114 additions and 6 deletions.
7 changes: 7 additions & 0 deletions quickfix-bind/include/quickfix_bind.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@

#include <stdint.h>

#define ERRNO_INVAL -1
#define ERRNO_EXCEPTION -2

#ifdef __cplusplus
extern "C"
{
Expand Down Expand Up @@ -42,7 +45,11 @@ extern "C"

FixSocketAcceptor_t *FixSocketAcceptor_new(const FixApplication_t *application, const FixFileStoreFactory_t *storeFactory, const FixSessionSettings_t *settings, const FixFileLogFactory_t *logFactory);
int FixSocketAcceptor_start(const FixSocketAcceptor_t *obj);
int FixSocketAcceptor_block(const FixSocketAcceptor_t *obj);
int FixSocketAcceptor_poll(const FixSocketAcceptor_t *obj);
int FixSocketAcceptor_stop(const FixSocketAcceptor_t *obj);
int FixSocketAcceptor_isLoggedOn(const FixSocketAcceptor_t *obj);
int FixSocketAcceptor_isStopped(const FixSocketAcceptor_t *obj);
void FixSocketAcceptor_delete(FixSocketAcceptor_t *obj);

const char *FixSessionID_getBeginString(const FixSessionID_t *session);
Expand Down
69 changes: 65 additions & 4 deletions quickfix-bind/src/quickfix_bind.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ extern "C"

int FixSocketAcceptor_start(const FixSocketAcceptor_t *obj)
{
RETURN_VAL_IF_NULL(obj, -1);
RETURN_VAL_IF_NULL(obj, ERRNO_INVAL);

auto fix_obj = (FIX::SocketAcceptor *)(obj);
try
Expand All @@ -239,14 +239,45 @@ extern "C"
}
catch (std::exception &ex)
{
return -1;
return ERRNO_EXCEPTION;
}
return 0;
}

int FixSocketAcceptor_block(const FixSocketAcceptor_t *obj)
{
RETURN_VAL_IF_NULL(obj, ERRNO_INVAL);

auto fix_obj = (FIX::SocketAcceptor *)(obj);
try
{
fix_obj->block();
}
catch (std::exception &ex)
{
return ERRNO_EXCEPTION;
}
return 0;
}

int FixSocketAcceptor_poll(const FixSocketAcceptor_t *obj)
{
RETURN_VAL_IF_NULL(obj, ERRNO_INVAL);

auto fix_obj = (FIX::SocketAcceptor *)(obj);
try
{
return fix_obj->poll() ? 1 : 0;
}
catch (std::exception &ex)
{
return ERRNO_EXCEPTION;
}
}

int FixSocketAcceptor_stop(const FixSocketAcceptor_t *obj)
{
RETURN_VAL_IF_NULL(obj, -1);
RETURN_VAL_IF_NULL(obj, ERRNO_INVAL);

auto fix_obj = (FIX::SocketAcceptor *)(obj);
try
Expand All @@ -255,11 +286,41 @@ extern "C"
}
catch (std::exception &ex)
{
return -1;
return ERRNO_EXCEPTION;
}
return 0;
}

int FixSocketAcceptor_isLoggedOn(const FixSocketAcceptor_t *obj)
{
RETURN_VAL_IF_NULL(obj, ERRNO_INVAL);

auto fix_obj = (FIX::SocketAcceptor *)(obj);
try
{
return fix_obj->isLoggedOn() ? 1 : 0;
}
catch (std::exception &ex)
{
return ERRNO_EXCEPTION;
}
}

int FixSocketAcceptor_isStopped(const FixSocketAcceptor_t *obj)
{
RETURN_VAL_IF_NULL(obj, ERRNO_INVAL);

auto fix_obj = (FIX::SocketAcceptor *)(obj);
try
{
return fix_obj->isStopped() ? 1 : 0;
}
catch (std::exception &ex)
{
return ERRNO_EXCEPTION;
}
}

void FixSocketAcceptor_delete(FixSocketAcceptor_t *obj)
{
RETURN_IF_NULL(obj);
Expand Down
8 changes: 8 additions & 0 deletions quickfix-ffi/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,15 @@ extern "C" {
#[must_use]
pub fn FixSocketAcceptor_start(obj: FixSocketAcceptor_t) -> ffi::c_int;
#[must_use]
pub fn FixSocketAcceptor_block(obj: FixSocketAcceptor_t) -> ffi::c_int;
#[must_use]
pub fn FixSocketAcceptor_poll(obj: FixSocketAcceptor_t) -> ffi::c_int;
#[must_use]
pub fn FixSocketAcceptor_stop(obj: FixSocketAcceptor_t) -> ffi::c_int;
#[must_use]
pub fn FixSocketAcceptor_isLoggedOn(obj: FixSocketAcceptor_t) -> ffi::c_int;
#[must_use]
pub fn FixSocketAcceptor_isStopped(obj: FixSocketAcceptor_t) -> ffi::c_int;
pub fn FixSocketAcceptor_delete(obj: FixSocketAcceptor_t);

pub fn FixSessionID_getBeginString(obj: FixSessionID_t) -> Option<NonNull<ffi::c_char>>;
Expand Down
36 changes: 34 additions & 2 deletions quickfix/src/socket_acceptor.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
use std::marker::PhantomData;

use quickfix_ffi::{
FixSocketAcceptor_delete, FixSocketAcceptor_new, FixSocketAcceptor_start,
FixSocketAcceptor_stop, FixSocketAcceptor_t,
FixSocketAcceptor_block, FixSocketAcceptor_delete, FixSocketAcceptor_isLoggedOn,
FixSocketAcceptor_isStopped, FixSocketAcceptor_new, FixSocketAcceptor_poll,
FixSocketAcceptor_start, FixSocketAcceptor_stop, FixSocketAcceptor_t,
};

use crate::{
Expand Down Expand Up @@ -46,12 +47,43 @@ impl<'a, C: ApplicationCallback> SocketAcceptor<'a, C> {
}
}

pub fn block(&self) -> Result<(), QuickFixError> {
match unsafe { FixSocketAcceptor_block(self.inner) } {
0 => Ok(()),
code => Err(QuickFixError::InvalidFunctionReturnCode(code)),
}
}

pub fn poll(&self) -> Result<bool, QuickFixError> {
match unsafe { FixSocketAcceptor_poll(self.inner) } {
1 => Ok(true),
0 => Ok(false),
code => Err(QuickFixError::InvalidFunctionReturnCode(code)),
}
}

pub fn stop(&self) -> Result<(), QuickFixError> {
match unsafe { FixSocketAcceptor_stop(self.inner) } {
0 => Ok(()),
code => Err(QuickFixError::InvalidFunctionReturnCode(code)),
}
}

pub fn is_logged_on(&self) -> Result<bool, QuickFixError> {
match unsafe { FixSocketAcceptor_isLoggedOn(self.inner) } {
1 => Ok(true),
0 => Ok(false),
code => Err(QuickFixError::InvalidFunctionReturnCode(code)),
}
}

pub fn is_stopped(&self) -> Result<bool, QuickFixError> {
match unsafe { FixSocketAcceptor_isStopped(self.inner) } {
1 => Ok(true),
0 => Ok(false),
code => Err(QuickFixError::InvalidFunctionReturnCode(code)),
}
}
}

impl<C: ApplicationCallback> Drop for SocketAcceptor<'_, C> {
Expand Down

0 comments on commit a70adcc

Please sign in to comment.