@@ -346,6 +346,69 @@ uint32_t tox_max_hostname_length(void);
346
346
* @name Global enumerations
347
347
*/
348
348
349
+ /**
350
+ * @brief Experiment IDs to control (incompatible) changes dynamically.
351
+ *
352
+ * Experiments are changes in toxcore that can be configured by client
353
+ * code. These are used to make incompatible changes to toxcore between
354
+ * API/ABI-breaking releases, so clients can already test some functionality
355
+ * that may break or be removed again on the next patch release. Compatible
356
+ * changes may still be rolled out using experiments, and the flag can be
357
+ * flipped to default to a different value (e.g. true for bool) on the next
358
+ * patch release. Clients can explicitly revert them again if desired.
359
+ *
360
+ * All experiment flags must have an explicit number in this enum. When
361
+ * removing an experiment flag, the gap it leaves can not be reused. Removal
362
+ * of an experiment flag is an API breaking change, so it can only be done in
363
+ * API-breaking releases. Changing the default value of an experiment may or
364
+ * may not be an API- or ABI-breaking change.
365
+ *
366
+ * @see TOX_VERSION_IS_API_COMPATIBLE for what an API-breaking release is.
367
+ *
368
+ * Next ID: 3
369
+ */
370
+ typedef enum Tox_Experiment_Type {
371
+
372
+ /**
373
+ * Not a valid experiment ID. Not used to designate any experiment.
374
+ */
375
+ TOX_EXPERIMENT_INVALID = 0 ,
376
+
377
+ /**
378
+ * Make public API functions thread-safe using a per-instance lock.
379
+ *
380
+ * Type: bool
381
+ * Default: disabled
382
+ */
383
+ TOX_EXPERIMENT_THREAD_SAFETY = 1 ,
384
+
385
+ /**
386
+ * Enable saving DHT-based group chats to Tox save data (via `tox_get_savedata`).
387
+ * This format will change in the future, so don't rely on it.
388
+ *
389
+ * As an alternative, clients can save the group chat ID in client-owned
390
+ * savedata. Then, when the client starts, it can use `tox_group_join`
391
+ * with the saved chat ID to recreate the group chat.
392
+ *
393
+ * Type: bool
394
+ * Default: disabled
395
+ */
396
+ TOX_EXPERIMENT_GROUPS_PERSISTENCE = 2 ,
397
+
398
+ } Tox_Experiment_Type ;
399
+
400
+ const char * tox_experiment_type_to_string (Tox_Experiment_Type value );
401
+
402
+ /**
403
+ * @brief Opaque container for an experiment value.
404
+ *
405
+ * Can have different types (e.g. bool). See The Tox_Experiment_Type enum above
406
+ * to see which experiment has which type.
407
+ *
408
+ * @private
409
+ */
410
+ typedef struct Tox_Experiment Tox_Experiment ;
411
+
349
412
/**
350
413
* @brief Represents the possible statuses a client can have.
351
414
*/
@@ -492,7 +555,7 @@ const char *tox_log_level_to_string(Tox_Log_Level value);
492
555
* any time. Thus, user code must make sure it is equipped to handle concurrent
493
556
* execution, e.g. by employing appropriate mutex locking.
494
557
*
495
- * When using the experimental_thread_safety option , no Tox API functions can
558
+ * When using the TOX_EXPERIMENT_THREAD_SAFETY flag , no Tox API functions can
496
559
* be called from within the log callback.
497
560
*
498
561
* @param level The severity of the log message.
@@ -511,14 +574,19 @@ typedef void tox_log_cb(Tox *tox, Tox_Log_Level level, const char *file, uint32_
511
574
* This struct is opaque and generally shouldn't be used in clients, but in
512
575
* combination with tox_private.h, it allows tests to inject non-IO (hermetic)
513
576
* versions of low level network, RNG, and time keeping functions.
577
+ *
578
+ * @private
514
579
*/
515
580
typedef struct Tox_System Tox_System ;
516
581
517
582
/**
518
- * @brief This struct contains all the startup options for Tox.
583
+ * @brief Opaque options struct containing all the startup options for Tox.
519
584
*
520
585
* You must tox_options_new to allocate an object of this type.
521
- *
586
+ */
587
+ typedef struct Tox_Options Tox_Options ;
588
+
589
+ /**
522
590
* WARNING: Although this struct happens to be visible in the API, it is
523
591
* effectively private. Do not allocate this yourself or access members
524
592
* directly, as it *will* break binary compatibility frequently.
@@ -528,8 +596,8 @@ typedef struct Tox_System Tox_System;
528
596
* tox_options_new to allocate the object and accessor functions to set the
529
597
* members. The struct will become opaque (i.e. the definition will become
530
598
* private) in v0.3.0.
531
- */
532
- typedef struct Tox_Options Tox_Options ;
599
+ *
600
+ * @private */
533
601
struct Tox_Options {
534
602
535
603
/**
@@ -665,12 +733,6 @@ struct Tox_Options {
665
733
* entirely in the future, or may be renamed to something non-experimental
666
734
* if they become part of the supported API.
667
735
*/
668
- /**
669
- * Make public API functions thread-safe using a per-instance lock.
670
- *
671
- * Default: false.
672
- */
673
- bool experimental_thread_safety ;
674
736
675
737
/**
676
738
* Low level operating system functionality such as send/recv, random
@@ -679,16 +741,14 @@ struct Tox_Options {
679
741
const Tox_System * operating_system ;
680
742
681
743
/**
682
- * Enable saving DHT-based group chats to Tox save data (via `tox_get_savedata`).
683
- * This format will change in the future, so don't rely on it.
744
+ * @brief Set of enabled experiments.
684
745
*
685
- * As an alternative, clients can save the group chat ID in client-owned
686
- * savedata. Then, when the client starts, it can use `tox_group_join`
687
- * with the saved chat ID to recreate the group chat.
746
+ * Use set functions to set experiment values to custom values.
688
747
*
689
- * Default: false .
748
+ * Default: all experiments set to their default values .
690
749
*/
691
- bool experimental_groups_persistence ;
750
+ Tox_Experiment * experiments ;
751
+ uint32_t experiments_size ;
692
752
};
693
753
694
754
bool tox_options_get_ipv6_enabled (const Tox_Options * options );
@@ -755,18 +815,62 @@ void *tox_options_get_log_user_data(const Tox_Options *options);
755
815
756
816
void tox_options_set_log_user_data (Tox_Options * options , void * log_user_data );
757
817
758
- bool tox_options_get_experimental_thread_safety (const Tox_Options * options );
759
-
760
- void tox_options_set_experimental_thread_safety (Tox_Options * options , bool experimental_thread_safety );
761
-
818
+ /** @private */
762
819
const Tox_System * tox_options_get_operating_system (const Tox_Options * options );
763
820
821
+ /** @private */
764
822
void tox_options_set_operating_system (Tox_Options * options , const Tox_System * operating_system );
765
823
824
+ /** @deprecated Use tox_options_experiment_get_bool, instead. */
825
+ bool tox_options_get_experimental_thread_safety (const Tox_Options * options );
826
+
827
+ /** @deprecated Use tox_options_experiment_set_bool, instead. */
828
+ void tox_options_set_experimental_thread_safety (Tox_Options * options , bool experimental_thread_safety );
829
+
830
+ /** @deprecated Use tox_options_experiment_get_bool, instead. */
766
831
bool tox_options_get_experimental_groups_persistence (const Tox_Options * options );
767
832
833
+ /** @deprecated Use tox_options_experiment_set_bool, instead. */
768
834
void tox_options_set_experimental_groups_persistence (Tox_Options * options , bool experimental_groups_persistence );
769
835
836
+ typedef enum Tox_Err_Options_Experiment {
837
+
838
+ /**
839
+ * The function returned successfully.
840
+ */
841
+ TOX_ERR_OPTIONS_EXPERIMENT_OK ,
842
+
843
+ /**
844
+ * The flag does not exist in this version of toxcore.
845
+ */
846
+ TOX_ERR_OPTIONS_EXPERIMENT_INVALID_FLAG ,
847
+
848
+ /**
849
+ * The type of this experiment flag is different than the function type.
850
+ */
851
+ TOX_ERR_OPTIONS_EXPERIMENT_INVALID_TYPE ,
852
+
853
+ } Tox_Err_Options_Experiment ;
854
+
855
+ /** @brief Get the value of a boolean experiment flag.
856
+ *
857
+ * @retval true if the flag was enabled and the experiment type was boolean.
858
+ * @retval false if the flag was disabled OR the experiment type was not boolean.
859
+ */
860
+ bool tox_options_experiment_get_bool (
861
+ const Tox_Options * options , Tox_Experiment_Type experiment , Tox_Err_Options_Experiment * err );
862
+
863
+ /** @brief Enable or explicitly disable a boolean experiment flag.
864
+ *
865
+ * If the experiment is already enabled/disabled when enabling/disabling,
866
+ * respectively, this function does nothing.
867
+ *
868
+ * @retval true if the flag was set.
869
+ * @retval false on error.
870
+ */
871
+ bool tox_options_experiment_set_bool (
872
+ Tox_Options * options , Tox_Experiment_Type experiment , bool value , Tox_Err_Options_Experiment * err );
873
+
770
874
/**
771
875
* @brief Initialises a Tox_Options object with the default options.
772
876
*
@@ -802,6 +906,7 @@ const char *tox_err_options_new_to_string(Tox_Err_Options_New value);
802
906
*
803
907
* This function can be used to preserve long term ABI compatibility by
804
908
* giving the responsibility of allocation and deallocation to the Tox library.
909
+ * All experiment flags are set to their default values.
805
910
*
806
911
* Objects returned from this function must be freed using the tox_options_free
807
912
* function.
0 commit comments