+#define BT_PXP_PROPERTY_CHANGED "PxpValueChanged"
+
+/* TDS */
+#define BT_TDS_ACTIVATION_REQUESTED "TdsActivationRequested"
+#define BT_TDS_TRANSPORT_DATA_RECEIVED "TdsBlockDataReceived"
+#define BT_TDS_ACTIVATION_RESULT "TdsActivationResult"
+#define BT_TDS_CONTROL_POINT_ENABLED "TdsControlPointEnabled"
+#define BT_TDS_ACTIVATION_INDICATION "TdsActivationIndication"
+
+/* OTP */
+#define BT_OTP_SERVER_STATE_CHANGED "OtpServerStateChanged"
+#define BT_OTP_READ_CHAR_VAL "OtpReadCharVal"
+#define BT_OTP_NOTIFICATION_ENABLED "OtpNotificationEnabled"
+#define BT_OTP_WRITE_CHAR_VAL "OtpWriteCharVal"
+#define BT_OTP_INDICATION "OtpIndication"
+#define BT_OTC_STATE_CHANGED "OtcStateChanged"
+
+#ifdef TIZEN_FEATURE_BT_AVC_TARGET
+#define BT_AUDIO_AVC_MODE_CHANGED "AvcModeChanged"
+#endif
+
+#define HEADED_PLUGIN_FILEPATH "/usr/lib/bt-plugin-headed.so"
+#define HEADED_PLUGIN_FILEPATH64 "/usr/lib64/bt-plugin-headed.so"
+#define FILEPATH_ARCH_64 "/usr/lib64"
+
+#define BT_MESH_SCAN_STARTED "MeshScanStarted"
+#define BT_MESH_SCAN_FINISHED "MeshScanFinished"
+#define BT_MESH_SCAN_RESULT "MeshScanResult"
+#define BT_MESH_AUTHENTICATION_REQ "MeshAuthReq"
+#define BT_MESH_PROVISIONING_RESULT "MeshProvResult"
+#define BT_MESH_NODE_BROWSED "MeshNodeBrowsed"
+#define BT_MESH_NODE_VEND_FEATS "MeshNodeVendorFeatures"
+#define BT_MESH_NODE_KEY_CONFIGURED "MeshNodeKeyConfigured"
+#define BT_MESH_NODE_TTL_CONFIGURED "MeshNodeTTLConfigured"
+#define BT_MESH_MODEL_APPKEY_CONFIGURED "MeshModelAppKeyConfigured"
+#define BT_MESH_MODEL_APPKEY_LIST "MeshModelAppKeyList"
+#define BT_MESH_MODEL_SUB_LIST "MeshModelSubscriptionList"
+#define BT_MESH_MODEL_SUB_CONF "MeshModelSubConfiguration"
+#define BT_MESH_MODEL_VIR_SUB_CONF "MeshModelVirSubConfiguration"
+#define BT_MESH_MODEL_PUB_STATUS "MeshModelPublicationStatus"
+
+#define BT_FEATURE_COMMON "http://tizen.org/feature/network.bluetooth"
+#define BT_FEATURE_OPP "http://tizen.org/feature/network.bluetooth.opp"
+
+struct bluetooth_headed_plugin_t {
+ int (*bt_launch_dpmpopup) (char *mode);
+ int (*bt_launch_system_popup)(int event_type,
+ const char *device_name,
+ const char *remote_address,
+ const unsigned char *auth_info,
+ char *passkey,
+ const char *filename,
+ const char *agent_path);
+ void (*bt_destroy_popup_all)(void);
+ bool (*bt_launch_unable_to_pairing_syspopup)(int result);
+ bool (*bt_is_tethering_enabled)(void);
+ int (*bt_get_mime_type)(char *file_name, char **mime_type);
+};
+
+typedef struct {
+ gboolean plugin_headed_enabled;
+ void *handle_headed;
+ struct bluetooth_headed_plugin_t *headed_plugin;
+} bt_plugin_info_t;
+
+typedef enum {
+ _PROFILE_UNKNOWN = 0,
+ _PROFILE_MOBILE = 0x1,
+ _PROFILE_WEARABLE = 0x2,
+ _PROFILE_TV = 0x4,
+ _PROFILE_IVI = 0x8,
+ _PROFILE_IOT = 0x10,
+ _PROFILE_COMMON = 0x20,
+} tizen_profile_t;
+
+typedef enum {
+ _MODEL_UNKNOWN = 0,
+ _MODEL_COMMON = 0x1,
+ _MODEL_TM1 = 0x2,
+ _MODEL_TM2 = 0x4,
+ _MODEL_TW1 = 0x8,
+ _MODEL_TW2 = 0x10,
+ _MODEL_TW3 = 0x20,
+ _MODEL_RPI3 = 0x40,
+} tizen_model_t;
+
+/* For optimization, make this extern and define in a shared C file */
+extern tizen_profile_t profile;
+static tizen_model_t model = _MODEL_UNKNOWN;
+extern bt_plugin_info_t *headed_plugin_info;
+
+/* Accessing system info */
+int system_info_get_platform_string(const char *key, char **value);
+bool system_info_get_platform_bool(const char *key, bool *value);
+
+void bluetooth_plugin_init();
+void bluetooth_plugin_deinit();
+
+static inline tizen_profile_t get_tizen_profile()
+{
+ char *profileName = NULL;
+
+ if (__builtin_expect(profile != _PROFILE_UNKNOWN, 1))
+ return profile;
+
+ system_info_get_platform_string("http://tizen.org/feature/profile", &profileName);
+
+ /* To pass the checking of g_ir */
+ if (!profileName)
+ return _PROFILE_UNKNOWN;
+
+ switch (*profileName) {
+ case 'm':
+ case 'M':
+ profile = _PROFILE_MOBILE;
+ break;
+ case 'w':
+ case 'W':
+ profile = _PROFILE_WEARABLE;
+ break;
+ case 't':
+ case 'T':
+ profile = _PROFILE_TV;
+ break;
+ case 'i':
+ case 'I':
+ if (!strncasecmp(profileName, "ivi", 3))
+ profile = _PROFILE_IVI;
+ else if (!strncasecmp(profileName, "iot", 3))
+ profile = _PROFILE_IOT;
+ else
+ profile = _PROFILE_COMMON;
+ break;
+ default: // common or unknown ==> ALL ARE COMMON.
+ profile = _PROFILE_COMMON;
+ }
+ free(profileName);
+
+ return profile;
+}
+
+static inline tizen_model_t get_tizen_model(void)
+{
+ char *model_name = NULL;
+
+ if (__builtin_expect(model != _MODEL_UNKNOWN, 1))
+ return model;
+
+ system_info_get_platform_string("http://tizen.org/system/model_name", &model_name);
+
+ if (model_name == NULL) {
+ model = _MODEL_COMMON;
+ return model;
+ }
+
+ if (!strcasecmp(model_name, "TM1"))
+ model = _MODEL_TM1;
+ else if (!strcasecmp(model_name, "TM2"))
+ model = _MODEL_TM2;
+ else if (!strcasecmp(model_name, "TW1"))
+ model = _MODEL_TW1;
+ else if (!strcasecmp(model_name, "TW2"))
+ model = _MODEL_TW2;
+ else if (!strcasecmp(model_name, "TW3"))
+ model = _MODEL_TW3;
+ else if (!strcasecmp(model_name, "rpi3"))
+ model = _MODEL_RPI3;
+ else
+ model = _MODEL_COMMON;
+
+ free(model_name);
+
+ return model;
+}
+
+static inline bool get_tizen_feature_supported(char *feature)
+{
+ bool is_supported = false;
+
+ system_info_get_platform_bool(feature, &is_supported);
+
+ return is_supported ? true : false;
+}
+
+#define TIZEN_PROFILE_WEARABLE (get_tizen_profile() == _PROFILE_WEARABLE)
+#define TIZEN_PROFILE_IVI (get_tizen_profile() == _PROFILE_IVI)
+#define TIZEN_PROFILE_TV (get_tizen_profile() == _PROFILE_TV)
+#define TIZEN_PROFILE_MOBILE (get_tizen_profile() == _PROFILE_MOBILE)
+#define TIZEN_PROFILE_IOT (get_tizen_profile() == _PROFILE_IOT)
+
+#define TIZEN_FEATURE_NETWORK_TETHERING_ENABLE (get_tizen_profile() & (_PROFILE_MOBILE))
+#define TIZEN_FEATURE_TELEPHONY_ENABLED (get_tizen_profile() & (_PROFILE_MOBILE))
+#define TIZEN_FEATURE_FLIGHTMODE_ENABLED (get_tizen_profile() & (_PROFILE_MOBILE | _PROFILE_WEARABLE))
+#define TIZEN_FEATURE_BT_USB_DONGLE ((get_tizen_model()) == _MODEL_COMMON && (get_tizen_profile()) == _PROFILE_TV)
+#define TIZEN_FEATURE_BLUEZ_SPEAKER_REFERENCE ((get_tizen_model()) == _MODEL_RPI3 && (get_tizen_profile()) == _PROFILE_COMMON)
+#define TIZEN_FEATURE_BT_SUPPORTED (get_tizen_feature_supported(BT_FEATURE_COMMON) == true)
+#define TIZEN_FEATURE_OPP_SUPPORTED (get_tizen_feature_supported(BT_FEATURE_OPP) == true)