quickfix_ffi/
lib.rs

1#![allow(non_camel_case_types)]
2#![allow(non_snake_case)]
3
4/*! Low level binding for [quickfix](https://github.com/quickfix/quickfix) library.
5 *
6 * Please consider using higher level rust library for your application development.
7 */
8
9use std::{ffi, ptr::NonNull};
10
11pub const CALLBACK_OK: i8 = 0;
12pub const CALLBACK_RESULT_DO_NOT_SEND: i8 = -1;
13pub const CALLBACK_RESULT_FIELD_NOT_FOUND: i8 = -2;
14pub const CALLBACK_RESULT_INCORRECT_DATA_FORMAT: i8 = -3;
15pub const CALLBACK_RESULT_INCORRECT_TAG_VALUE: i8 = -4;
16pub const CALLBACK_RESULT_REJECT_LOGON: i8 = -5;
17pub const CALLBACK_RESULT_UNSUPPORTED_MESSAGE_TYPE: i8 = -6;
18
19pub type NullableCStr = Option<NonNull<ffi::c_char>>;
20
21#[derive(Debug, Clone, Copy, PartialEq, Eq)]
22#[repr(transparent)]
23pub struct FixSessionSettings_t(NonNull<ffi::c_void>);
24
25#[derive(Debug, Clone, Copy, PartialEq, Eq)]
26#[repr(transparent)]
27pub struct FixDictionary_t(NonNull<ffi::c_void>);
28
29#[derive(Debug, Clone, Copy, PartialEq, Eq)]
30#[repr(transparent)]
31pub struct FixDataDictionary_t(NonNull<ffi::c_void>);
32
33#[derive(Debug, Clone, Copy, PartialEq, Eq)]
34#[repr(transparent)]
35pub struct FixMessageStoreFactory_t(NonNull<ffi::c_void>);
36
37#[derive(Debug, Clone, Copy, PartialEq, Eq)]
38#[repr(transparent)]
39pub struct FixLogFactory_t(NonNull<ffi::c_void>);
40
41#[derive(Debug, Clone, Copy, PartialEq, Eq)]
42#[repr(transparent)]
43pub struct FixApplication_t(NonNull<ffi::c_void>);
44
45#[derive(Debug, Clone, Copy, PartialEq, Eq)]
46#[repr(transparent)]
47pub struct FixSession_t(NonNull<ffi::c_void>);
48
49#[derive(Debug, Clone, Copy, PartialEq, Eq)]
50#[repr(transparent)]
51pub struct FixSessionID_t(NonNull<ffi::c_void>);
52
53#[derive(Debug, Clone, Copy, PartialEq, Eq)]
54#[repr(transparent)]
55pub struct FixMessage_t(NonNull<ffi::c_void>);
56
57#[derive(Debug, Clone, Copy, PartialEq, Eq)]
58#[repr(transparent)]
59pub struct FixAcceptor_t(NonNull<ffi::c_void>);
60
61#[derive(Debug, Clone, Copy, PartialEq, Eq)]
62#[repr(transparent)]
63pub struct FixInitiator_t(NonNull<ffi::c_void>);
64
65#[derive(Debug, Clone, Copy, PartialEq, Eq)]
66#[repr(transparent)]
67pub struct FixHeader_t(NonNull<ffi::c_void>);
68
69#[derive(Debug, Clone, Copy, PartialEq, Eq)]
70#[repr(transparent)]
71pub struct FixTrailer_t(NonNull<ffi::c_void>);
72
73#[derive(Debug, Clone, Copy, PartialEq, Eq)]
74#[repr(transparent)]
75pub struct FixGroup_t(NonNull<ffi::c_void>);
76
77#[derive(Debug, Clone, Copy)]
78#[repr(C)]
79pub struct FixApplicationCallbacks_t {
80    pub onCreate: extern "C" fn(*const ffi::c_void, FixSessionID_t),
81    pub onLogon: extern "C" fn(*const ffi::c_void, FixSessionID_t),
82    pub onLogout: extern "C" fn(*const ffi::c_void, FixSessionID_t),
83    pub toAdmin: extern "C" fn(*const ffi::c_void, FixMessage_t, FixSessionID_t),
84    pub toApp: extern "C" fn(*const ffi::c_void, FixMessage_t, FixSessionID_t) -> i8,
85    pub fromAdmin: extern "C" fn(*const ffi::c_void, FixMessage_t, FixSessionID_t) -> i8,
86    pub fromApp: extern "C" fn(*const ffi::c_void, FixMessage_t, FixSessionID_t) -> i8,
87}
88
89#[derive(Debug, Clone, Copy)]
90#[repr(C)]
91pub struct FixLogCallbacks_t {
92    pub onIncoming: extern "C" fn(
93        data: *const ffi::c_void,
94        sessionId: Option<FixSessionID_t>,
95        msg: *const ffi::c_char,
96    ),
97    pub onOutgoing: extern "C" fn(
98        data: *const ffi::c_void,
99        sessionId: Option<FixSessionID_t>,
100        msg: *const ffi::c_char,
101    ),
102    pub onEvent: extern "C" fn(
103        data: *const ffi::c_void,
104        sessionId: Option<FixSessionID_t>,
105        msg: *const ffi::c_char,
106    ),
107}
108
109#[link(name = "quickfixbind")]
110extern "C" {
111
112    // Error management
113
114    pub fn Fix_getLastErrorMessage() -> Option<NonNull<ffi::c_char>>;
115
116    pub fn Fix_getLastErrorCode() -> i8;
117
118    pub fn Fix_clearLastErrorMessage();
119
120    // Session settings
121
122    pub fn FixSessionSettings_new() -> Option<FixSessionSettings_t>;
123
124    pub fn FixSessionSettings_fromPath(
125        configPath: *const ffi::c_char,
126    ) -> Option<FixSessionSettings_t>;
127
128    pub fn FixSessionSettings_getGlobalRef(obj: FixSessionSettings_t) -> Option<FixDictionary_t>;
129
130    pub fn FixSessionSettings_getSessionRef(
131        obj: FixSessionSettings_t,
132        id: FixSessionID_t,
133    ) -> Option<FixDictionary_t>;
134
135    #[must_use]
136    pub fn FixSessionSettings_setGlobal(obj: FixSessionSettings_t, value: FixDictionary_t) -> i8;
137
138    #[must_use]
139    pub fn FixSessionSettings_setSession(
140        obj: FixSessionSettings_t,
141        id: FixSessionID_t,
142        value: FixDictionary_t,
143    ) -> i8;
144
145    pub fn FixSessionSettings_delete(obj: FixSessionSettings_t);
146
147    // Dictionary
148
149    pub fn FixDictionary_new(name: *const ffi::c_char) -> Option<FixDictionary_t>;
150
151    #[must_use]
152    pub fn FixDictionary_setString(
153        obj: FixDictionary_t,
154        key: *const ffi::c_char,
155        value: *const ffi::c_char,
156    ) -> i8;
157
158    #[must_use]
159    pub fn FixDictionary_setInt(obj: FixDictionary_t, key: *const ffi::c_char, value: i32) -> i8;
160
161    #[must_use]
162    pub fn FixDictionary_setDouble(obj: FixDictionary_t, key: *const ffi::c_char, value: f64)
163        -> i8;
164
165    #[must_use]
166    pub fn FixDictionary_setBool(obj: FixDictionary_t, key: *const ffi::c_char, value: i8) -> i8;
167
168    #[must_use]
169    pub fn FixDictionary_setDay(obj: FixDictionary_t, key: *const ffi::c_char, value: i32) -> i8;
170
171    pub fn FixDictionary_getStringLen(obj: FixDictionary_t, key: *const ffi::c_char) -> i64;
172
173    #[must_use]
174    pub fn FixDictionary_readString(
175        obj: FixDictionary_t,
176        key: *const ffi::c_char,
177        buffer: *mut ffi::c_char,
178        buffer_len: u64,
179    ) -> i8;
180
181    pub fn FixDictionary_getInt(obj: FixDictionary_t, key: *const ffi::c_char) -> i32;
182
183    pub fn FixDictionary_getDouble(obj: FixDictionary_t, key: *const ffi::c_char) -> f64;
184
185    pub fn FixDictionary_getBool(obj: FixDictionary_t, key: *const ffi::c_char) -> i8;
186
187    pub fn FixDictionary_getDay(obj: FixDictionary_t, key: *const ffi::c_char) -> i32;
188
189    pub fn FixDictionary_hasKey(obj: FixDictionary_t, key: *const ffi::c_char) -> i8;
190
191    pub fn FixDictionary_delete(obj: FixDictionary_t);
192
193    // Data dictionary
194
195    pub fn FixDataDictionary_new() -> Option<FixDataDictionary_t>;
196
197    pub fn FixDataDictionary_fromPath(
198        configPath: *const ffi::c_char,
199    ) -> Option<FixDataDictionary_t>;
200
201    pub fn FixDataDictionary_delete(obj: FixDataDictionary_t);
202
203    // Message store factory
204
205    pub fn FixFileMessageStoreFactory_new(
206        settings: FixSessionSettings_t,
207    ) -> Option<FixMessageStoreFactory_t>;
208
209    pub fn FixMemoryMessageStoreFactory_new() -> Option<FixMessageStoreFactory_t>;
210
211    pub fn FixNullMessageStoreFactory_new() -> Option<FixMessageStoreFactory_t>;
212
213    #[cfg(feature = "build-with-mysql")]
214    pub fn FixMysqlMessageStoreFactory_new(
215        settings: FixSessionSettings_t,
216    ) -> Option<FixMessageStoreFactory_t>;
217
218    #[cfg(feature = "build-with-postgres")]
219    pub fn FixPostgresMessageStoreFactory_new(
220        settings: FixSessionSettings_t,
221    ) -> Option<FixMessageStoreFactory_t>;
222
223    pub fn FixMessageStoreFactory_delete(obj: FixMessageStoreFactory_t);
224
225    // Log factory
226
227    pub fn FixLogFactory_new(
228        data: *const ffi::c_void,
229        callbacks: *const FixLogCallbacks_t,
230    ) -> Option<FixLogFactory_t>;
231
232    pub fn FixLogFactory_delete(obj: FixLogFactory_t);
233
234    // Application
235
236    pub fn FixApplication_new(
237        data: *const ffi::c_void,
238        callbacks: *const FixApplicationCallbacks_t,
239    ) -> Option<FixApplication_t>;
240
241    pub fn FixApplication_delete(obj: FixApplication_t);
242
243    // Socket acceptor
244
245    pub fn FixAcceptor_new(
246        application: FixApplication_t,
247        storeFactory: FixMessageStoreFactory_t,
248        settings: FixSessionSettings_t,
249        logFactory: FixLogFactory_t,
250        isMultiThreaded: i8,
251        isSslEnabled: i8,
252    ) -> Option<FixAcceptor_t>;
253
254    #[must_use]
255    pub fn FixAcceptor_start(obj: FixAcceptor_t) -> i8;
256
257    #[must_use]
258    pub fn FixAcceptor_block(obj: FixAcceptor_t) -> i8;
259
260    #[must_use]
261    pub fn FixAcceptor_poll(obj: FixAcceptor_t) -> i8;
262
263    #[must_use]
264    pub fn FixAcceptor_stop(obj: FixAcceptor_t) -> i8;
265
266    #[must_use]
267    pub fn FixAcceptor_isLoggedOn(obj: FixAcceptor_t) -> i8;
268
269    #[must_use]
270    pub fn FixAcceptor_isStopped(obj: FixAcceptor_t) -> i8;
271
272    pub fn FixAcceptor_getSession(
273        obj: FixAcceptor_t,
274        sessionId: FixSessionID_t,
275    ) -> Option<FixSession_t>;
276
277    pub fn FixAcceptor_delete(obj: FixAcceptor_t);
278
279    // Socket initiator
280
281    pub fn FixInitiator_new(
282        application: FixApplication_t,
283        storeFactory: FixMessageStoreFactory_t,
284        settings: FixSessionSettings_t,
285        logFactory: FixLogFactory_t,
286        isMultiThreaded: i8,
287        isSslEnabled: i8,
288    ) -> Option<FixInitiator_t>;
289
290    #[must_use]
291    pub fn FixInitiator_start(obj: FixInitiator_t) -> i8;
292
293    #[must_use]
294    pub fn FixInitiator_block(obj: FixInitiator_t) -> i8;
295
296    #[must_use]
297    pub fn FixInitiator_poll(obj: FixInitiator_t) -> i8;
298
299    #[must_use]
300    pub fn FixInitiator_stop(obj: FixInitiator_t) -> i8;
301
302    #[must_use]
303    pub fn FixInitiator_isLoggedOn(obj: FixInitiator_t) -> i8;
304
305    #[must_use]
306    pub fn FixInitiator_isStopped(obj: FixInitiator_t) -> i8;
307
308    pub fn FixInitiator_getSession(
309        obj: FixInitiator_t,
310        sessionId: FixSessionID_t,
311    ) -> Option<FixSession_t>;
312
313    pub fn FixInitiator_delete(obj: FixInitiator_t);
314
315    // Session ID
316
317    pub fn FixSessionID_new(
318        beginString: *const ffi::c_char,
319        senderCompID: *const ffi::c_char,
320        targetCompID: *const ffi::c_char,
321        sessionQualifier: *const ffi::c_char,
322    ) -> Option<FixSessionID_t>;
323
324    pub fn FixSessionID_copy(src: FixSessionID_t) -> Option<FixSessionID_t>;
325
326    pub fn FixSessionID_getBeginString(obj: FixSessionID_t) -> NullableCStr;
327
328    pub fn FixSessionID_getSenderCompID(obj: FixSessionID_t) -> NullableCStr;
329
330    pub fn FixSessionID_getTargetCompID(obj: FixSessionID_t) -> NullableCStr;
331
332    pub fn FixSessionID_getSessionQualifier(obj: FixSessionID_t) -> NullableCStr;
333
334    pub fn FixSessionID_isFIXT(obj: FixSessionID_t) -> i8;
335
336    pub fn FixSessionID_toString(obj: FixSessionID_t) -> NullableCStr;
337
338    pub fn FixSessionID_delete(obj: FixSessionID_t);
339
340    // Message
341
342    pub fn FixMessage_new() -> Option<FixMessage_t>;
343
344    pub fn FixMessage_copy(src: FixMessage_t) -> Option<FixMessage_t>;
345
346    pub fn FixMessage_fromString(text: *const ffi::c_char) -> Option<FixMessage_t>;
347
348    pub fn FixMessage_fromStringAndDictionary(
349        text: *const ffi::c_char,
350        dictionary: FixDataDictionary_t,
351    ) -> Option<FixMessage_t>;
352
353    #[must_use]
354    pub fn FixMessage_setField(obj: FixMessage_t, tag: i32, value: *const ffi::c_char) -> i8;
355
356    #[must_use]
357    pub fn FixMessage_getField(obj: FixMessage_t, tag: i32) -> NullableCStr;
358
359    #[must_use]
360    pub fn FixMessage_removeField(obj: FixMessage_t, tag: i32) -> i8;
361
362    #[must_use]
363    pub fn FixMessage_addGroup(obj: FixMessage_t, group: FixGroup_t) -> i8;
364
365    pub fn FixMessage_getStringLen(obj: FixMessage_t) -> i64;
366
367    #[must_use]
368    pub fn FixMessage_readString(
369        obj: FixMessage_t,
370        buffer: *mut ffi::c_char,
371        buffer_len: u64,
372    ) -> i8;
373
374    pub fn FixMessage_delete(obj: FixMessage_t);
375
376    // Header
377
378    pub fn FixHeader_new() -> Option<FixHeader_t>;
379
380    pub fn FixHeader_copy(src: FixHeader_t) -> Option<FixHeader_t>;
381
382    pub fn FixMessage_copyHeader(obj: FixMessage_t) -> Option<FixHeader_t>;
383
384    pub fn FixMessage_getHeaderRef(obj: FixMessage_t) -> Option<FixHeader_t>;
385
386    pub fn FixHeader_getField(obj: FixHeader_t, tag: i32) -> NullableCStr;
387
388    #[must_use]
389    pub fn FixHeader_setField(obj: FixHeader_t, tag: i32, value: *const ffi::c_char) -> i8;
390
391    #[must_use]
392    pub fn FixHeader_removeField(obj: FixHeader_t, tag: i32) -> i8;
393
394    #[must_use]
395    pub fn FixHeader_addGroup(obj: FixHeader_t, group: FixGroup_t) -> i8;
396
397    pub fn FixHeader_delete(obj: FixHeader_t);
398
399    // Trailer
400
401    pub fn FixTrailer_new() -> Option<FixTrailer_t>;
402
403    pub fn FixTrailer_copy(src: FixTrailer_t) -> Option<FixTrailer_t>;
404
405    pub fn FixMessage_copyTrailer(obj: FixMessage_t) -> Option<FixTrailer_t>;
406
407    pub fn FixMessage_getTrailerRef(obj: FixMessage_t) -> Option<FixTrailer_t>;
408
409    pub fn FixTrailer_getField(obj: FixTrailer_t, tag: i32) -> NullableCStr;
410
411    #[must_use]
412    pub fn FixTrailer_setField(obj: FixTrailer_t, tag: i32, value: *const ffi::c_char) -> i8;
413
414    #[must_use]
415    pub fn FixTrailer_removeField(obj: FixTrailer_t, tag: i32) -> i8;
416
417    #[must_use]
418    pub fn FixTrailer_addGroup(obj: FixTrailer_t, group: FixGroup_t) -> i8;
419
420    pub fn FixTrailer_delete(obj: FixTrailer_t);
421
422    // Group
423
424    pub fn FixGroup_new(fieldId: i32, delim: i32, order: *const i32) -> Option<FixGroup_t>;
425
426    pub fn FixGroup_copy(src: FixGroup_t) -> Option<FixGroup_t>;
427
428    pub fn FixMessage_copyGroup(obj: FixMessage_t, num: i32, tag: i32) -> Option<FixGroup_t>;
429
430    pub fn FixHeader_copyGroup(obj: FixHeader_t, num: i32, tag: i32) -> Option<FixGroup_t>;
431
432    pub fn FixTrailer_copyGroup(obj: FixTrailer_t, num: i32, tag: i32) -> Option<FixGroup_t>;
433
434    pub fn FixGroup_copyGroup(obj: FixGroup_t, num: i32, tag: i32) -> Option<FixGroup_t>;
435
436    pub fn FixMessage_getGroupRef(obj: FixMessage_t, num: i32, tag: i32) -> Option<FixGroup_t>;
437
438    pub fn FixGroup_getFieldId(obj: FixGroup_t) -> i32;
439
440    pub fn FixGroup_getDelim(obj: FixGroup_t) -> i32;
441
442    pub fn FixGroup_getField(obj: FixGroup_t, tag: i32) -> NullableCStr;
443
444    #[must_use]
445    pub fn FixGroup_setField(obj: FixGroup_t, tag: i32, value: *const ffi::c_char) -> i8;
446
447    #[must_use]
448    pub fn FixGroup_removeField(obj: FixGroup_t, tag: i32) -> i8;
449
450    #[must_use]
451    pub fn FixGroup_addGroup(obj: FixGroup_t, group: FixGroup_t) -> i8;
452
453    pub fn FixGroup_delete(obj: FixGroup_t);
454
455    // Session
456
457    pub fn FixSession_sendToTarget(msg: FixMessage_t, session_id: FixSessionID_t) -> i8;
458    pub fn FixSession_lookup(session_id: FixSessionID_t) -> Option<FixSession_t>;
459    #[must_use]
460    pub fn FixSession_logout(session: FixSession_t) -> i8;
461    #[must_use]
462    pub fn FixSession_isLoggedOn(session: FixSession_t) -> i8;
463    #[must_use]
464    pub fn FixSession_send(session: FixSession_t, msg: FixMessage_t) -> i8;
465    #[must_use]
466    pub fn FixSession_reset(session: FixSession_t) -> i8;
467    #[must_use]
468    pub fn FixSession_logon(session: FixSession_t) -> i8;
469}